Spring cloud Nacos 服务列表获取与刷新

2022/7/5 nacosjavaspring

spring cloud与nacos集成,各自获取服务和刷新服务机制

# 一、ribbon

# ribbon获取服务

ribbon获取服务

  • 从上图可知,缓存的服务列表在 BaseLoadBalancerallServerList 中,如果缓存为空,则没有服务

# ribbon服务列表刷新

ribbon-server-refresh

  • 从上图可知,ribbon刷新服务默认时间为30s,即每30s拉取一次服务列表
  • 刷新时间可设置通过:ribbon.ServerListRefreshInterval{serverName}.ribbon.ServerListRefreshInterval
  • 可以更换 ZoneAvaidanceRuleNacosRule 避免 ribbon30s 延时问题

# 二、nacos

# nacos获取服务

nacos-server

  • 从上图可知,缓存的服务列表在 HostReactorserviceInfoMap 对象中,如果没有则从服务端获取
  • 如果没有时:会建立 UDP 连接,获取服务端服务列表的实时更新;创建轮询任务更新

# nacos刷新服务

nacos-server-refresh

  • 从上图可知,nacos 客户端通过UDP实时更新服务列表;轮询延时更新服务列表,正常情况下延时 10s

# 总结

  1. 极端情况下,nacos server 宕机,感知服务状态变更需要 30s (ribbon) + (nacos) 的延时;nacos server不宕机,感知服务状态变更需要 30s (ribbon) + 10s (nacos) 的延时
  2. 由于 ZoneAvoidanceRule 规则对获取到的最新服务做了 区域亲和性可用性 检查,可忽略,则可以使用 NacosRule 将其代替