服务变动事件发布机制及源码剖析
在上边有讲到一个Nacos Server端的接口/nacos/v1/ns/instance/list,这个接口是用来根据serviceName来拉取Instace的接口,并且客户端会定时的去拉取,如果Service中的Instance发生了变化,那么在调用这个接口的时候就能感知到,但是这个感知会有延迟,默认的拉取频率为10s,Nacos在一些细节的上也做了一些良好的设计,Nacos Client并不是完全依赖这个定时任务来感知Service的变化,为了尽量的去弥补这个延迟问题,采用一个UDP的变更通知设计,这客户端调用/nacos/v1/ns/instance/list接口的时候会传入一个UDP的port,在接口中会把Service订阅的其他Service加入到一个com.alibaba.nacos.naming.push.PushService#clientMap中去,如果Service中的Instance发生了变化,取出订阅了此实例的客户端列表,并通过UDP的方式进行通知。
源码如下:
// com.alibaba.nacos.naming.controllers.InstanceController#doSrvIpxt
// 在客户端调用/nacos/v1/ns/instance/list接口的时候,会执行到该方法
public ObjectNode doSrvIpxt(String namespaceId, String serviceName, String agent, String clusters, String clientIP,
int udpPort, String env, boolean isCheck, String app, String tid, boolean healthyOnly) t