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