您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何打通CMDB實(shí)現(xiàn)就近訪問,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
CMDB在企業(yè)中,一般用于存放與機(jī)器設(shè)備、應(yīng)用、服務(wù)等相關(guān)的元數(shù)據(jù)。當(dāng)企業(yè)的機(jī)器及應(yīng)用達(dá)到一定規(guī)模后就需要這樣一個(gè)系統(tǒng)來存儲和管理它們的元數(shù)據(jù)。有一些廣泛使用的屬性,例如機(jī)器的IP、主機(jī)名、機(jī)房、應(yīng)用、region等,這些數(shù)據(jù)一般會在機(jī)器部署時(shí)錄入到CMDB,運(yùn)維或者監(jiān)控平臺會使用這些數(shù)據(jù)進(jìn)行展示或者相關(guān)的運(yùn)維操作。
在服務(wù)進(jìn)行多機(jī)房或者多地域部署時(shí),跨地域的服務(wù)訪問往往延遲較高,一個(gè)城市內(nèi)的機(jī)房間的典型網(wǎng)絡(luò)延遲在1ms左右,而跨城市的網(wǎng)絡(luò)延遲,例如上海到北京大概為30ms。此時(shí)自然而然的一個(gè)想法就是能不能讓服務(wù)消費(fèi)者和服務(wù)提供者進(jìn)行同地域訪問。我們在集團(tuán)內(nèi)部的實(shí)踐中,這樣的需求是通過和CMDB打通來實(shí)現(xiàn)的。在Nacos的服務(wù)發(fā)現(xiàn)組件中,對接CMDB,然后通過配置的訪問規(guī)則,來實(shí)現(xiàn)服務(wù)消費(fèi)者到服務(wù)提供者的同地域優(yōu)先。
cdn.nlark.com/lark/0/2018/png/15356/1544702277705-0bbfca60-6629-477c-92bb-1a690e68f9cd.png">
圖1 服務(wù)的同地域優(yōu)先訪問
這實(shí)際上就是一種負(fù)載均衡策略,在Nacos的規(guī)劃中,豐富的服務(wù)端的可配置負(fù)載均衡策略是我們的重要發(fā)展方向,這與當(dāng)前已有的注冊中心產(chǎn)品不太一樣。在設(shè)計(jì)如何在開源的場景中,支持就近訪問的時(shí)候,與企業(yè)自帶的CMDB集成是我們考慮的一個(gè)核心問題。除此之外,我們也在考慮將Nacos自身擴(kuò)展為一個(gè)實(shí)現(xiàn)基礎(chǔ)功能的CMDB。無論如何,我們都需要能夠從某個(gè)地方獲取IP的環(huán)境信息,這些信息要么是從企業(yè)的CMDB中查詢而來,要么是從自己內(nèi)置的存儲中查詢而來。
先不考慮如何將CMDB的數(shù)據(jù)應(yīng)用于負(fù)載均衡,我們需要首先在Nacos里將CMDB的數(shù)據(jù)通過某種方法獲取。在實(shí)際使用中,基本上每個(gè)公司都會通過購買或者自研搭建自己的CMDB,那么為了能夠解耦各個(gè)企業(yè)的CMDB具體實(shí)現(xiàn),一個(gè)比較好的策略是使用SPI機(jī)制,約定CMDB的抽象調(diào)用接口,由各個(gè)企業(yè)添加自己的CMDB插件,無需任何代碼上的重新構(gòu)建,即可在運(yùn)行狀態(tài)下對接上企業(yè)的CMDB。
圖2 Nacos CMDB SPI機(jī)制原理
如圖2所示,Nacos定義了一個(gè)SPI接口,里面包含了與第三方CMDB約定的一些方法。用戶依照約定實(shí)現(xiàn)了相應(yīng)的SPI接口后,將實(shí)現(xiàn)打成jar包放置到Nacos安裝目錄下,重啟Nacos即可讓Nacos與CMDB的數(shù)據(jù)打通。整個(gè)流程并不復(fù)雜,但是理解CMDB SPI接口里方法和相應(yīng)概念的含義不太簡單。在這里對CMDB機(jī)制的相關(guān)概念和接口含義做一個(gè)詳細(xì)說明。
實(shí)體是作為CMDB里數(shù)據(jù)的承載方,在一般的CMDB中,一個(gè)實(shí)體可以指一個(gè)IP、應(yīng)用或者服務(wù)。而這個(gè)實(shí)體會有很多屬性,例如IP的機(jī)房信息,服務(wù)的版本信息等。
我們并不限定實(shí)體一定是IP、應(yīng)用或者服務(wù),這取決于實(shí)際的業(yè)務(wù)場景。Nacos有計(jì)劃在未來支持不同的實(shí)體類型,不過就目前來說,服務(wù)發(fā)現(xiàn)需要的實(shí)體類型是IP。
Label是我們抽象出的Entity屬性,Label定義為一個(gè)描述Entity屬性的K-V鍵值對。Label的key和value的取值范圍一般都是預(yù)先定義好的,當(dāng)需要對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í)體的標(biāo)簽的變更事件。當(dāng)CMDB的實(shí)體屬性發(fā)生變化,需要有一個(gè)事件機(jī)制來通知所有訂閱方。為了保證實(shí)體事件攜帶的變更信息是最新準(zhǔn)確的,這個(gè)事件里只會包含變更的實(shí)體的標(biāo)識以及變更事件的類型,不會包含變更的標(biāo)簽的值。
在設(shè)計(jì)與CMDB交互接口的時(shí)候,我們參考了內(nèi)部對CMDB的訪問接口,并與若干個(gè)外部客戶進(jìn)行了討論。我們最終確定了以下要求第三方CMDB插件必須實(shí)現(xiàn)的接口:
Set<String> getLabelNames();
這個(gè)方法將返回CMDB中需要被Nacos識別的標(biāo)簽名集合,CMDB插件可以按需決定返回什么標(biāo)簽個(gè)Nacos。不在這個(gè)集合的標(biāo)簽將會被Nacos忽略,即使這個(gè)標(biāo)簽出現(xiàn)在實(shí)體的屬性里。我們允許這個(gè)集合會在運(yùn)行時(shí)動態(tài)變化,Nacos會定時(shí)去調(diào)用這個(gè)接口刷新標(biāo)簽集合。
Set<String> getEntityTypes();
獲取CMDB里的實(shí)體的類型集合,不在這個(gè)集合的實(shí)體類型會被Nacos忽略。服務(wù)發(fā)現(xiàn)模塊目前需要的實(shí)體類似是ip,如果想要通過打通CMDB數(shù)據(jù)來實(shí)現(xiàn)服務(wù)的高級負(fù)載均衡,請務(wù)必在返回集合里包含“ip”。
Label getLabel(String labelName);
獲取標(biāo)簽的詳細(xì)信息。返回的Label類里包含標(biāo)簽的名字和標(biāo)簽值的集合。如果某個(gè)實(shí)體的這個(gè)標(biāo)簽的值不在標(biāo)簽值集合里,將會被視為無效。
String getLabelValue(String entityName, String entityType, String labelName); Map<String, String> getLabelValues(String entityName, String entityType);
這里包含兩個(gè)方法,一個(gè)是獲取實(shí)體某一個(gè)標(biāo)簽名對應(yīng)的值,一個(gè)是獲取實(shí)體所有標(biāo)簽的鍵值對。參數(shù)里包含實(shí)體的值和實(shí)體的類型。注意,這個(gè)方法并不會在每次在Nacos內(nèi)部觸發(fā)查詢時(shí)去調(diào)用,Nacos內(nèi)部有一個(gè)CMDB數(shù)據(jù)的緩存,只有當(dāng)這個(gè)緩存失效或者不存在時(shí),才會去訪問CMDB插件查詢數(shù)據(jù)。為了讓CMDB插件的實(shí)現(xiàn)盡量簡單,我們在Nacos內(nèi)部實(shí)現(xiàn)了相應(yīng)的緩存和刷新邏輯。
Map<String, Map<String, Entity>> 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í)體方法后面可能會進(jìn)行擴(kuò)展,比查詢所有標(biāo)簽獲取的信息要更多。
查詢所有實(shí)體則是一次性將CMDB的所有數(shù)據(jù)拉取過來,該方法可能會比較消耗性能,無論是對于Nacos還是CMDB。Nacos內(nèi)部調(diào)用該方法的策略是通過可配置的定時(shí)任務(wù)周期來定時(shí)拉取所有數(shù)據(jù),在實(shí)現(xiàn)該CMDB插件時(shí),也請關(guān)注CMDB服務(wù)本身的性能,采取合適的策略。
List<EntityEvent> getEntityEvents(long timestamp);
這個(gè)方法意在獲取最近一段時(shí)間內(nèi)實(shí)體的變更消息,增量的去拉取變更的實(shí)體。因?yàn)镹acos不會實(shí)時(shí)去訪問CMDB插件查詢實(shí)體,需要這個(gè)拉取事件的方法來獲取實(shí)體的更新。參數(shù)里的timestamp為上一次拉取事件的時(shí)間,CMDB插件可以選擇使用或者忽略這個(gè)參數(shù)。
參考 https://github.com/nacos-group/nacos-examples,這里已經(jīng)給出了一個(gè)示例plugin實(shí)現(xiàn)。
具體步驟如下:
新建一個(gè)maven工程,引入依賴nacos-api:
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-api</artifactId> <version>0.7.0</version> </dependency>
引入打包插件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin>
定義實(shí)現(xiàn)類,繼承com.alibaba.nacos.api.cmdb.CmdbService,并實(shí)現(xiàn)相關(guān)方法。
在src/main/resource/目錄下新建目錄:META-INF/services
代碼自測完成后,執(zhí)行命令進(jìn)行打包:
mvn package assembly:single -Dmaven.test.skip=true
將target目錄下的包含依賴的jar包上傳到nacos CMDB插件目錄:
{nacos.home}/plugins/cmdb
在nacos的application.properties里打開加載插件開關(guān):
nacos.cmdb.loadDataAtStart=true
重啟nacos Server,即可加載到您實(shí)現(xiàn)的nacos-cmdb插件獲取您的CMDB數(shù)據(jù)。
在拿到CMDB的數(shù)據(jù)之后,就可以運(yùn)用CMDB數(shù)據(jù)的強(qiáng)大威力來實(shí)現(xiàn)多種靈活的負(fù)載均衡策略了,下面舉例來說明如何使用CMDB數(shù)據(jù)和Selector來實(shí)現(xiàn)就近訪問。
假設(shè)目前Nacos已經(jīng)通過CMDB拿到了一些IP的機(jī)房信息,且它們對應(yīng)的標(biāo)簽信息如下:
11.11.11.11 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,且它們對應(yīng)的值分別為x11、x12、x11、x12、x13。我們先注冊一個(gè)服務(wù),下面掛載IP11.11.11.11和22.22.22.22。
圖4 編輯服務(wù)路由類型
這里我們將服務(wù)路由類型選擇為標(biāo)簽,然后輸入標(biāo)簽的表達(dá)式:
CONSUMER.label.site = PROVIDER.label.site
這個(gè)表達(dá)式的格式和我們抽象的Selector機(jī)制有關(guān),具體將會在另外一篇文章中介紹。在這里您需要記住的就是,任何一個(gè)如下格式的表達(dá)式:
CONSUMER.label.labelName = PROVIDER.label.labelName
將能夠?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,它們在使用如下接口查詢服務(wù)實(shí)例列表:
naming.selectInstances("nacos.test.1", true)
那么不同的消費(fèi)者,將獲取到不同的實(shí)例列表。33.33.33.33獲取到11.11.11.11,44.44.44.44將獲取到22.22.22.22,而55.55.55.55將同時(shí)獲取到11.11.11.11和22.22.22.22。
上述內(nèi)容就是如何打通CMDB實(shí)現(xiàn)就近訪問,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。