17°

Spring Cloud Eureka如何解决服务上下线延时过长问题

简述

1.降低延迟时间

    1)中小型的项目建议关闭自我保护(eureka.server.enableSelfPreservation=false)

    2)清理无效节点的时间间隔(evictionIntervalTimerInMs=5000)

    3)降低心跳间隔(客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒,LeaseRenewalIntervalInSeconds)

    4)降低无效判断时间(Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒,leaseExpirationDurationInSeconds)

    5)禁用Eureka的ReadOnlyMap缓存,解决eureka 的双缓存问题

    6)降低ribbon缓存时间

2.增加重试机制

方法:

在网关、Fegin或者Ribbon上面添加请求重试机制

最好使用Ribbon来实现,让它重试其它节点

优化后的配置:

server端

## 禁用readOnlyCacheMap
eureka.server. useReadOnlyResponseCache=false
## 中小规模下,自我保护模式坑比好处多,所以关闭它
eureka.server.enableSelfPreservation=false
## 主动失效检测间隔,配置成5秒
eureka.server.evictionIntervalTimerInMs=5000
## 心跳间隔,5秒
eureka.instance.leaseRenewalIntervalInSeconds=5
## 没有心跳的淘汰时间
eureka.instance.leaseExpirationDurationInSeconds=10

client端

## 心跳间隔,5秒
eureka.instance.leaseRenewalIntervalInSeconds=5
## 没有心跳的淘汰时间,10秒
eureka.instance.leaseExpirationDurationInSeconds=10
# 定时刷新本地缓存时间
eureka.client.registryFetchIntervalSeconds=5
# ribbon缓存时间
ribbon.ServerListRefreshInterval=2000

参考 Eureka 参数配置详解:

https://www.cnblogs.com/fangfuhai/p/7070325.html

说明:

正常上线下线客户端最大感知时间:

eureka.client.registryFetchIntervalSeconds+ribbon. ServerListRefreshInterval 

异常下线客户端最大感知时间:

2*eureka.instance.leaseExpirationDurationInSeconds+eureka.server.evictionIntervalTimerInMs+eureka.client.registryFetchIntervalSeconds+ribbon. ServerListRefreshInterval 

总结:如果对上下线感知要求比较严格,可以考虑换一个(zookeeper或者nacos等)或者自研

附加知识点:使用kill命令优雅关闭微服务, 解决退出时Eureka取消注册操作耗时过长的坑

https://www.jianshu.com/p/c57d186eb454

本文由【小海bug】发布于开源中国,原文链接:https://my.oschina.net/haitaohu/blog/3136135

全部评论: 0

    我有话说: