为什么会存在订阅者?
因为存在某些需求,我的服务不想注册到服务发现中心去,我只是想安安静静的做一个索取者,我只想获取可以调用的服务而已
nacos是如何知道哪些客户端订阅了服务的
在nacos-client中,如果要获取服务实例,那么会调用这个方法
1 | // String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly) |
在这个方法中看到了一个参数udpPort
,等等会用到;这个方法最终调用的HTTP-URL为/v1/ns/instance/list
,接着去看nacos-naming-server
对应的该controller
做了什么事情
1 | "/list", method = RequestMethod.GET) (value = |
这里其实是对请求进行参数的一些提取操作,最终的执行方法是在doSrvIPXT
,这里只截取部分代码(关于nacos是如何存储订阅者的)
1 | public JSONObject doSrvIPXT(String namespaceId, String serviceName, String agent, String clusters, String clientIP, int udpPort, String env, boolean isCheck, String app, String tid, boolean healthyOnly) throws Exception { |
此处可以看到PushService
会进行判断是否允许执行主动下推消息到客户端以及客户端对应的UDP PORT
是否合法,如果合法的话进行创建对应的PushClient
对象
1 | PushClient client = new PushService.PushClient(namespaceId, |
到这里,nacos server
就将订阅了服务的Client
信息都存储起来了。现在来看看在哪些情况下nacos-server
会主动推送消息到PushClient
更新Instance实例健康信息时
1 |
|
在心跳任务中穿插主动消息下发
1 | public class ClientBeatCheckTask implements Runnable { |
实例健康检查 HealthCheckCommon
1 | public void checkOK(Instance ip, HealthCheckTask task, String msg) { |
Service的onChange事件
1 | public void onChange(String key, Instances value) throws Exception { |
以上的方法,在某些条件下都会触发nacos server
的主动推送消息到订阅者,当这些事件发生时,调用了serviceChangde
将订阅者所感兴趣的服务信息数据主动推送
1 | // 当服务端数据存在变动时, |
Nacos Client接收到推送的信息做了什么
nacos client
对应的接收nacos server
的UDP
主动信息下发的实现在com.alibaba.nacos.client.naming.core.PushReceiver
中
1 | public class PushReceiver implements Runnable { |