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)
服务动态感知原理
服务动态感知原理:
nacos中有HostReactor类,用来实现服务的动态更新:
- 客户端发起事件订阅后,HostReactor中有UpdateTask线程,每10s发送一次Pull请求,获得服务端最新的地址列表
- 服务端与服务提供者的实例之间维持了心跳检测,一旦服务提供者出现异常,则会发送一个Push消息给Nacos客户端,也就是服务消费者
- 服务消费者收到请求后,使用HostReactor的processServiceJSON方法解析消息,更新本地服务地址列表。
这就是nacos注册中心服务地址动态感知的基本信息了,希望对大家有所帮助,大家有什么问题也可以给我评论留言哦。