简述
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