7nacos注册中心之服务地址动态感知

362 阅读1分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

7 nacos注册中心之服务地址动态感知

服务消费者不仅需要获得服务提供者的地址列表,还需要在服务实例出现异常时监听服务地址的变化。

首先怎么实现服务的监听呢?有两种方式来实现服务的监听。

实现监听

调用subscribe方法

通过调用subscribe方法实现监听,serviceName为服务名,EventListener为监听到的事件。

NamingService接口中的subscribe方法:

void subscribe(String serviceName, EventListener listener) throws NacosException;

具体调用方式如下:

NamingService naming2 = NamingFactory.createNamingService("127.0.0.1" + ":" + port);

naming2.subscribe(serviceName, new EventListener() {
    @Override
    public void onEvent(Event event) {
        System.out.println(((NamingEvent) event).getServiceName());
        System.out.println(((NamingEvent) event).getInstances());
        instances = ((NamingEvent) event).getInstances();
    }
});

调用selectInstances方法

NamingService接口中的selectInstances方法:

List<Instance> selectInstances(String serviceName, String groupName, List<String> clusters, boolean healthy, boolean subscribe) throws NacosException;

如果subscribe为true,会自动注册监听。

selectInstances(serviceName, clusters, healthy, true)

服务动态感知原理

服务动态感知原理:

image-20210926125450540

nacos中有HostReactor类,用来实现服务的动态更新:

  1. 客户端发起事件订阅后,HostReactor中有UpdateTask线程,每10s发送一次Pull请求,获得服务端最新的地址列表
  2. 服务端与服务提供者的实例之间维持了心跳检测,一旦服务提供者出现异常,则会发送一个Push消息给Nacos客户端,也就是服务消费者
  3. 服务消费者收到请求后,使用HostReactor的processServiceJSON方法解析消息,更新本地服务地址列表。

这就是nacos注册中心服务地址动态感知的基本信息了,希望对大家有所帮助,大家有什么问题也可以给我评论留言哦。