本文采用知识共享 署名-相同方式共享 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)

注册流程:

  1. client 发起注册请求时, 首先注册至 register, readWriteCacheMap 二级缓存失效
  2. Timmer 定时器任务每隔 response-cache-update-interval-ms 毫秒, 三级缓存从二级缓存中更新已存在的数据, 如为二级缓存失效状态, 触发 guava 回调从同步 register

Get 服务流程:

  1. 从三级缓存找, 找不到就从二级缓存取并更新, 若二级缓存失效, 则触发 Guava 回调从一级缓存同步.