Nacos中的事件發(fā)布與訂閱--觀察者模式
大概看了下 發(fā)布訂閱模式的實(shí)現(xiàn)无埃,什么鬼額钝诚,這不是 guava 的 event bus 的實(shí)現(xiàn)嘛隘截?
天下代碼一大抄-------------啥哈哈哈---
言歸正傳
今天要研究的發(fā)布訂閱代碼位于 nacos-config module 目錄下:
首先來(lái)看:
EventDispatcher
EventDispatcher 是nacos中一個(gè)事件發(fā)布與訂閱的類铲咨,也就是我們經(jīng)常使用的Java 設(shè)計(jì)模式---事件驅(qū)動(dòng)模式(觀察者模式)
一般發(fā)布與訂閱注意有三個(gè)角色:
- 事件:某些類型的事件動(dòng)作,例如nacos 中的本地?cái)?shù)據(jù)發(fā)生變更事件LocalDataChangeEvent
- 事件源:事件源可以看作一個(gè)動(dòng)作蒜鸡,某個(gè)事件發(fā)生的動(dòng)作畜眨,例如:nacos中本地?cái)?shù)據(jù)發(fā)生了變更昼牛,就會(huì)通知給所有該事件的監(jiān)聽器
- 事件監(jiān)聽器:事件監(jiān)聽器聽到事件源后术瓮,會(huì)執(zhí)行自己的一些業(yè)務(wù)處理康聂,監(jiān)聽器必須要有回掉方法供事件源回掉
通俗點(diǎn)講,就是類似于一個(gè)分發(fā)總線胞四,或者事件分發(fā)器恬汁,或者事件中轉(zhuǎn)站之類的。
既然是事件分發(fā)總線辜伟,那么那要具備哪些功能呢氓侧?
事件是什么?事件來(lái)自哪里导狡?事件分發(fā)給誰(shuí)约巷?
- 注冊(cè)監(jiān)聽著
- 分發(fā)事件
- 清空監(jiān)聽著?(哈哈哈 非必需)
1旱捧、 首先独郎,注冊(cè)的監(jiān)聽對(duì)象:
static final CopyOnWriteArrayList<Entry> LISTENER_HUB = new CopyOnWriteArrayList<>();
static public void addEventListener(AbstractEventListener listener) {
for (Class<? extends Event> type : listener.interest()) {
getEntry(type).listeners.addIfAbsent(listener);
}
}
具體容器使用方法,這里不表述枚赡,參考之前文章氓癌。
其實(shí),這里還有另一種實(shí)現(xiàn)思路贫橙,MultiValueMap 參考該類的實(shí)現(xiàn)贪婉,可以替代該容器,可以簡(jiǎn)單很多
2卢肃、發(fā)布事件
static public void fireEvent(Event event) {
if (null == event) {
throw new IllegalArgumentException("event is null");
}
for (AbstractEventListener listener : getEntry(event.getClass()).listeners) {
try {
listener.onEvent(event);
} catch (Exception e) {
log.error(e.toString(), e);
}
}
}
下面再來(lái)看下 事件監(jiān)聽器
AbstractEventListener
static public abstract class AbstractEventListener {
public AbstractEventListener() {
/**
* automatic register
*/
EventDispatcher.addEventListener(this);
}
/**
* 感興趣的事件列表
*
* @return event list
*/
abstract public List<Class<? extends Event>> interest();
/**
* 處理事件
*
* @param event event
*/
abstract public void onEvent(Event event);
}
默認(rèn)實(shí)現(xiàn)--注冊(cè) Listener的功能疲迂。具體感興趣的事件,交由子類去實(shí)現(xiàn)莫湘。當(dāng)監(jiān)聽到感興趣的事件時(shí)尤蒿,執(zhí)行什么樣的操作也是由子類去實(shí)現(xiàn)。
下面我們看一個(gè)具體的 listener 實(shí)現(xiàn):
AsynNotifyService.class
簡(jiǎn)單實(shí)現(xiàn):
//感興趣的事件
@Override
public List<Class<? extends Event>> interest() {
List<Class<? extends EventDispatcher.Event>> types = new ArrayList<>();
types.add(ConfigDataChangeEvent.class);
return types;
}
//監(jiān)聽時(shí)間后處理邏輯
@Override
public void onEvent(Event event) {
System.out.println("i get the event" + event.getClass());
}
下面來(lái)看下 事件
//所有事件繼承自這個(gè)接口
public interface Event {
}
具體可以參考ConfigDataChangeEvent.class 代表了一次變動(dòng)事件逊脯。即配置信息的變更优质。
下面以一個(gè)具體的流程圖,來(lái)展示下 具體的配置變更過程军洼,具體的代碼分析巩螃,下一篇章來(lái)。
OK , 這里就寫 這么多吧 匕争。下一篇文章要分析下 避乏,Springboot nacos 配置文件的加載過程吧