溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)

發(fā)布時間:2022-01-04 16:00:19 來源:億速云 閱讀:113 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)”吧!

1 引語

在 v1.5 以前,Dubbo-go 注冊模型都是以服務(wù)為維度的,直觀的理解可認(rèn)為其是接口維度。譬如注冊信息,按照服務(wù)維度模型其示例如下:

"com.xxx.User":[
  {"name":"instance1", "ip":"127.0.0.1", "metadata":{"timeout":1000}},
  {"name":"instance2", "ip":"127.0.0.2", "metadata":{"timeout":2000}},
  {"name":"instance3", "ip":"127.0.0.3", "metadata":{"timeout":3000}}, 
]

這種模式的好處是不言而喻的,簡單直觀,提供了細(xì)粒度的服務(wù)控制手段。

而近兩年,隨著云時代的到來,這種模式就暴露了不足:

  1. 主流的注冊模型都是應(yīng)用維度的;

  2. 以服務(wù)維度來注冊,那么規(guī)模與服務(wù)數(shù)量成正比,大規(guī)模集群之下,注冊中心壓力非常大;

2 Dubbogo v1.5.0 的新注冊模型

這次 Dubbo-go 支持了新的注冊模型,也就是應(yīng)用維度的注冊模型。簡單而言,在應(yīng)用維度注冊下,其注冊信息類似:

"application1": [
  {"name":"instance1", "ip":"127.0.0.1", "metadata":{}},
  {"name":"instance2", "ip":"127.0.0.2", "metadata":{}},
  {"name":"instanceN", "ip":"127.0.0.3", "metadata":{}}
]

在此模式之下,可以看到注冊信息將會大幅度減少,集群規(guī)模只與實例數(shù)量相關(guān)。

與此同時,在實現(xiàn)這一個功能的時候,Dubbo-go 還希望保持兩個目標(biāo):

  1. 對用戶完全兼容,用戶遷移無感知;

  2. 保持住原本服務(wù)粒度上精細(xì)控制的能力——即保留現(xiàn)有的服務(wù)維度的元數(shù)據(jù);

因此 Dubbo-go 要著力解決以下幾點:

  1. 目前 Consumer 的配置是以接口為準(zhǔn)的,如何根據(jù)接口找到該接口對應(yīng)的應(yīng)用?例如,用戶配置了 com.xxx.User 服務(wù),那么,Dubbo-go 怎么知道這個服務(wù)是由哪個應(yīng)用來提供的呢?

  2. 在知道了是哪個應(yīng)用之后,可以從注冊中心拿到應(yīng)用的注冊信息,如實例信息等;那怎么知道 com.xxx.User 服務(wù)自身的元數(shù)據(jù)呢?

為了解決這兩個問題,在已有的注冊模型的基礎(chǔ)上,Dubbo-go 引入兩個額外的組件:ServiceNameMapping 和 MetadataService。

前者用于解決服務(wù)-應(yīng)用之間的映射,后者用于獲取服務(wù)的元數(shù)據(jù)。

由此,Dubbo-go 的應(yīng)用維度注冊模型就變?yōu)椋?/p>

Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)cdn.nlark.com/yuque/0/2020/png/755700/1595053608806-be43aed1-83b4-4a05-8d25-60a0c7fa5445.png">

2.1 ServiceNameMapping

ServiceNameMapping 并不復(fù)雜。考慮到一般人在 Consumer 側(cè)想要調(diào)用一個服務(wù),其十有八九是知道這個服務(wù)是哪個應(yīng)用提供的,于是 Dubbo-go 引入了新的配置項 provideBy

Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)

當(dāng)然,所謂 “十有八九”就是說有些時候確實不知道是服務(wù)是誰提供的,所以 Dubbo-go 還支持了基于配置中心的 ServiceNameMapping 實現(xiàn)。Dubbo-go 會用服務(wù)名作為 Key 從配置中心里面讀出對應(yīng)的應(yīng)用名。這意味著, Provider 啟動的時候,也會在配置中心將自身的 服務(wù)-應(yīng)用名映射 寫入配置中心。

2.2 MetadataService

MetadataService 稍微要復(fù)雜一點,有 remotelocal 兩種模式。

類似于前面的 ServiceNameMapping,Dubbo-go 提供了基于配置中心的 MetadataService 的實現(xiàn),即 remote 模式。Provider 啟動的時候,就會將服務(wù)的元數(shù)據(jù)寫進(jìn)去。

另外一種模式是 local 模式。Dubbo-go 可以直接將 MetadataService 看做是一個普通的微服務(wù),而后由 Provider 所提供。類似于:

Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)

由此帶來一個問題:

既然 Dubbo-go 將 MetadataService 看做是一個普通的服務(wù),那么 MetadataService 的元數(shù)據(jù),Consumer 該怎么獲得呢?這是一個典型的雞生蛋蛋生雞的問題。

Dubbo-go 的方案非常簡單粗暴,Provider 啟動的時候,不僅僅往注冊中心里面寫入應(yīng)用本身的信息,還要把它的 MetadataService 信息寫入。

這是一個應(yīng)用的注冊信息:

Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)

本質(zhì)上來說,應(yīng)用維度注冊信息 + 服務(wù)元數(shù)據(jù) = 服務(wù)維度注冊信息?;蛘哒f,應(yīng)用維度注冊,只是一種重新組織這些信息的方式。

3 差異與改進(jìn)

Dubbo-go v1.5.x 對標(biāo) Dubbo 2.7.5,可以認(rèn)為是參照 Dubbo 2.7.5 直接實現(xiàn)其 Go 源碼,但是考慮到 Java 和 Go 之間的語言差異,導(dǎo)致二者之間的實現(xiàn)不可能完全對等。

3.1 修訂版本號revision比對

Dubbo v2.7.x 在 MetadataService 注冊時,會對其 provider 應(yīng)用的所有服務(wù)接口的 hash 值做為修訂版本號寫入元數(shù)據(jù)中心,此 revision 是對所有接口的方法以及其參數(shù)總體的計算結(jié)果。其目的是減少 consumer 端到注冊中心的拉取次數(shù)。

在Go中用的計算 revision 的 hash 算法與 Java 是不一致的,而且 Go 與 Java 的方法簽名信息是不相同的,所以計算出來的 hash 值一定是不一樣的。

此不一致會導(dǎo)致如果Go應(yīng)用和Java應(yīng)用同時發(fā)布同一個服務(wù)的時候,Go服務(wù)和Java服務(wù)的修訂版本號必定是不相同的,Consumer需要分別緩存這兩個修訂版本的元數(shù)據(jù)。

3.2 應(yīng)用注冊時機(jī)

Dubbo-go v1.5.0 實現(xiàn)時,其中一個考量是全面向后兼容 v1.4.x。Dubbo-go v1.5.x 應(yīng)用 consumer 既可以調(diào)用 Dubbo-go v1.4.x 應(yīng)用的服務(wù),也可以調(diào)用 Dubbo v2.6.x 應(yīng)用的服務(wù),當(dāng)然也可以調(diào)用其對標(biāo)的 v2.7.x 應(yīng)用的服務(wù)。

為了達(dá)到兼容性,Dubbo-go v1.5.x 實現(xiàn)時面臨一個問題:Dubbo-go provider 應(yīng)用啟動時有一個服務(wù)啟動成功,把應(yīng)用信息注冊到元數(shù)據(jù)中心之后,就會把實例注冊到注冊中心,而 Dubbo 2.7.x 的 provider 應(yīng)用則是在其所有服務(wù)接口的信息注冊到元數(shù)據(jù)中心后才會注冊實例!

這個問題的后果就是:Dubbo-go v1.5.0 的 provider 每次發(fā)布接口到元數(shù)據(jù)中心的同時,都會觸發(fā)Dubbo-go v1.5.0 / Dubbo v2.7.x 的 consumer 應(yīng)用拉取 Dubbo-go v1.5.0 應(yīng)用信息,當(dāng)provider 發(fā)布的服務(wù)過多時 consumer 側(cè)性能損耗非常明顯!

Dubbo-go 在 v1.5.1 中已經(jīng)修復(fù)了這個問題,provider 在啟動時先將其全部服務(wù)接口發(fā)布到元數(shù)據(jù)中心,然后注冊實例到注冊中心,減少了 consumer 拉取元數(shù)據(jù)的次數(shù)。

感謝各位的閱讀,以上就是“Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Dubbo-go應(yīng)用維度注冊模型怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI