【问题标题】:Load balancing when Docker Swarm is combined with Spring Cloud Eureka/GatewayDocker Swarm 与 Spring Cloud Eureka/Gateway 结合时的负载均衡
【发布时间】:2021-02-25 10:22:55
【问题描述】:

我有一个关于当您使用 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 来阻止网关进行负载平衡。

【问题讨论】:

  • 所以我想我找到了答案。我找到了我的副本的容器 IP,并更新了网关以路由到其中一个 IP。我 swarm 服务更新了网关服务,然后检查了每个复制服务的日志。只有网关中 IP 的容器被击中。因此我有信心使用 Eureka 不会造成多重负载均衡。

标签: spring docker spring-cloud docker-swarm netflix-eureka


【解决方案1】:

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

但是,对于多节点场景,Docker swarm 具有路由网格功能,基本上不需要发现服务。想象一下,您有多个节点和分布在它们之间的副本。使用 swarm 的路由网格,您甚至不必知道哪些节点正在运行特定的服务。 api 网关可以将传入的请求路由到几乎任何节点,如果该节点恰好缺少请求的服务,它会自动将请求平衡到确实有任务的节点(为正在运行的服务提供的名称)。

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

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

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2019-04-28
    • 2023-02-22
    • 1970-01-01
    • 2018-01-03
    • 2017-05-09
    • 1970-01-01
    • 2017-07-27
    • 2021-12-31
    相关资源
    最近更新 更多