nacos使用_使用Nacos的CMDB实现微服务的就近访问!
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來,我們一起精進(jìn)!你不來,我和你的競(jìng)爭(zhēng)對(duì)手一起精進(jìn)!
編輯:業(yè)余草
juejin.cn/post/6892343440705585159
推薦:https://www.xttblog.com/?p=5123
使用Nacos的CMDB實(shí)現(xiàn)微服務(wù)的就近訪問!
Nacos 提供了一大堆很香的功能,很多人估計(jì)都沒聽過,也沒用過。
上圖中的功能,Nacos 提供的都有,你了解過多少?
基于 Nacos 的強(qiáng)大能力,本文就來說一說 Nacos 提供的 CMDB 功能。
?CMDB 用于存放規(guī)模化的機(jī)器設(shè)備、應(yīng)用、服務(wù)等相關(guān)的元數(shù)據(jù)。基本屬性例如機(jī)器的 IP、主機(jī)名、機(jī)房、應(yīng)用、所在區(qū)域等,這些元數(shù)據(jù)一般會(huì)在機(jī)器部署時(shí)錄入到 CMDB。
在微服務(wù)實(shí)例進(jìn)行多機(jī)房或者多地域部署時(shí),跨地域的微服務(wù)訪問往往延遲較高,一個(gè)城市內(nèi)的機(jī)房間的典型網(wǎng)絡(luò)延遲在 1ms 左右,而跨城市的網(wǎng)絡(luò)延遲,例如南京到上海大概為 20ms。如何讓服務(wù)消費(fèi)者和服務(wù)提供者進(jìn)行同地域訪問。在實(shí)踐中,此需求是通過和 CMDB 打通來實(shí)現(xiàn)的。在服務(wù)發(fā)現(xiàn)組件中,對(duì)接 CMDB,然后通過路由組件配置的訪問規(guī)則,來實(shí)現(xiàn)服務(wù)消費(fèi)者到服務(wù)提供者的同地域優(yōu)先。
服務(wù)的同區(qū)域優(yōu)先訪問
支持就近訪問的時(shí)候 ,需要能夠從某個(gè)地方獲取 IP 的環(huán)境信息,該部署信息要么是從企業(yè)的 CMDB 中查詢而來,要么是從元數(shù)據(jù)中心獲取。
CMDB 插件機(jī)制
首先 Nacos 里將 CMDB 的數(shù)據(jù)通過某種方法獲取。一個(gè)比較好的策略是使用 SPI 機(jī)制,約定 CMDB 的抽象調(diào)用接口,由各個(gè)企業(yè)添加自己的 CMDB 插件,無需任何代碼上的重新構(gòu)建,即可在運(yùn)行狀態(tài)下對(duì)接上企業(yè)的 CMDB。
Nacos CMDB SPI機(jī)制原理
Nacos 定義了一個(gè) SPI 接口,里面包含了與第三方 CMDB 約定的一些方法。用戶依照約定實(shí)現(xiàn)了相應(yīng)的 SPI 接口后可實(shí)現(xiàn) Nacos 與 CMDB 的數(shù)據(jù)打通。
SPI 定義
在這里對(duì) CMDB 機(jī)制的相關(guān)概念和接口含義做一個(gè)詳細(xì)說明。
CMDB 抽象概念
實(shí)體(Entity):實(shí)體是作為 CMDB 里數(shù)據(jù)的承載方,在一般的 CMDB 中,一個(gè)實(shí)體可以指一個(gè) IP、應(yīng)用或者服務(wù)。而這個(gè)實(shí)體會(huì)有很多屬性,例如 IP 的機(jī)房信息,服務(wù)的版本信息等。
實(shí)體類型(Entity Type):我們并不限定實(shí)體一定是 IP、應(yīng)用或者服務(wù),這取決于實(shí)際的業(yè)務(wù)場(chǎng)景。目前服務(wù)發(fā)現(xiàn)需要的實(shí)體類型是 IP 與 Service。
標(biāo)簽(Label):Label 是我們抽象出的 Entity 屬性,Label 定義為一個(gè)描述 Entity 屬性的 K-V 鍵值對(duì)。Label 的 key 和 value 的取值范圍一般都是預(yù)先定義好的,當(dāng)需要對(duì) Label 進(jìn)行變更,如增加新的 key 或者 value 時(shí),需要調(diào)用單獨(dú)的接口并觸發(fā)相應(yīng)的事件。一個(gè)常見的 Label 的例子是 IP 的機(jī)房信息,我們認(rèn)為機(jī)房(site)是 Label 的 key,而機(jī)房的集合(site1, site2, site3)是 Label 的 value,這個(gè) Label 的定義就是:site: {site1, site2, site3}。
實(shí)體事件(Entity Event):實(shí)體的標(biāo)簽的變更事件。當(dāng) CMDB 的實(shí)體屬性發(fā)生變化,需要有一個(gè)事件機(jī)制來通知所有訂閱方。為了保證實(shí)體事件攜帶的變更信息是最新準(zhǔn)確的,這個(gè)事件里只會(huì)包含變更的實(shí)體的標(biāo)識(shí)以及變更事件的類型,不會(huì)包含變更的標(biāo)簽的值。
CMDB 約定接口:在設(shè)計(jì)與 CMDB 交互接口的時(shí)候,我們參考了內(nèi)部對(duì) CMDB 的訪問接口與外部客戶進(jìn)行了討論。我們最終確定了以下要求第三方 CMDB 插件必須實(shí)現(xiàn)的接口:
獲取標(biāo)簽列表
Set?getLabelNames();這個(gè)方法將返回 CMDB 中需要被 Nacos 識(shí)別的標(biāo)簽名集合,CMDB 插件可以按需決定返回什么標(biāo)簽個(gè) Nacos。不在這個(gè)集合的標(biāo)簽將會(huì)被 Nacos 忽略,即使這個(gè)標(biāo)簽出現(xiàn)在實(shí)體的屬性里。我們?cè)试S這個(gè)集合會(huì)在運(yùn)行時(shí)動(dòng)態(tài)變化,Nacos 會(huì)定時(shí)去調(diào)用這個(gè)接口刷新標(biāo)簽集合。
獲取實(shí)體類型
Set?getEntityTypes();獲取 CMDB 里的實(shí)體的類型集合,不在這個(gè)集合的實(shí)體類型會(huì)被 Nacos 忽略。服務(wù)發(fā)現(xiàn)模塊目前需要的實(shí)體類似是 ip,如果想要通過打通 CMDB 數(shù)據(jù)來實(shí)現(xiàn)服務(wù)的高級(jí)負(fù)載均衡,請(qǐng)務(wù)必在返回集合里包含“ip”。
獲取標(biāo)簽詳情
Label?getLabel(String?labelName);獲取標(biāo)簽的詳細(xì)信息。返回的 Label 類里包含標(biāo)簽的名字和標(biāo)簽值的集合。如果某個(gè)實(shí)體的這個(gè)標(biāo)簽的值不在標(biāo)簽值集合里,將會(huì)被視為無效。
查詢實(shí)體的標(biāo)簽值
String?getLabelValue(String?entityName,?String?entityType,?String?labelName);Map?getLabelValues(String?entityName,?String?entityType);
這里包含兩個(gè)方法,一個(gè)是獲取實(shí)體某一個(gè)標(biāo)簽名對(duì)應(yīng)的值,一個(gè)是獲取實(shí)體所有標(biāo)簽的鍵值對(duì)。參數(shù)里包含實(shí)體的值和實(shí)體的類型。注意,這個(gè)方法并不會(huì)在每次在 Nacos 內(nèi)部觸發(fā)查詢時(shí)去調(diào)用,Nacos 內(nèi)部有一個(gè) CMDB 數(shù)據(jù)的緩存,只有當(dāng)這個(gè)緩存失效或者不存在時(shí),才會(huì)去訪問 CMDB 插件查詢數(shù)據(jù)。為了讓 CMDB 插件的實(shí)現(xiàn)盡量簡(jiǎn)單,我們?cè)?Nacos 內(nèi)部實(shí)現(xiàn)了相應(yīng)的緩存和刷新邏輯。
查詢實(shí)體
Map>?getAllEntities();Entity?getEntity(String?entityName,?String?entityType);查詢實(shí)體包含兩個(gè)方法:查詢所有實(shí)體和查詢單個(gè)實(shí)體。查詢單個(gè)實(shí)體目前其實(shí)就是查詢這個(gè)實(shí)體的所有標(biāo)簽,不過我們將這個(gè)方法與獲取所有標(biāo)簽的方法區(qū)分開來,因?yàn)椴樵儐蝹€(gè)實(shí)體方法后面可能會(huì)進(jìn)行擴(kuò)展,比查詢所有標(biāo)簽獲取的信息要更多。
查詢所有實(shí)體則是一次性將 CMDB 的所有數(shù)據(jù)拉取過來,該方法可能會(huì)比較消耗性能,無論是對(duì)于 Nacos 還是 CMDB。Nacos 內(nèi)部調(diào)用該方法的策略是通過可配置的定時(shí)任務(wù)周期來定時(shí)拉取所有數(shù)據(jù),在實(shí)現(xiàn)該 CMDB 插件時(shí),也請(qǐng)關(guān)注 CMDB 服務(wù)本身的性能,采取合適的策略。
查詢實(shí)體事件
List?getEntityEvents(long?timestamp);這個(gè)方法意在獲取最近一段時(shí)間內(nèi)實(shí)體的變更消息,增量的去拉取變更的實(shí)體。因?yàn)?Nacos 不會(huì)實(shí)時(shí)去訪問 CMDB 插件查詢實(shí)體,需要這個(gè)拉取事件的方法來獲取實(shí)體的更新。參數(shù)里的 timestamp 為上一次拉取事件的時(shí)間,CMDB 插件可以選擇使用或者忽略這個(gè)參數(shù)。
CMDB 插件開發(fā)流程
具體步驟如下:
????<groupId>com.alibaba.nacosgroupId>
????<artifactId>nacos-apiartifactId>
????<version>0.7.0version>
dependency>
??<groupId>org.apache.maven.pluginsgroupId>
??<artifactId>maven-assembly-pluginartifactId>
??<configuration>
??????<descriptorRefs>
??????????<descriptorRef>jar-with-dependenciesdescriptorRef>
??????descriptorRefs>
??configuration>
plugin>
?private?int?index?=1?;
}
使用 Selector 實(shí)現(xiàn)同機(jī)房?jī)?yōu)先訪問
通過 CMDB 的數(shù)據(jù)就可以實(shí)現(xiàn)多種靈活的負(fù)載均衡策略,下面舉例來說明如何使用 CMDB 數(shù)據(jù)和 Selector 來實(shí)現(xiàn)就近訪問。
????site:?x11
22.22.22.22
????site:?x12
33.33.33.33
????site:?x11
44.44.44.44
????site:?x12
55.55.55.55
????site:?x13
11.11.11.11、22.22.22.22、33.33.33.33、44.44.44.44和55.55.55.55.55都包含了標(biāo)簽site,且它們對(duì)應(yīng)的值分別為x11、x12、x11、x12、x13。
我們先注冊(cè)一個(gè)服務(wù),下面掛載IP11.11.11.11和22.22.22.22。
將能夠?qū)崿F(xiàn)基于同labelName優(yōu)先的負(fù)載均衡策略。
然后假設(shè)服務(wù)消費(fèi)者的IP分別為33.33.33.33、44.44.44.44和55.55.55.55,它們?cè)谑褂萌缦陆涌诓樵兎?wù)實(shí)例列表:
以上就是 Nacos 提供的 CMDB 實(shí)現(xiàn)微服務(wù)的就近訪問的簡(jiǎn)單案例學(xué)習(xí)內(nèi)容了!更多內(nèi)容,推薦大家去他的官網(wǎng)閱讀官方文檔。
總結(jié)
以上是生活随笔為你收集整理的nacos使用_使用Nacos的CMDB实现微服务的就近访问!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。