日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nacos使用_使用Nacos的CMDB实现微服务的就近访问!

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 插件開發流程

具體步驟如下:

  • 新建一個 maven 工程,引入依賴 nacos-api:
  • <dependency>
    ????<groupId>com.alibaba.nacosgroupId>
    ????<artifactId>nacos-apiartifactId>
    ????<version>0.7.0version>
    dependency>
  • 引入打包插件:
  • <plugin>
    ??<groupId>org.apache.maven.pluginsgroupId>
    ??<artifactId>maven-assembly-pluginartifactId>
    ??<configuration>
    ??????<descriptorRefs>
    ??????????<descriptorRef>jar-with-dependenciesdescriptorRef>
    ??????descriptorRefs>
    ??configuration>
    plugin>
  • 定義實現類,繼承 com.alibaba.nacos.api.cmdb.CmdbService,并實現相關方法。
  • public?class?ExampleCmdbServiceImple?implements?CmdbService{
    ?private?int?index?=1?;
    }
  • 在src/main/resource/目錄下新建目錄:META-INF/services
  • 在src/main/resources/META-INF/services目錄下新建文件com.alibaba.nacos.api.cmdb.CmdbService,并在文件里將第三步中創建的實現類全名寫入該文件:
  • 執行命令進行打包:
  • mvn?package?assembly:single?-Dmaven.test.skip=true
  • 將target目錄下的包含依賴的jar包上傳到nacos CMDB插件目錄:
  • {nacos.home}/plugins/cmdb
  • 在nacos的application.properties里打開加載插件開關:
  • nacos.cmdb.loadDataAtStart=true
  • 重啟nacos Server,即可加載到您實現的nacos-cmdb插件獲取您的CMDB數據。
  • 使用 Selector 實現同機房優先訪問

    通過 CMDB 的數據就可以實現多種靈活的負載均衡策略,下面舉例來說明如何使用 CMDB 數據和 Selector 來實現就近訪問。

  • Nacos 通過 CMDB 獲取 IP 機房信息,對應的標簽信息如下:
  • 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都包含了標簽site,且它們對應的值分別為x11、x12、x11、x12、x13。

  • 我們先注冊一個服務,下面掛載IP11.11.11.11和22.22.22.22。

  • 然后我們修改服務的“服務路由類型”,并配置為基于同site優先的服務路由:
  • 這里我們將服務路由類型選擇為標簽,然后輸入標簽的表達式:
  • CONSUMER.label.site?=?PROVIDER.label.site
  • 這個表達式的格式和我們抽象的Selector機制有關,具體將會在另外一篇文章中介紹。在這里您需要記住的就是,任何一個如下格式的表達式:
  • CONSUMER.label.labelName?=?PROVIDER.label.labelName
  • 將能夠實現基于同labelName優先的負載均衡策略。

  • 然后假設服務消費者的IP分別為33.33.33.33、44.44.44.44和55.55.55.55,它們在使用如下接口查詢服務實例列表:

  • naming.selectInstances("nacos.test.1",?true)
  • 那么不同的消費者,將獲取到不同的實例列表。33.33.33.33獲取到11.11.11.11,44.44.44.44將獲取到22.22.22.22,而55.55.55.55將同時獲取到11.11.11.11和22.22.22.22。
  • 以上就是 Nacos 提供的 CMDB 實現微服務的就近訪問的簡單案例學習內容了!更多內容,推薦大家去他的官網閱讀官方文檔。

    總結

    以上是生活随笔為你收集整理的nacos使用_使用Nacos的CMDB实现微服务的就近访问!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。