本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。
SpringCloud 优化
1) Eureka Server 优化
1.1) 自我保护
有两个 EurekaClient 集群, A 集群服务量 10, B 集群服务量 1000.
A B 集群中各有 3 台机器失去心跳.
A 集群服务少网络抖动概率相对少, 自我保护可能把宕机节点保护下来导致服务不可用;
B 集群大, 保护阈值高, 一般不会出现大量服务宕机, 且由于集群大网络抖动概率大, 建议开启.
总结:
- 服务少关闭自我保护
- 服务多开启自我保护
eureka: server: enable-self-preservation: false # 关闭自我保护 renewal-parcent-thresshold: 0.85 # 自我保护阈值 eviction-interval-timer-in-ms: 1000 # 剔除服务时间间隔 use-read-only-response-cache: false # 关闭三层缓存 response-cache-update-interval-ms: 1000 # 设置 readWrite 和 readOnly 同步时间间隔
1.2) 服务下线监控
阅读 EurekaServer
源码可得知, 发生服务下线时, 会发送 EurekaInstanceCanceledEvent
事件, 我们可以监听这个 Spring
事件, 来发送做一些处理(如发邮件)
1.3) Eureka 三级缓存
这块具体可以参考 com.netflix.eureka.registry.ResponseCacheImpl
的源码.
- register(ConcurrentHashMap)
- readWriteCacheMap(Guava LoadingCache)
- readOnlyCacheMap(ConcurrentHashMap)
注册流程:
client
发起注册请求时, 首先注册至register
, 让readWriteCacheMap
二级缓存失效Timmer
定时器任务每隔response-cache-update-interval-ms
毫秒, 三级缓存从二级缓存中更新已存在的数据, 如为二级缓存失效状态, 触发 guava 回调从同步register
Get 服务流程:
- 从三级缓存找, 找不到就从二级缓存取并更新, 若二级缓存失效, 则触发 Guava 回调从一级缓存同步.