Soul API網(wǎng)關(guān)源碼解析10-數(shù)據(jù)同步篇

目標(biāo)

  • Nacos簡單介紹

    • Nacos 關(guān)鍵特性
    • Nacos 服務(wù)搭建啟動(dòng)
  • soul-admin nacos配置啟動(dòng)

    • 添加Soul-Nacos依賴
    • 修改yml配置文件
    • 啟動(dòng)admin會(huì)看到Nacos網(wǎng)頁上有四個(gè)數(shù)據(jù)
    • 介紹Nacos在Admin啟動(dòng)流程
    • DataSyncConfiguration初始化NacosBean
  • admin數(shù)據(jù)發(fā)生變動(dòng)發(fā)布流程

  • 總結(jié)

Nacos簡單介紹

image.png

上圖從特性、架構(gòu)、業(yè)務(wù)、生態(tài)、優(yōu)勢、戰(zhàn)略等六個(gè)方面介紹了Nacos的核心功能

  • Nacos(Dynamic Naming and Configuration Service):從全稱我們看得出來他是動(dòng)態(tài)命令和配置服務(wù),是Spring Cloud Alibaba的一個(gè)組件。
  • Nacos數(shù)據(jù)模型Key由三元組唯一確定,Namespace默認(rèn)是空串,公共命名空間(public),分組默認(rèn)是DEFAUTL_GROUP
  • Nacos致力于幫助我們發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos提供了一組簡單易用的特性集,幫助我們快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。

Nacos關(guān)鍵特性

  • 服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測
  • 動(dòng)態(tài)配置服務(wù)
  • 動(dòng)態(tài)DNS服務(wù)
  • 服務(wù)及其元數(shù)據(jù)管理

Nacos服務(wù)搭建啟動(dòng)

image.png
  • 解壓執(zhí)行
image.png
  • 啟動(dòng)成功
image.png

Nacos 服務(wù)默認(rèn)端口是8848,我們登陸localhost:8848/nacos 即可訪問官方后臺(tái)管理

  • 登陸后臺(tái)查看
image.png

后面我們啟動(dòng)admin/bootstrap 就可以看到有數(shù)據(jù)注冊(cè)上來

Soul-Admin的Nacos配置啟動(dòng)

添加Soul-Nacos依賴

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>${nacos-client.version}</version>
</dependency>

修改yml配置文件

image.png

此處Soul默認(rèn)只使用一種數(shù)據(jù)同步方式,所以將其他三種同步方式注釋掉。只打開Nacos配置

啟動(dòng)admin會(huì)看到Nacos網(wǎng)頁上有四個(gè)數(shù)據(jù)

image.png

注意點(diǎn): 默認(rèn)Nacos 是不會(huì)自動(dòng)創(chuàng)建命名空間的,有些同學(xué)以為網(wǎng)頁上看不到數(shù)據(jù),就以為數(shù)據(jù)同步不起作用。經(jīng)過測試這其實(shí)是Nacos展示這塊沒有根據(jù)發(fā)布數(shù)據(jù)來自動(dòng)顯示。如何做才能看到上圖樣子呢。

只需要點(diǎn)擊命名空間,創(chuàng)建你配置文件配置的namespace的名稱即可,本文namespace是1c10d748-af86-43b9-8265-75f487d20c6c。所以本文建立的命令為

image.png

介紹Nacos 在Admin啟動(dòng)流程

DataSyncConfiguration 初始化NacosBean

  • 初始化DataChangedListener 數(shù)據(jù)監(jiān)聽器
image.png

這里只是初始化Nacos客戶端和監(jiān)聽數(shù)據(jù)監(jiān)聽器

  • 檢查是否對(duì)Nacos數(shù)據(jù)進(jìn)行上報(bào)
image.png

這里之前未做檢查,其實(shí)我覺得沒必要做檢查,畢竟Nacos是全量更新,就算一開始拿不到數(shù)據(jù),在后期數(shù)據(jù)變更時(shí)候,可以做一次全量更新。

admin 數(shù)據(jù)發(fā)生變動(dòng)發(fā)布流程

@Override
public void onPluginChanged(final List<PluginData> changed, final DataEventTypeEnum eventType) {
// 這里進(jìn)來先獲取Nacos對(duì)應(yīng)的數(shù)據(jù),是考慮到多個(gè)admin,adminA 改了 adminB如何取到A改的值,這里就在adminB未重啟的情況下,只要發(fā)生變化,就會(huì)重新拉取Nacos 的數(shù)據(jù),來保證admin之間的數(shù)據(jù)同步
    updatePluginMap(getConfig(NacosPathConstants.PLUGIN_DATA_ID));
    switch (eventType) {
        case DELETE:
            changed.forEach(plugin -> PLUGIN_MAP.remove(plugin.getName()));
            break;
        case REFRESH:
        case MYSELF:
            Set<String> set = new HashSet<>(PLUGIN_MAP.keySet());
            changed.forEach(plugin -> {
                set.remove(plugin.getName());
                PLUGIN_MAP.put(plugin.getName(), plugin);
            });
            PLUGIN_MAP.keySet().removeAll(set);
            break;
        default:
            changed.forEach(plugin -> PLUGIN_MAP.put(plugin.getName(), plugin));
            break;
    }
    publishConfig(NacosPathConstants.PLUGIN_DATA_ID, PLUGIN_MAP);
}

總結(jié)

今天收獲很大,由原來的的單機(jī)編程想法往集群方向的開發(fā)突破,Nacos 在集群環(huán)境下,admin端是如何知道A改了數(shù)據(jù)B端如何知道。使用Nacos 作為中間媒介,并且對(duì)應(yīng)端數(shù)據(jù)發(fā)生變化先獲取媒介上當(dāng)前最新數(shù)據(jù),然后在獲取自己關(guān)心的數(shù)據(jù),進(jìn)行發(fā)布更新。

參考

soul github
soul document

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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