nacos 源碼解析系列(二)

Nacos中的事件發(fā)布與訂閱--觀察者模式

大概看了下 發(fā)布訂閱模式的實(shí)現(xiàn),什么鬼額,這不是 guava 的 event bus 的實(shí)現(xiàn)嘛?

天下代碼一大抄-------------啥哈哈哈---


言歸正傳

今天要研究的發(fā)布訂閱代碼位于 nacos-config module 目錄下:

首先來(lái)看:

EventDispatcher

EventDispatcher 是nacos中一個(gè)事件發(fā)布與訂閱的類(lèi),也就是我們經(jīng)常使用的Java 設(shè)計(jì)模式---事件驅(qū)動(dòng)模式(觀察者模式)

一般發(fā)布與訂閱注意有三個(gè)角色:

  • 事件:某些類(lèi)型的事件動(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)聽(tīng)器
  • 事件監(jiān)聽(tīng)器:事件監(jiān)聽(tīng)器聽(tīng)到事件源后,會(huì)執(zhí)行自己的一些業(yè)務(wù)處理,監(jiān)聽(tīng)器必須要有回掉方法供事件源回掉
通俗點(diǎn)講,就是類(lèi)似于一個(gè)分發(fā)總線,或者事件分發(fā)器,或者事件中轉(zhuǎn)站之類(lèi)的。

既然是事件分發(fā)總線,那么那要具備哪些功能呢?

事件是什么?事件來(lái)自哪里?事件分發(fā)給誰(shuí)?

  • 注冊(cè)監(jiān)聽(tīng)著
  • 分發(fā)事件
  • 清空監(jiān)聽(tīng)著?(哈哈哈 非必需)

1、 首先,注冊(cè)的監(jiān)聽(tīng)對(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 參考該類(lèi)的實(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)聽(tīng)器

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的功能。具體感興趣的事件,交由子類(lèi)去實(shí)現(xiàn)。當(dāng)監(jiān)聽(tīng)到感興趣的事件時(shí),執(zhí)行什么樣的操作也是由子類(lèi)去實(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)聽(tīng)時(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)展示下 具體的配置變更過(guò)程,具體的代碼分析,下一篇章來(lái)。

1.png

OK , 這里就寫(xiě) 這么多吧 。下一篇文章要分析下 ,Springboot nacos 配置文件的加載過(guò)程吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容