Eureka 客户端快速感知服务下线的配置
概述
服务调用方访问一个在注册中心不存在服务响应是非常快的;如果访问已经下线的服务并且该服务的信息仍然保留在注册中心,这种访问会长时间的无响应。线下环境我们经常需要频繁重启服务,因此我们需要更快的感知服务下线事件,为了达成这个目标我们需要同时修改 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
无需纠结具体的数值,可以根据情况修改,只需要知道我们的目标是快速感知服务下线,因此我们的配置需要比默认值小。
有问题吗?点此反馈!
温馨提示:反馈需要登录