提问者:小点点

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


我有一个问题,当您使用Spring Cloud网关将单节点Docker Swarm与Spring Eureka相结合时,负载平衡是如何工作的。我已经成功配置了一个非Eureka群,可以看到服务副本之间的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对于一个小的单节点群来说可能有点过了,但我觉得随着应用程序的扩展和可能变得更加分布式,它可能是有益的。显然,我想避免负载平衡发生两次的情况。

我假设我可以使用超文本传输协议而不是lb来阻止网关的负载平衡。


共1个答案

匿名用户

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

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

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

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