Nacos 如何實現(xiàn)按實例分批發(fā)布

前言

生產環(huán)境需要使用 K8S 部署方式,并且依賴于 Nacos 發(fā)布云配置,但是需要支持按 Pod 分批發(fā)布。目前 Nacos 僅支持兩段式發(fā)布,先發(fā)一部分試點,剩下的需要全部發(fā)布或者試點的全部回滾,不滿足于需求,需基于 Nacos 基礎上進行處理。Nacos 官方對于發(fā)布 Beta 功能的介紹:https://nacos.io/en-us/blog/nacos%201.1.0.html

原功能介紹(基于1.3.0版本)

Nacos 發(fā)布 Beta 功能從下圖來看,發(fā)布了 Beta 之后,就無法再修改內容和 Beta 發(fā)布的 IP,只能操作停止 Beta 和發(fā)布兩個按鈕,但是我們也可以通過 API 直接調用去更新betaIps參數

Nacos 配置.png

入口為com.alibaba.nacos.config.server.controller.ConfigController#publishConfig,從下圖可以看出,如果傳了betaIps,調用該方法persistService.insertOrUpdateBeta

源碼.png

該方法具體實現(xiàn)如下


源碼.png

在這里我們關注的是updateConfigInfo4Beta方法具體實現(xiàn)

源碼.png

從實現(xiàn)可看出,并沒有將betaIps字段進行更新,所以betaIps字段創(chuàng)建了之后就無法再更新了

并且,從updateConfigInfo4Beta實現(xiàn)中可以看出,操作完數據后,還會發(fā)出一個事件,該事件會將匹配的dataId調用/nacos/v1/cs/communication/dataChange接口,由dataChange接口通知具體匹配的監(jiān)聽該dataId客戶端

源碼.png

postman.png

communication/dataChange接口具體實現(xiàn)如下

源碼.png

dumpService.dump中會執(zhí)行DumpTask#process方法

源碼.png

該方法會從數據庫config_info_beat查詢數據再調用DumpConfigHandler.configDump,從上圖可以看出build.remove中的參數如果為 null,那么event.isRemove就為 true,但是我們需要更新的必定不會為 null,所以執(zhí)行的是 else 中的邏輯

源碼.png

ConfigCacheService.dumpBeta具體實現(xiàn),拿從數據庫獲取的配置內容進行 MD5 處理,再進行updateBetaMd5

源碼.png

updateBetaMd5具體實現(xiàn),獲取內存 MD5 和新生成的 MD5 進行比較,如果有變化才會觸發(fā)LocalDataChangeEvent事件

源碼.png

LocalDataChangeEvent事件具體在LongPollingService#onEvent方法中執(zhí)行,通過DataChangeTask進行通知客戶端內容變更

源碼.png

結論

那么如何才能更新betaIps字段?由于接口無法對betaIps字段進行更新,那我們是否可以直接操作數據庫?從源碼來看,是由communication/dataChange接口去通知客戶端配置內容變更

我們通過實踐發(fā)現(xiàn),直接修改config_info_beta表中的betaipscontent字段,再調用communication/dataChange接口,由于updateBetaMd5方法中判斷 MD5 是否有變化,有變化的情況下才會觸發(fā)LocalDataChangeEvent事件,才會通知到客戶端

  • 已驗證過在1.3.0版本和2.0.1版本都有效,雖然大版本差異源碼有所不同,但是大邏輯沒變
  • 調用communication/dataChange接口時,如果 Nacos 有多個節(jié)點,則需要每個節(jié)點調用一次communication/dataChange接口,但調用時需每個節(jié)點間間隔一下,避免同一個客戶端注冊到多個 Nacos 節(jié)點上時,同時通知更新配置導致客戶端出現(xiàn)異常
  • 若需要在已添加的betaips中修改IP,只變更注釋內容是不生效的,需要變更配置內容
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容