Zuul和Ribbon集成

28

我不太理解Zuul和Ribbon之间的连接。

我认为我已经清楚地了解了Zuul。它是一个反向代理,我可以联系它以访问我的几个服务实例之一。它将使用轮询算法或其他你配置的方式来选择正确的服务器。它是传统的负载均衡器。为了知道可用的实例,它可以使用像Eureka这样的注册表。

但是我对Ribbon有更多的疑问。它被称为客户端负载平衡器,但这是什么意思?它不需要外部服务器吗?Ribbon被嵌入到客户端中,就像Eureka客户端一样吗?如果是这样,它是如何工作的?当我使用Ribbon时,是否需要Zuul,反之亦然?

在一些文章中,我看到实际上Zuul默认使用Ribbon进行负载平衡,这让我更加困惑。如果这是真的,"客户端"是什么意思?除路由以外,Zuul还做了什么?

希望你能帮助我。

1个回答

43

客户端和服务器始终是相对的。Zuul 是您服务实例的客户端,而您的服务实例则是 Zuul 的服务器。

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

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

如您所知,Ribbon 是一个客户端负载均衡器模块,并已集成到许多 http 客户端模块中。例如,Feign 和 Load-balanced RestTemplate 支持 Ribbon。也就是说,当与 Ribbon 一起使用时,Feign 和 Load-balanced RestTemplate 可以从给定列表或 Eureka 中的列表中选择一个服务器。

关于 Zuul,有一个 RibbonRoutingFilter,它将您的请求路由到实际的服务实例。 RibbonRoutingFilter 使用 Ribbon 从配置或 Eureka 给定的列表中选择一个服务器。因此,如果您想将 Zuul 用作负载均衡的反向代理,Zuul 需要 Ribbon。


那么我的理解是正确的吗?也就是说,为了使Zuul在服务的Eureka注册运行实例之间进行负载均衡,你只需要在Zuul服务器的application.properties文件中包含eureka.client.serviceUrl.defaultZone属性,是这样吗? - xpz
你可以在不需要提及它的情况下使用ribbon,因为ribbon已经包含在zuul中。 - xpz
@xpz:是的,你说得对。当你在pom.xml或gradle.build文件中有Zuul时,Ribbon就是一个传递性依赖项。当你运行下面的命令时,你会看到Ribbon被添加了。Maven: mvn dependency:treeGradle: gradle dependencies - Andy

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