Eureka 客户端快速感知服务下线的配置

Last Modified: 2023/01/01

概述

服务调用方访问一个在注册中心不存在服务响应是非常快的;如果访问已经下线的服务并且该服务的信息仍然保留在注册中心,这种访问会长时间的无响应。线下环境我们经常需要频繁重启服务,因此我们需要更快的感知服务下线事件,为了达成这个目标我们需要同时修改 Eureka Server 端的配置,以及服务调用方和服务提供方的配置。

修改 Eureka Server 配置

eureka:
  server:
    # 关闭自我保护
    enable-self-preservation: false
    # 默认检查服务是否在线的间隔为 60s,由于我们需要快速感知,因此缩短时间间隔为 6s
    eviction-interval-timer-in-ms: 6000

Eureka Server 在运行期间会统计一分钟内心跳数量并和期望值比较,如果低于期望值,Eureka Server 会将这些实例保护起来,并不再移除这些实例(即进入保护模式),即便这些实例中有某些实例已经挂了。我们的目标尽快移除下线的服务,因此我们这里需要关闭保护模式。

其中一分钟期望收到的心跳数量的计算方法对应的源码如下:

protected void updateRenewsPerMinThreshold() {
        this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews
                * (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())
                * serverConfig.getRenewalPercentThreshold());
    }

expectedNumberOfClientsSendingRenews 是注册的服务数量,getExpectedClientRenewalIntervalSeconds() 默认值为 30s,getRenewalPercentThreshold() 默认值为 0.85。

修改服务调用方和服务提供方的配置

注:这里只是给出需要添加或者修改的配置,其他配置未列出。

eureka:
  instance:
    # 发送心跳间隔减小到 10s,默认值为30s
    lease-renewal-interval-in-seconds: 10
    # 服务续约到期时间减小到30s,该配置项默认值为 90s
    lease-expiration-duration-in-seconds: 30
  client:
    fetch-registry: true
    # 将获取服务列表的时间减小到 10s
    registry-fetch-interval-seconds: 10

无需纠结具体的数值,可以根据情况修改,只需要知道我们的目标是快速感知服务下线,因此我们的配置需要比默认值小。

有问题吗?点此反馈!

温馨提示:反馈需要登录