1.概述
当Nacos服务端基于udp协议推送变更之后的服务实例给消费者之后,消费者需要接收到这些实例。所以接下来我们看看,消费者接收变更之后的服务实例是怎样的过程。
2.消费者接收变更之后的实例
PushReceiver线程在消费者启动的时候就会启动运行,在run方法中是具体的运行执行的逻辑:
public class PushReceiver implements Runnable, Closeable {
...
@Override
public void run() {
while (!closed) {
try {
// 从Nacos服务端接收udp协议推送的变更之后的实例
byte[] buffer = new byte[UDP_MSS];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
udpSocket.receive(packet);
String json = new String(IoUtils.tryDecompress(packet.getData()), UTF_8).trim();
NAMING_LOGGER.info("received push data: " + json + " from " + packet.getAddress().toString());
PushPacket pushPacket = JacksonUtils.toObj(json, PushPacket.class);
...
// 缓存实例
hostReactor.processServiceJson(pushPacket.data);
}
}
}
-
从Nacos服务端接收udp协议推送的变更之后的实例
-
缓存实例
3.消费端本地缓存最新服务实例
HostReactor.processServiceJson:
public ServiceInfo processServiceJson(String json) {
// json解析为ServiceInfo对象
ServiceInfo serviceInfo = JacksonUtils.toObj(json, ServiceInfo.class);
...
// 缓存最新服务实例到serviceInfoMap缓存中
serviceInfoMap.put(serviceInfo.getKey(), serviceInfo);
...
}
主要是缓存最新服务实例到serviceInfoMap缓存中。
然后,Nacos消费者获取服务实例时,会首先在本地从HostReactor的serviceInfoMap缓存中获取实例信息,如果本地缓存没有,才会调用Nacos服务端获取实例的api接口获取。
这块详细见之前《Nacos服务发现基本原理》章节的1.6 HostReactor获取service实例小节,有消费端从本地的serviceInfoMap缓存中获取实例信息的详细介绍。
显然,由于serviceInfoMap缓存中存在实例信息,所以可以从本地获取最新服务实例并返回。