八溶耘、soul源碼學(xué)習-SoulAdmin事件同步機制源碼解析-1

上一節(jié)講了從我們SpringBoot項目同步數(shù)據(jù)到SoulAdmin并將數(shù)據(jù)持久化到數(shù)據(jù)庫中二拐,這一節(jié)

在數(shù)據(jù)持久化到數(shù)據(jù)庫中之后,SoulAdmin會通過Spring的ApplicationEventPublisher發(fā)送一個事件變更事件凳兵,繼承自org.springframework.context.ApplicationEvent

//org.dromara.soul.admin.listener.DataChangedEvent#DataChangedEvent
public class DataChangedEvent extends ApplicationEvent {

    private DataEventTypeEnum eventType;

    private ConfigGroupEnum groupKey;

    /**
     * Instantiates a new Data changed event.
     *
     * @param groupKey the group key
     * @param type     the type
     * @param source   the source
     */
    public DataChangedEvent(final ConfigGroupEnum groupKey, final DataEventTypeEnum type, final List<?> source) {
        super(source);
        this.eventType = type;
        this.groupKey = groupKey;
    }

    /**
     * Gets event type.
     *
     * @return the event type
     */
    DataEventTypeEnum getEventType() {
        return eventType;
    }

    @Override
    public List<?> getSource() {
        return (List<?>) super.getSource();
    }

    /**
     * Gets group key.
     *
     * @return the group key
     */
    public ConfigGroupEnum getGroupKey() {
        return this.groupKey;
    }

}

DataChangedEvent存在兩個屬性百新,eventType

//org.dromara.soul.common.enums.DataEventTypeEnum
//對應(yīng)著事件的類型
public enum DataEventTypeEnum {

    /**
     * delete event.
     */
    DELETE,

    /**
     * insert event.
     */
    CREATE,

    /**
     * update event.
     */
    UPDATE,

    /**
     * REFRESH data event type enum.
     */
    REFRESH,

    /**
     * Myself data event type enum.
     */
    MYSELF;
}
//org.dromara.soul.common.enums.ConfigGroupEnum
//對應(yīng)著配置分組,現(xiàn)在總共支持 APP_AUTH:配置庐扫,PLUGIN:插件吟孙,RULE:規(guī)則澜倦,SELECTOR:選擇器,META_DATA:元數(shù)據(jù) 
public enum ConfigGroupEnum {

    /**
     * App auth config group enum.
     */
    APP_AUTH,

    /**
     * Plugin config group enum.
     */
    PLUGIN,

    /**
     * Rule config group enum.
     */
    RULE,

    /**
     * Selector config group enum.
     */
    SELECTOR,

    /**
     * Meta data config group enum.
     */
    META_DATA;
}

接下來通過查詢org.dromara.soul.admin.listener.DataChangedEvent調(diào)用他的地方杰妓。定位到DataChangedEventDispatcher

DataChangedEventDispatcher 實現(xiàn)了ApplicationListener并且接收DataChangedEvent事件藻治,通過GroupKey的類型做不同處理

//org.dromara.soul.admin.listener.DataChangedEventDispatcher
public class DataChangedEventDispatcher implements ApplicationListener<DataChangedEvent>, InitializingBean {
    private ApplicationContext applicationContext;

    private List<DataChangedListener> listeners;

    public DataChangedEventDispatcher(final ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

  // 監(jiān)聽DataChangedEvent,并根據(jù)ConfigGroupEnum類型進行不同的處理
    @Override
    @SuppressWarnings("unchecked")
    public void onApplicationEvent(final DataChangedEvent event) {
        for (DataChangedListener listener : listeners) {
            switch (event.getGroupKey()) {
                case APP_AUTH:
                    listener.onAppAuthChanged((List<AppAuthData>) event.getSource(), event.getEventType());
                    break;
                case PLUGIN:
                    listener.onPluginChanged((List<PluginData>) event.getSource(), event.getEventType());
                    break;
                case RULE:
                    listener.onRuleChanged((List<RuleData>) event.getSource(), event.getEventType());
                    break;
                case SELECTOR:
                    listener.onSelectorChanged((List<SelectorData>) event.getSource(), event.getEventType());
                    break;
                case META_DATA:
                    listener.onMetaDataChanged((List<MetaData>) event.getSource(), event.getEventType());
                    break;
                default:
                    throw new IllegalStateException("Unexpected value: " + event.getGroupKey());
            }
        }
    }

  // 將Spring代理的DataChangedListener注入到當前類的listeners
    @Override
    public void afterPropertiesSet() {
        Collection<DataChangedListener> listenerBeans = applicationContext.getBeansOfType(DataChangedListener.class).values();
        this.listeners = Collections.unmodifiableList(new ArrayList<>(listenerBeans));
    }
}

接口DataChangedListener不同實現(xiàn)類有如下:

image.png

即對應(yīng)了現(xiàn)在Soul的四種數(shù)據(jù)同步方式:http長輪訓(xùn)巷挥,Websocket桩卵,Nacos,Zookeeper

1.Zookeeper方式很簡單倍宾,就是依賴Zookeeper的watch機制雏节,SoulAdmin在啟動的時候?qū)?shù)據(jù)全量同步到Zookeeper,之后變化增量更新數(shù)據(jù)高职。

image.png
  1. WebsocketZookeeper機制有點類似钩乍,將網(wǎng)關(guān)與admin建立好websocket連接時,admin會推送一次全量數(shù)據(jù)怔锌,后續(xù)如果配置數(shù)據(jù)發(fā)生變更寥粹,則將增量數(shù)據(jù)通過websocket主動推送給soul-web。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埃元,一起剝皮案震驚了整個濱河市涝涤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岛杀,老刑警劉巖阔拳,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異类嗤,居然都是意外死亡糊肠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門遗锣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來货裹,“玉大人,你說我怎么就攤上這事黄伊。” “怎么了派殷?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵还最,是天一觀的道長。 經(jīng)常有香客問我毡惜,道長拓轻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任经伙,我火速辦了婚禮扶叉,結(jié)果婚禮上勿锅,老公的妹妹穿的比我還像新娘。我一直安慰自己枣氧,他們只是感情好溢十,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著达吞,像睡著了一般张弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酪劫,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天吞鸭,我揣著相機與錄音,去河邊找鬼覆糟。 笑死刻剥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的滩字。 我是一名探鬼主播造虏,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼踢械!你這毒婦竟也來了酗电?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤内列,失蹤者是張志新(化名)和其女友劉穎撵术,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體话瞧,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嫩与,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了交排。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片划滋。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埃篓,靈堂內(nèi)的尸體忽然破棺而出处坪,到底是詐尸還是另有隱情,我是刑警寧澤架专,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布同窘,位于F島的核電站,受9級特大地震影響部脚,放射性物質(zhì)發(fā)生泄漏想邦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一委刘、第九天 我趴在偏房一處隱蔽的房頂上張望丧没。 院中可真熱鬧鹰椒,春花似錦、人聲如沸呕童。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拉庵。三九已至灿椅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工曙寡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚣常,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柬采,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容