Nacos源码7:消费者动态感知服务实例

5 阅读1分钟

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缓存中存在实例信息,所以可以从本地获取最新服务实例并返回。