天天看點

nacos配置中心子產品詳解

本文已收錄 https://github.com/lkxiaolou/lkxiaolou 歡迎star。

配置中心

業務上的配置,功能開關,服務治理上對弱依賴的降級,甚至資料庫的密碼等,都可能用到動态配置中心。

在沒有專門的配置中心元件時,我們使用寫死、或配置檔案、或資料庫、緩存等方式來解決問題。

寫死修改配置時需要重新編譯打包,配置檔案需要重新開機應用,資料庫受限于性能,緩存喪失了及時性。

可能都不完美,但能從中總結出配置中心的需求,相對來說還是比較明确:

  • 能夠存儲、擷取并監聽配置(必須)
  • 配置變更時能及時推送給監聽者(必須)
  • 有一個可視化的檢視變更配置的控制台(必須)
  • 配置變更可灰階執行(加分)
  • 配置變更可復原(加分)

目前使用最多的配置中心可能是攜程開源的Apollo,還有Spring Cloud Config、阿裡開源的Nacos、百度的Disconf等。

Nacos配置中心

Nacos

Naming and Configuration Service

的縮寫,從名字上能看出它重點關注的兩個領域是

Naming

即注冊中心和

Configuration

配置中心。

本文講解nacos的配置中心的架構設計和實作原理,基于

2.0.0

版本(注:2.0.0版本與1.x版本差別較大)

Nacos調試環境搭建

  • 先從github上clone代碼(網速比較慢,加上--depth=1參數)
git clone --depth=1 https://github.com/alibaba/nacos.git
           
  • 導入IDE,看代碼,調試更友善
  • 啟動Server端:運作console子產品下的Nacos.main(),這個類掃描的路徑最廣,能啟動所有的子產品
    • JVM參數可帶上

      -Dnacos.standalone=true -Dnacos.functionMode=config

      ,指定單機模式,且隻啟動config子產品
    • --spring.config.additional-location=nacos/distribution/conf

      ,程式參數指定配置檔案目錄
    • 正常啟動,console列印出Ncos控制台位址,進入Nacos控制台,輸入使用者名密碼(預設均為nacos)即可登入
nacos配置中心子產品詳解
  • 使用client進行測試,example子產品下有configExample可進行config的測試,為了不動源代碼,可copy一份configExample進行修改測試

Nacos配置模型

namespace + group + dataId 唯一确定一個配置

  • namespace:與client綁定,一個clinet對應到一個namespace,可用來隔離環境或區分租戶
  • group:分組,區分業務
  • dataId:配置的id
nacos配置中心子產品詳解

用戶端啟動流程

nacos配置中心子產品詳解
  • 參數準備時,如果配置了nacos服務端位址,則直接使用;如果配置了endpoint,則從endpoint中擷取nacos服務端位址,這樣有個好處是服務端位址變更,擴縮容都無需重新開機client,更詳細可參考

    https://nacos.io/en-us/blog/namespace-endpoint-best-practices.html

  • 在用戶端第一次與服務端互動時建立GRPC連接配接,随機挑選一台server建立連接配接,後續都使用該連接配接,請求失敗都會有重試,針對請求級别也有限流;重試失敗或者服務端主動斷開連接配接,則會重新挑選一台server進行建鍊

請求模型

從gRPC的proto檔案能看出請求與傳回的定義比較統一

message Metadata {
  string type = 3;
  string clientIp = 8;
  map<string, string> headers = 7;
}

message Payload {
  Metadata metadata = 2;
  google.protobuf.Any body = 3;
}

service Request {
  // Sends a commonRequest
  rpc request (Payload) returns (Payload) {
  }
}
           
  • type是請求/傳回類的類名
  • clientIp是用戶端ip
  • headers是攜帶的header資訊
  • Playload中的body以json格式編碼

com.alibaba.nacos.api.config.ConfigService

中可以找到所有配置中心能使用的接口

nacos配置中心子產品詳解

重點關注這幾個接口:

  • getConfig:讀取配置
  • publishConfig:釋出配置
  • publishConfigCas:原子的釋出配置,若有被其他線程變更則釋出失敗,類似java中的CAS
  • removeConfig:删除配置
  • addListener:監聽配置
  • removeListener:移除配置的監聽

變更推送

nacos配置中心子產品詳解

采取推拉結合的方式,既保證時效性,又保證資料一緻性

資料存儲

Nacos配置中心的資料存儲支援内嵌的

derby

資料庫,也支援外部資料庫

mysql

,内嵌資料庫主要是為了單機測試時使用。

其中上文提及的

publishConfigCas

的實作是利用了資料庫

update ${table} set ${xx}=${zz} where md5=${old_md5}

來實作,如果已經這條資料被變更,則這次publish會失敗。

灰階和復原

nacos配置中心子產品詳解

當勾選灰階釋出時可填寫灰階的ip進行推送,不在灰階清單内的ip則不會接受到變更推送,并且灰階和正式是區分開的。

nacos配置中心子產品詳解
nacos配置中心子產品詳解

灰階的實作是記錄下了每次的釋出,復原到指定版本即可。

結語

本文從背景出發,結合Nacos配置中心的各個重要子產品進行了一一解釋,能夠從整體上對Nacos的配置中心有一個把握。期望後續能對Nacos注冊中心進行分析介紹。

搜尋關注微信公衆号"捉蟲大師",後端技術分享,架構設計、性能優化、源碼閱讀、問題排查、踩坑實踐。

繼續閱讀