文章目录
Spring Cloud 版本
Spring Cloud 目前选用的是官方推荐的最新稳定版本:2020.0.1
注册中心
首先我们选用的注册中心是Zookeeper
,和Eureka
不同的是Spring Cloud Zookeeper
客户端获取服务信息客户端本地是没有缓存的,每次都需要去Zookeeper
拉取节点信息。相关源码如下
所以存的问题是:
- 每次服务调用都会去Zookeeper获取节点信息对Zookeeper的压力较大
- 如果Zookeeper集群宕机将导致服务之间的调用不可用,严重影响高可用
所以从这里来看CP型的Zookeeper
并不是特别适合作注册中心
Spring Cloud LoadBalancer 负载均衡器新的选择
在2019年7月3日,在Hoxton.M1
的发布会上,Spring
已经宣布用Spring Cloud LoadBalancer
来代替 Netfix Ribbon
了
缓存问题
Spring Cloud LoadBalancer
在获取服务列表时候默认是有缓存的,并且缓存时间为 35s
由于我们使用了 com.github.ben-manes.caffeine:caffeine
缓存依赖,所以我们 Spring Cloud LoadBalancer
缓存所以使用的缓存管理器也变成了 CaffeineBasedLoadBalancerCacheManager
导致的问题就是如果我们系统上下线的时候,服务列表可能缓存的是旧列表。导致服务调用报错,影响服务可用
解决方式
权衡利弊
最简单的方式是禁用掉Spring Cloud LoadBalancer
的本地缓存,禁用方式也很简单,只需要加如下配置
spring:
cloud:
loadbalancer:
cache:
enabled: false
禁用导致的问题也如上面所说:
- Zookeeper挂掉服务调用完全不可用
- 对Zookeeper的压力较大,每次都需要去Zookeeper获取节点信息
对于测试环境我们可以完全禁用
对于正式环境我们可以修改为2s左右的缓存
spring:
cloud:
loadbalancer:
cache:
ttl: 2
总结
目前算是简单的优化了Spring Cloud LoadBalancer
的客户端缓存时间,需要平滑处理服务上下线问题还是有很多优化空间的,后续会继续优化。