在 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)
:当实例变更事件触发时的回调。