在 Nacos 中,NotifyCenter、DefaultPublisher、InstancesChangeNotifier 三者是用于事件通知机制的重要组成部分。它们相互协作来实现服务实例变更时的通知和发布。
NotifyCenter —— 事件通知中心
 
NotifyCenter 是 Nacos 中的事件通知中心,负责管理事件的订阅和发布。
它提供了事件的统一管理接口,并负责将事件从发布者传播到订阅者。所有的事件传递都是通过 NotifyCenter进行协调的。
它充当一个全局的事件调度中心,协调事件的发布和订阅行为。任何涉及到事件驱动的操作都需要经过 NotifyCenter。
实现原理:
- NotifyCenter维护了一个全局的事件处理器(- Publisher)列表,用于处理不同类型的事件。
- 当事件发生时,NotifyCenter将事件传递给对应的Publisher,而Publisher则将事件分发给相应的订阅者。
- NotifyCenter提供了事件发布、订阅、取消订阅等接口,使事件管理更加灵活。
常用方法:
- registerSubscriber(Subscriber subscriber):注册事件的订阅者
- deregisterSubscriber(Subscriber subscriber):取消订阅者的注册
- publishEvent(Event event):发布一个事件,将事件传给相应的订阅者
DefaultPublisher —— 事件发布者
 
DefaultPublisher 是 Nacos 中事件发布的具体实现类之一。它负责将事件发布给已经注册的事件监听器(订阅者),并确保事件能被正确消费。
实现原理:
- DefaultPublisher通过内部的事件队列或线程池处理事件。当事件被推送到- DefaultPublisher时,它会将事件放入队列中,并异步处理这些事件。
- 它使用了基于线程池的模型,确保高并发情况下,事件发布不会阻塞调用方,并能有效处理大量的事件。
- 当有事件监听器(订阅者)注册后,DefaultPublisher将会将事件传递给这些监听器处理。
常用方法:
- init():初始化发布器,比如初始化线程池或资源池
- publish(Event event):发布事件(将事件放到事件队列中,之后进行事件发布)
- addSubscriber(Subscriber subscriber):增加事件订阅者
- removeSubscriber(Subscriber subscriber):移除事件订阅者
- notifySubscriber(Subscriber subscriber,Event event):通知事件订阅者具体事件
InstancesChangeNotifier —— 服务实例变更事件通知器
 
InstancesChangeNotifier 是专门用于通知 Nacos 中服务实例变更的类,它继承了 Subscriber,负责监听服务实例的变化事件。
每当 Nacos 的服务实例列表发生变化时,InstancesChangeNotifier 会被通知,InstancesChangeNotifier会回调具体的EventListener的onEvent方法。
实现原理:
- InstancesChangeNotifier内部维护了一个服务实例key和事件监听者的映射集合Map<String,ConcurrentHashSet<EventListener>> listenerMap,key为服务实例的key,value是该实例变更监听者集合。
- 当InstancesChangeNotifier接收到实例变更事件后,会从事件中获取到服务实例key,然后在listenerMap获取到对应的监听者Listener,然后循环回调Listener的onEvent方法
常用方法:
- registerListener(String serviceName,String clusters,EventListener listener):注册服务实例变更事件监听者
- deregisterListener(String serviceName,String clusters,EventListener listener):注销服务实例变更事件监听者
- onEvent(Event event):当实例变更事件触发时的回调。
