为什么会存在订阅者?
因为存在某些需求,我的服务不想注册到服务发现中心去,我只是想安安静静的做一个索取者,我只想获取可以调用的服务而已
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 | (value = "/list", method = RequestMethod.GET) |
这里其实是对请求进行参数的一些提取操作,最终的执行方法是在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 { |