Zuul 和 Ribbon 集成

Posted

技术标签:

【中文标题】Zuul 和 Ribbon 集成【英文标题】:Zuul and Ribbon integration 【发布时间】:2017-09-18 04:19:21 【问题描述】:

我无法理解 Zuul 和 Ribbon 之间的联系。

我想我明白 Zuul 了。这是一个反向代理,我可以联系它来访问我的几个服务实例之一。它将使用循环算法或您配置它执行的任何操作来选择正确的服务器。这是一个传统的负载均衡器。要知道可用的实例,它可以使用像 Eureka 这样的注册表。

但是我在使用 Ribbon 时遇到了更多麻烦。它作为客户端负载均衡器出售,但这意味着什么?它不需要外部服务器吗?功能区嵌入到客户端中的方式与 Eureka 客户端相同吗?如果是这样,它是如何工作的?使用 Ribbon 时是否需要 Zuul,反之亦然?

在一些文章中,我看到实际上Zuul默认使用Ribbon作为负载均衡部分,这让我更加困惑。如果这是真的,“客户端”是什么意思? Zuul 除了路由还能做什么?

我希望你能帮助我。

【问题讨论】:

【参考方案1】:

客户端和服务器总是相对的。 Zuul 是您的服务实例的客户端,您的服务实例是 Zuul 的服务器。

当我们使用传统的负载均衡器(服务器端负载均衡器)时,API 调用者(客户端)只知道一个负载均衡器端点,而客户端不知道服务器列表。负载均衡器从列表中选择一个服务器。

当我们使用像 Ribbon 这样的客户端负载均衡器时,API 调用者(客户端)应该知道服务器列表并从列表中选择其中一个。这就是我们称之为客户端负载均衡器的原因。

如您所知,Ribbon 是一个客户端负载均衡器模块,并集成到许多 http 客户端模块中。例如,Feign 和负载均衡的 RestTemplate 支持 Ribbon。即 Feign 和负载平衡的 RestTemplate 可以从给定的列表中选择一个服务器,或者在与功能区一起使用时从 eureka 的列表中选择一个服务器。

关于 Zuul,有一个 RibbonRoutingFilter 将您的请求路由到实际的服务实例。 RibbonRoutingFilter 正在使用 Ribbon 从您的配置或 Eureka 提供的列表中选择服务器。所以如果你想使用 Zuul 作为负载均衡的反向代理,Zuul 需要 Ribbon。

【讨论】:

所以我是否正确地说,为了让 zuul 在 eureka 注册的服务运行实例之间进行负载平衡,您需要做的就是让 zuul-server application.properties 文件包含 eureka。 client.serviceUrl.defaultZone 属性? 即您使用功能区甚至不需要提及它,因为功能区捆绑在 zuul 内部? @xpz:是的,你是对的。当您的 pom.xml 或 gradle.build 文件中有 Zuul 时,Ribbon 是一个传递依赖项。当你运行下面的命令时,你会看到 Ribbon 被添加 Maven: mvn dependency:tree Gradle: gradle dependencies

以上是关于Zuul 和 Ribbon 集成的主要内容,如果未能解决你的问题,请参考以下文章

Zuul/Ribbon/Hystrix 不在不同的实例上重试

zuul搭配ribbon和hystrix路由重试机制以及参数配置

Netflix Zuul/Ribbon/Eureka 与 AWS ELB/ALB 和 ECS

springcloud之负载均衡

Spring Cloud微服务Ribbon负载均衡/Zuul网关使用

负载平衡 (ribbon) 和路由 (zuul) Spring REST API (Spring Data JPA) 请求到同一服务的多个副本