spring cloud与nacos集成,各自获取服务和刷新服务机制
# 一、ribbon
# ribbon获取服务
- 从上图可知,缓存的服务列表在
BaseLoadBalancer
的allServerList
中,如果缓存为空,则没有服务
# ribbon服务列表刷新
- 从上图可知,ribbon刷新服务默认时间为30s,即每30s拉取一次服务列表
- 刷新时间可设置通过:
ribbon.ServerListRefreshInterval
或{serverName}.ribbon.ServerListRefreshInterval
- 可以更换
ZoneAvaidanceRule
为NacosRule
避免ribbon
的 30s 延时问题
# 二、nacos
# nacos获取服务
- 从上图可知,缓存的服务列表在
HostReactor
的serviceInfoMap
对象中,如果没有则从服务端获取 - 如果没有时:会建立 UDP 连接,获取服务端服务列表的实时更新;创建轮询任务更新
# nacos刷新服务
- 从上图可知,nacos 客户端通过UDP实时更新服务列表;轮询延时更新服务列表,正常情况下延时 10s
# 总结
- 极端情况下,
nacos server
宕机,感知服务状态变更需要 30s (ribbon) + ∞ (nacos) 的延时;nacos server
不宕机,感知服务状态变更需要 30s (ribbon) + 10s (nacos) 的延时 - 由于
ZoneAvoidanceRule
规则对获取到的最新服务做了 区域亲和性、可用性 检查,可忽略,则可以使用NacosRule
将其代替