Nacos通过NotifyCenter这个核心类来进行事件的通知流程,接下来会从整体到局部,从源码角度进行分析
开始之前先简要阐述一下事件通知的大致流程:
比如现在是一个服务注册的事件,client端(也就是你的服务)通过调用nacos服务的接口,这个时候,nacos就会通过触发NotifyCenter的事件发布方法,此后,会有一个对应这个服务注册事件的事件发布者EventPublisher来对当前事件进行一个广播操作,广播给注册上了这个事件发布者的订阅者们(Subscriber)。这里一共出现了三个重要的类,一是消息通知中心NotifyCenter
,二是消息发布者EventPublisher
,三是事件订阅者Subscriber
,本篇主要是简要梳理流程,其源码会在后续篇章中剖析
先看看事件通知的核心类:NotifyCenter
// 通过 NotifyCenter 来发布一些消息,如服务注册,服务断线等等
public class NotifyCenter {
// 单例
private static final NotifyCenter INSTANCE = new NotifyCenter();
// key为Event抽象类的子类,我理解为一个事件,
// 这些values均为 DefaultPublisher/NamingEventPublisher 均实现 EventPublisher 和 Closeable (shutdown方法)
private final Map<String, EventPublisher> publisherMap = new ConcurrentHashMap<>(16);
// ignore ..
}
谈谈我对publisherMap的理解:
key:
⚡️是事件类的class全限定类名(如:com.alibaba.nacos.naming.core.v2.event.client.ClientEvent.ClientDisconnectEvent)
value:
⚡️ 是一个 EventPublisher接口(两个实现DefaultPublisher/NamingEventPublisher)的实现
⚡️简单来说就是一个发布者
map:
⚡️k-v 就是一个事件->发布者
⚡️NotifyCenter 通过 ConcurrentHashMap 来保存一个事件以及发布者来调用该事件所对应的发布者的相关方法
⚡️事件我们可以理解为一个事件(虽然是废话),简单的理解比如一个服务注销的事件
接下来详细看看EventPublisher的结构
private final Map<Class<? extends Event>, Set<Subscriber<? extends Event>>> subscribes = new ConcurrentHashMap<>();
private BlockingQueue<Event> queue;
就掏了两个参数出来唠嗑一下:
queue:
⚡️ 显而易见,阻塞队列,存放一个事件对象
subscribes:
⚡️ 同样也是一个map,用来存储事件对象
⚡️ key是一个事件的class
⚡️value是一个一组订阅了该事件的Set集合,也就是该类事件的订阅者集合
既然新冒出来了个Subscriber,那么索性看看
public abstract class Subscriber<T extends Event> {
public abstract void onEvent(T event);
// ignore others .....
}
核心方法就是 onEvent 方法
⚡️ 就是订阅者的onEvent方法接受一个事件入参,然后进行它的逻辑处理
刚刚出现的这几个类都离不开一个类,那就是Event
public abstract class Event implements Serializable {
private static final AtomicLong SEQUENCE = new AtomicLong(0);
private final long sequence = SEQUENCE.getAndIncrement();
/**
* 事件序列号,可用于处理事件的序列
* Event sequence number, which can be used to handle the sequence of events.
* @return sequence num, It's best to make sure it's monotone.
*/
public long sequence() {
return sequence;
}
}
也就相当于一个标记类,并没有什么具体的实现,其实现包含了这个事件的一些携带信息,比如ClientOperationEvent里面包含了这个事件的一些信息,在订阅者监听到这个事件的时候,就能交给订阅者进行处理
上面的核心代码尽量留个印象,留意那几个关键类和字段,接下来过一过事件通知的流转过程
图画的可能不太好,先简要描述一下吧:
至此,NotifyCenter已经光荣的完成了它的事件通知功能
接着细化NotifyCenter,EventPublisher,Subscriber这三个核心大接口
Nacos源码篇
语雀版文档
Nacos源码注释