Docker Swarm与Spring Cloud Eureka/Gateway结合时的负载平衡



当您使用Spring Cloud网关将单节点Docker Swarm与Spring Eureka相结合时,我有一个关于负载平衡如何工作的问题。我已经成功地配置了一个非Eureka swarm,并且可以看到swarm在服务的副本之间的负载平衡:

Cloud Gateway route config    
.route(r -> r.path("/api/**")
.uri("http://my-service:8081")
.id("my-service"))

如果我将其配置为使用Eureka,我现在有了这个:

.route(r -> r.path("/api/**")
.uri("lb://MY-SERVICE")
.id("my-service"))

我相信我的假设是正确的,网关会相应地知道IP/端口和负载平衡,但是当请求命中时,IP会蜂拥而至,然后决定在副本之间进行负载平衡?

我理解Eureka对于一个小型单节点群来说可能有些过头了,但随着应用程序的扩展,可能会变得更加分布式,我觉得这可能是有益的。显然,我想避免出现两次负载平衡的情况。

我想我可以使用http而不是lb来停止网关的负载平衡。

eureka发现服务将为api网关提供给定服务的所有可用地址。在eureka中注册的每个服务都将有一个唯一的(容器(IP和端口,如果api网关被配置为负载平衡请求,那么是的,将使用服务的每个副本,swarm不需要做任何负载平衡的事情,因为你的目标是特定的运行服务(任务(,而不是节点。

然而,对于多节点场景,Docker swarm具有路由网格功能,基本上不需要发现服务。假设您有多个节点和分布在它们之间的复制副本。使用swarm的路由网格,您甚至不必知道哪些节点有特定的服务在运行。api网关可以将传入的请求路由到任何节点,如果该节点恰好缺少请求的服务,它将自动将请求平衡到有任务的节点(为正在运行的服务指定的名称(。

因此,这意味着负载均衡器不需要任何类型的发现服务(如Eureka(来平衡对特定容器的IP或节点的请求,它可以简单地循环所有可用节点,仅此而已

对于具有副本的服务之间的内部请求,swarm还提供了负载平衡功能。

最新更新