Spring Boot - 不同的系统(eureka,zuul,ribbon,nginx)用于什么?

52

我一直在使用 spring,现在想要学习 spring boot 和微服务。我了解什么是 微服务 以及它的工作原理。在阅读文档时,我看到了许多与 spring boot 开发 微服务 相关的东西,但是我非常困惑。

我列出了以下系统和问题:

  1. Netflix Eureka - 我知道这是一个服务发现平台。 所有的 服务 都会注册到 eureka 服务器上,而所有的 微服务 都是 eureka 客户端。我的疑问是,在没有API网关的情况下,这个服务注册表有什么用途?我想了解服务注册表的实际用途。
  2. ZUULApi 网关- 我了解 ZUUL 可以用作 API 网关,它基本上是一个负载均衡器,调用对应于请求 URL 的适当 微服务。这个假设是正确的吗?API 网关会与 Eureka 进行交互以获取适当的微服务吗?

  • NGINX - 我读过 NGINX 还可以用作 API 网关?这可能吗?还有我在其他地方读到像 NGINX 可以用作服务注册表,作为 Eureka 的替代品!那么哪个是正确的?API 网关、服务注册表还是两者都可以?我知道 nginx 是一个 Web 服务器,并且反向代理可以强大配置。

  • AWS api gateway - 这也可以用作 ZUUL 的替代品吗?

  • RIBBON - ribbon 用于什么?我不明白!

  • AWS ALB- 这也可以用于负载均衡。因此,如果我们拥有 AWS ALB,我们是否还需要 ZUUL?


  • 我在Udemy上发现了这门课程,Spring微服务深入使用领域驱动设计非常有用。它讨论了各种方法、设计模式和技术(如Eureka、Ribbon、Hystrix等)。 - dorriz
    3个回答

    46
    没有API网关,服务注册中心还有用吗?
    有用。例如,您可以使用它来定位所有微服务的IP和端口。这对DevOps类型的工作非常方便。例如,在我曾经工作过的一个项目中,我们使用Eureka查找我们所有微服务的所有实例,并为它们的状态(/health, /info)进行ping测试。
    我知道ZUUL可以用作API网关,它基本上是一个负载均衡器,调用相应的微服务以响应请求URL。那个假设正确吗?
    是的,但它可以做更多的事情。基本上,因为Zuul更像是一个您将其转化为微服务的框架/库,您可以编写代码实现任何类别的路由逻辑。在这种意义下,它非常强大。例如,假设您想根据时间或任何其他外部因素更改路由方式,使用Zuul即可轻松实现。
    API网关是否会与Eureka交互以获取适当的微服务?
    是的。您可以配置Zuul指向Eureka。它成为Eureka的客户端,甚至订阅Eureka以获取实时更新(哪些实例已加入或退出)。Ribbon is used as a client-side load balancer for microservices.

    虽然你可以直接使用Ribbon库,但大多数情况下请将其视为Zuul的内部依赖项。它有助于Zuul进行其简单的负载均衡。请注意,该项目处于维护模式,不再推荐使用。

    这也可以用于负载均衡。那么如果我们有AWS ALB,还需要ZUUL吗?

    你可以使用ALB与ECS(弹性容器服务)一起替换Eureka/Zuul。ECS会负责服务发现,并将特定服务的所有实例映射到目标组。您的ALB路由表可以根据简单的路由规则路由到目标组。尽管ALB中的路由规则非常简单,但随着时间的推移正在不断改进。


    1
    感谢您的回答。我有一个小疑问。所以我可以使用NGINX作为API网关,但我们仍然需要EUREKA进行服务发现,对吗?如果是这种情况,NGINX是否有任何与EUREKA交互的方式?由于ZUUL和EUREKA是由Netflix开发的,显然之间会有一个通道。那么NGINX呢? - Vipin CP
    2
    关于服务发现和Nginx,请查看此文章:https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/它提到了Eureka和其他选项,可以用于服务发现,这是Nginx本身缺少的。 - Jose Martinez
    一个问题。如果Nginx可以用于负载均衡,为什么人们还要在同一技术栈中使用Ribbon? - theprogrammer
    希望你现在已经得到答案了。如果没有的话—— Ribbon是一个客户端负载均衡器。我的意思是,Ribbon坐落在每个组件/微服务中的一部分。当一个微服务与另一个微服务通信时,它使用Ribbon作为负载均衡器。Ribbon在服务器启动时和定期间隔从Eureka获取有关所有微服务的信息。 - vasu

    39

    可以使用不同的系统来实现 微服务,其中包括Spring Boot:

    1. Eureka: 可能是最早的微服务之一。Eureka是一个服务注册中心,意味着它知道哪些微服务正在运行以及在哪个端口上。Eureka作为一个独立的应用程序部署,我们可以在@SpringBootApplication注解中使用@EnableEurekaServer注解将该应用程序变成一个Eureka服务器。因此,我们的Eureka服务注册中心已经启动并运行。从现在开始,所有部署的微服务都将使用@SpringBootApplication注解和@EnableDiscoveryClient注解在该Eureka服务器中进行注册。

    2. Zuul:ZUUL是一个负载均衡器、路由应用和反向代理服务器。在使用apache反向代理之前,现在我们可以为微服务使用ZUUL。优点是,我们可以通过ZUUL以编程方式设置配置,例如如果/cutomer/*进入,则转发到相应的微服务。此外,ZUUL还可以作为负载均衡器,在轮询方式下选择适当的微服务。那么ZUUL如何知道微服务的详细信息呢?答案是eureka。它将与eureka一起工作以获取微服务细节。实际上,这个ZUUL也是一个Eureka客户端,我们应该使用`@EnableDiscoveryClient`标记,这就是这两个应用程序(Eureka和Zuul)之间的关联。

    3. Ribbon: Ribbon用于负载均衡。这已经在ZUUL中可用,其中ZUUL使用Ribbon进行负载平衡。在属性文件中,微服务由服务名称标识。如果我们在不同端口上运行一个微服务的2个实例,这将被eureka识别,并且随着Ribbon(在zuul内部)的请求将以平衡的方式进行重定向。

    4. Aws ALB、NGINX、AWS Api gateway 等等:这些都有替代方案。AWS 有自己的负载均衡器、服务发现、API 网关等等。不仅 AWS,像 Azure 这样的云平台也有这些功能。具体使用哪个取决于情况。

    5. 还有一个通用问题:微服务之间如何通信:可以使用 ResttemplateFeignclient 调用实际的 REST API,或者使用消息队列,例如 Rabbit MQ


    2
    注意RestTemplate:从5.0版本开始,该类处于维护模式,只接受少量请求进行更改和修复。请考虑使用org.springframework.web.reactive.client.WebClient,它具有更现代的API并支持同步、异步和流式场景。https://docs.spring.io/spring-framework/docs/current/javadoc-api/index.html?org/springframework/web/client/RestTemplate.html - Harsh
    1
    在 eureka 的 github 页面上,他们说它也可以用于负载均衡。那么,在这种情况下,你知道为什么 Spring Cloud 还有另一个依赖项,比如 Ribbon 或 Zuul 吗?顺便提一下,这是链接:https://github.com/Netflix/eureka - theprogrammer

    8

    Eureka可以与NGINX结合使用,这将形成非常强大的组合。

    我在AWS EC2环境中使用它。以前,我使用的是Spring Cloud Gateway,之前是Zuul,而不是NGINX。根据负载,Spring Cloud Gateway在AWS t3.mediumt3.large实例上运行。切换到NGINX后,我使用了t3.micro(内存少8倍)实例。我几乎可以肯定地做到这一点,并使用t3.nano(内存少16倍)实例,但我想确保不会有任何意外情况。

    以下是为将NGINX插入Eureka生态系统所需执行的高级步骤。更多详细信息,请参阅NGINX With Eureka Instead of Spring Cloud Gateway or Zuul文章。

    • 创建一个服务,可以从Eureka读取所有应用程序的配置,并将其“转换”为NGINX配置。
    • 创建一个cronjob条目,该条目在特定时间间隔内从上述服务中读取配置,并调用NGINX热重载
    • NGINX将使用从服务和cronjob生成的配置,并将作为API网关工作。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接