阅读nacos源码并手撸注册中心:第二个礼拜,这礼拜开始慢慢解析nacos源码里的设计,本篇解析Naocs里的事件监听-观察者模式
一、Nacos事件发布与订阅-观察者模式
在Nacos中主要事件发布器主要分为两种
- DefaultPublisher:只能监听一种Event.class子类,每个一个线程;
- DefaultSharePublisher:可以区分监听多种Event.class子类,使用Map<Class,Subscriber>做了事件类型监听区分,多种Event也共用一个线程;
DefaultPublisher 默认事件发布器
不根据事件的具体实现类通知,一次发布,不管具体实现的Event子类都会接收到通知

DefaultSharePublisher 可区分类型监听发布器
该发布器,可以实现根据具体的事件实现类类型,指定监听事件,也可以全部监听

DefaultPublisher 具体实现
到这里已经能明显看出是观察者模式(创建subject、创建observer、添加监听 、subject发布事件),核心方法在init() 看下张图

核心init方法里设置了线程属性,创建了阻塞队列,核心方法在start(),start()方法里执行了Thread的start()方法 ,也就是下面的run()方法

run方法里执行了openEventHandler(),该方法做了两件事
1.检查是否有监听者–每一秒检查一次,检查60次一共60秒,六十秒后就放行不检查了避免任务堆过多
2.从阻塞队列获取任务执
⭐这里可以发现是单线程去执行,因为要保证任务的有序性⭐

DefaultSharePublisher具体实现
与默认的实现没什么不同,还是单线程,区别在于会根据添加的事件Class进行分类,在通知的时候也只会通知监听了指定的Class类型;

因为是单线程共享执行,所以提供了一个Event继承类SlowEvent,代表是DefaultSharePublisher的事件。表示可以接受在单线程的情况下,执行可能要排队比较久;

二、在Nacos中的使用
如何初始化
在Nacos中NotifyCenter类是事件通知中心的管理类,初始化在static代码块中;
- 在静态代码块中去初始化–只用真正使用到的时候才会初始化,不依赖其他地方调用初始化(隔离);
- 通过SPI的方式去加载默认的事件发布器类型–目前没有配置SPI,使用的是DefaultPublisher
- 提供DefaultPublisher创建工厂给予业务类使用

如何统一管理
DefaultPublisher 和 DefaultSharePublisher 代表了一对一 和 一对多,在添加时调用的方法都是一样的,根据事件类型进行区分使用哪种事件发布器
可以看到IF做了SlowEvent.class的判断,true则使用DefaultSharePublisher(共享)事件发布器

缺点
- DefaultPublisher(默认事件发布器)每实例一个都需要启动一个线程单独执行,来保证事件被快速执行–控制事件数量避免线程过多
— EOF —
本文深入解析了Nacos中事件监听的实现,主要围绕DefaultPublisher和DefaultSharePublisher两个事件发布器展开。DefaultPublisher是单线程执行,保证任务有序,而DefaultSharePublisher则按事件类型区分,允许慢速事件处理。Nacos在初始化时通过SPI加载默认发布器,并提供了统一的事件管理方式。虽然DefaultPublisher为每个实例启动独立线程,但可能导致线程过多的问题。
1万+

被折叠的 条评论
为什么被折叠?



