【问题标题】:Spring Boot health-based load balancingSpring Boot 基于健康的负载均衡
【发布时间】:2017-03-24 09:01:20
【问题描述】:

我将 Spring Boot 用于微服务,但遇到了负载平衡问题。

Spring Actuator 向应用程序添加了特殊的healthmetrics 端点;这样,就可以从正在运行的实例中获取一些基本信息。

我想做的是创建一个(反向)代理(例如,使用 Zuul 和/或 Ribbon?),它创建一个集中式负载均衡器,根据它们的健康状态选择实例。

例如,我有以下微服务

  • client
  • proxy (
  • server 1
  • server 2

当客户端向代理发送 http 请求时,代理应该能够决定哪个服务器实例的负载最小,并将请求转发给那个。

有没有简单的方法可以做到这一点?

谢谢, 克丽丝

【问题讨论】:

  • 这完全取决于您要拆分的负载类型。如果它纯粹是基于请求的负载,为什么不将流量分成 50/50,如果服务器都启动了呢?否则,您可以扩展 health 端点以累积随时间的负载,并在负载均衡器中使用该数据来决定将流量发送到何处
  • 我想根据服务器的当前负载因子(例如CPU)进行平衡,而不是请求的数量(所以基本上不是基于请求的)

标签: spring-boot spring-boot-actuator


【解决方案1】:

如果您想对各种负载数据做出选择,您可以实现自定义HealthIndicators,它会累积某种“随时间推移的负载”数据,在您的负载均衡器中使用它来决定将流量发送到哪里。

所有自定义健康指标将由 spring-boot 拾取,并在执行器 /health 端点上调用。

@Component
class LoadIndicator implements HealthIndicator {

    @Override
    Health health() {
        def loadData = ... do stuff to gather whatever load
        return Health.up()
                        .withDetail("load", loadData)
                        .build();
    }

}

也许您已经可以使用一些 spring-boots 指标了,执行器中有多个端点。 /beans、/trace、/metrics。应该也可以在您的应用程序中找到该数据。

【讨论】:

  • 是的,我想要类似的东西——我不知道,如何在负载均衡中访问这种负载数据(我实际上可以将一些 REST 请求在均衡到服务器中)手动”,但也许 Spring 确实提供了某种帮助(例如,为每个客户端注入健康对象?)
  • 我使用过的负载均衡器,我自己没有实现,但通常会发出一个 http 请求,检查状态代码(2xx、4xx、5xx)以确定主机是否健康或不是。如果您自己实现,您可能会查看实际的响应数据来确定主机是否健康,以及它处于什么样的负载之下。
  • 是的,这是我的计划 :-) 我只是不知道,如果 Spring 有某种内置功能可以访问主机的健康状况,或者是什么,我必须这样做“手动”
  • 查看/metrics 端点,它返回诸如内存、空闲内存、正常运行时间、系统负载平均值等数据。以github.com/spring-projects/spring-boot/blob/v1.4.2.RELEASE/… 为例
  • 你说得对;这个端点比健康更适合我的需求 - 更新了我的问题(但是,我仍然不知道如何从代理访问这些信息)
猜你喜欢
  • 2021-04-20
  • 2020-01-12
  • 2016-01-03
  • 2013-04-11
  • 2017-01-10
  • 2016-08-05
  • 2021-08-14
  • 2019-08-27
  • 1970-01-01
相关资源
最近更新 更多