Dubbo 2.7.5 引入了服務(wù)自省特性,今天就來(lái)聊一下這個(gè)特性相關(guān)的內(nèi)容。我們先從 Dubbo 引入應(yīng)用級(jí)服務(wù)模型說(shuō)起。
應(yīng)用級(jí)服務(wù)模型
Dubbo 之前的服務(wù)是接口級(jí)的,即 com.abc.UserService 這樣一個(gè) Java 接口就表示一個(gè)服務(wù)。一個(gè)應(yīng)用里能包含多個(gè)服務(wù)。而 Spring Cloud 和 Kubernetes 的服務(wù)是應(yīng)用級(jí),即 IP + Port 表示一個(gè)服務(wù)。Dubbo 的接口級(jí)服務(wù)模型包含的信息更完整,不僅包含地址信息,也包含接口信息,但這種設(shè)計(jì)產(chǎn)生的服務(wù)信息過(guò)多,而且有很多冗余信息。這樣在大規(guī)模分布式系統(tǒng)中會(huì)導(dǎo)致服務(wù)注冊(cè)中心壓力過(guò)大,網(wǎng)絡(luò)開(kāi)銷(xiāo)和 Consumer 端內(nèi)存開(kāi)銷(xiāo)也會(huì)很大。
Dubbo 為了與 Spring Cloud、Kubernetes 的服務(wù)模型保持一致,更好地互聯(lián)互通和集成,在 2.7.5 版本中引入了應(yīng)用級(jí)服務(wù)模型。通常來(lái)說(shuō),一個(gè)應(yīng)用包含3至5個(gè)接口,因此,使用應(yīng)用級(jí)服務(wù)模型,可使數(shù)據(jù)推送、內(nèi)存占用降低至少60%。
所以,Dubbo 引入應(yīng)用級(jí)服務(wù)的目的有兩個(gè):一是降低服務(wù)注冊(cè)中心壓力,支持更大規(guī)模 Dubbo 微服務(wù)的治理;二是與 Spring Cloud、Kubernetes 服務(wù)模型保持一致,為互聯(lián)互通和集成打基礎(chǔ)。
應(yīng)用與接口的映射關(guān)系
Dubbo 中的一個(gè)服務(wù)完整標(biāo)識(shí)包含協(xié)議、接口、版本、服務(wù)組 (${protocol}:${interface}:${version}:${group}
)。在引入應(yīng)用級(jí)服務(wù)后,Consumer 需要根據(jù)服務(wù)標(biāo)識(shí)找到對(duì)應(yīng)的應(yīng)用,然后在根據(jù)服務(wù)注冊(cè)中心的數(shù)據(jù)找到服務(wù)對(duì)應(yīng)的地址。因此,需要有地方維護(hù)服務(wù)標(biāo)識(shí) -> 應(yīng)用的映射。Dubbo 提供了兩種方式實(shí)現(xiàn)這一點(diǎn):中心配置和本地配置。
中心配置使用配置中心實(shí)現(xiàn)(有些繞口),目前能作為 Dubbo 配置中心的有 ZK、Consul 和 Nacos。
本地配置方式則需要在代碼或外部配置文件中維護(hù)服務(wù)標(biāo)識(shí)與應(yīng)用的映射(代碼示例可見(jiàn)小馬哥的文章)。
引入應(yīng)用與接口配置設(shè)計(jì)后 Dubbo 架構(gòu)如下(再次引用自小馬哥的文章):
(其中服務(wù)對(duì)應(yīng)我文中的應(yīng)用,Service 對(duì)應(yīng)我文中的接口)
元數(shù)據(jù)服務(wù)
這樣就夠了嗎?不是。引入應(yīng)用級(jí)服務(wù)特性后,注冊(cè)中心里的數(shù)據(jù)主要就是應(yīng)用地址信息,配置信息主要是接口與應(yīng)用的映射,但真正要調(diào)用起來(lái)還需要更多信息,這些就是元數(shù)據(jù),除了 IP、端口等信息外,還有比如參數(shù)數(shù)據(jù),這些是注冊(cè)中心和配置(中心)所沒(méi)有的數(shù)據(jù)。
因此,Dubbo 2.7.5 引入元數(shù)據(jù)服務(wù),元數(shù)據(jù)服務(wù)也是一個(gè) Dubbo 服務(wù)(接口),它用于描述其它 Dubbo 接口的接口(這就是 MetadataService 名字的由來(lái))。
Dubbo 2.7.0 引入了元數(shù)據(jù)中心,但是去中心化的元數(shù)據(jù)服務(wù)是更好的選擇。
引入元數(shù)據(jù)服務(wù)后的 Dubbo 架構(gòu)
小結(jié)
總結(jié)來(lái)說(shuō),引入服務(wù)自省以及應(yīng)用級(jí)服務(wù)模型特性后,Dubbo 注冊(cè)中心的數(shù)據(jù)量大幅降低,減少的數(shù)據(jù)在去重后轉(zhuǎn)移到了配置中心(或本地配置)和元數(shù)據(jù)服務(wù)中。通過(guò)這樣的改進(jìn),Dubbo 便能夠承載更大規(guī)模的微服務(wù)體系了,也能是注冊(cè)中心運(yùn)行的更加穩(wěn)定高效,節(jié)約網(wǎng)絡(luò)和內(nèi)存開(kāi)銷(xiāo)。
本文算是我在了解 Dubbo 2.7.5 服務(wù)自省特性后的一個(gè)總結(jié)。因?yàn)檫@個(gè)特性是目前最新的 Dubbo 特性之一,我本人既沒(méi)有實(shí)踐,查閱的文章也很有限,難免有描述錯(cuò)誤和不周的地方,所以歡迎大家指正和交流。
參考
- 小馬哥 - Apache dubbo 服務(wù)自省架構(gòu)設(shè)計(jì):https://mercyblitz.github.io/2020/05/11/Apache-Dubbo-%E6%9C%8D%E5%8A%A1%E8%87%AA%E7%9C%81%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/
- 阿里巴巴中間件 - Dubbo 邁出云原生重要一步 - 應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)解析:https://mp.weixin.qq.com/s/m26_VnEwLSFIlscyEU_pTg