分布式技術(shù)原理與實(shí)戰(zhàn)45講--第19講:Dubbo v Spring Cloud:兩大技術(shù)棧如何選型
提到微服務(wù)開源框架,不可不說的是 Dubbo 和 Spring Cloud,這兩大框架應(yīng)該是大家最熟悉的微服務(wù)解決方案,也是面試中的熱點(diǎn)。這一課時(shí)就梳理下 Dubbo 和 Spring Cloud 的應(yīng)用特性,以及兩個(gè)組件的功能對(duì)比。
Dubbo 應(yīng)用
Dubbo 是阿里開源的一個(gè)分布式服務(wù)框架,目的是支持高性能的遠(yuǎn)程服務(wù)調(diào)用,并且進(jìn)行相關(guān)的服務(wù)治理。在 RPC 遠(yuǎn)程服務(wù)這一課時(shí)我們也介紹過 Dubbo,從功能上,Dubbo 可以對(duì)標(biāo) gRPC、Thrift 等典型的 RPC 框架。
總體架構(gòu)
下面這張圖包含了 Dubbo 核心組件和調(diào)用流程:

包括了下面幾個(gè)角色:
Provider,也就是服務(wù)提供者,通過 Container 容器來承載;
Consumer,調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方;
Registry,服務(wù)注冊(cè)中心和發(fā)現(xiàn)中心;
Monitor,Dubbo 服務(wù)調(diào)用的控制臺(tái),用來統(tǒng)計(jì)和管理服務(wù)的調(diào)用信息;
Container,服務(wù)運(yùn)行的容器,比如 Tomcat 等。
應(yīng)用特性
Dubbo 是一個(gè)可擴(kuò)展性很強(qiáng)的組件,主要的特性如下。
(1)基于 SPI 的擴(kuò)展
SPI(Service Provider Interface)是 JDK 內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,JDK 原生的 SPI 加載方式不靈活,要獲取一個(gè)類的擴(kuò)展必須加載所有實(shí)現(xiàn)類,得到指定的實(shí)現(xiàn)類需要遍歷。
Dubbo 中增強(qiáng)了原生的 SPI 實(shí)現(xiàn),可以通過指定的擴(kuò)展類名稱來找到具體的實(shí)現(xiàn),這樣可以更好地進(jìn)行功能點(diǎn)擴(kuò)展。
(2)靈活的服務(wù)調(diào)用
Dubbo 作為一個(gè)優(yōu)秀的 RPC 解決方案,支持多種服務(wù)調(diào)用方式,針對(duì)服務(wù)端和消費(fèi)端的線程池、集群調(diào)用模式、異步和同步調(diào)用等都可以進(jìn)行靈活的配置。
(3)責(zé)任鏈和插件模式
Dubbo 的設(shè)計(jì)和實(shí)現(xiàn)采用了責(zé)任鏈模式,使用者可以在服務(wù)調(diào)用的責(zé)任鏈上,對(duì)各個(gè)環(huán)節(jié)進(jìn)行自定義實(shí)現(xiàn),也可通過這種方式,解決 Dubbo 自帶策略有限的問題。基于 SPI 和責(zé)任鏈模式,Dubbo 實(shí)現(xiàn)了一個(gè)類似微內(nèi)核加插件的設(shè)計(jì),整體的可擴(kuò)展性和靈活性都比較高。
(4)高級(jí)特性支持
Dubbo 對(duì)遠(yuǎn)程服務(wù)調(diào)用提供了非常細(xì)粒度的功能支持,比如服務(wù)發(fā)布支持 XML、注解等多種方式,調(diào)用可以選擇泛化調(diào)用、Mock 調(diào)用等。
Spring Cloud 應(yīng)用
Spring Cloud 基于 Spring Boot,是一系列組件的集成,為微服務(wù)開發(fā)提供一個(gè)比較全面的解決方案,包括了服務(wù)發(fā)現(xiàn)功能、配置管理功能、API 網(wǎng)關(guān)、限流熔斷組件、調(diào)用跟蹤等一系列的對(duì)應(yīng)實(shí)現(xiàn)。
總體架構(gòu)
Spring Cloud 的微服務(wù)組件都有多種選擇,典型的架構(gòu)圖如下圖所示:

整體服務(wù)調(diào)用流程如下:
外部請(qǐng)求通過 API 網(wǎng)關(guān),在網(wǎng)關(guān)層進(jìn)行相關(guān)處理;
Eureka 進(jìn)行服務(wù)發(fā)現(xiàn),包含健康檢查等;
Ribbon 進(jìn)行均衡負(fù)載,分發(fā)到后端的具體實(shí)例;
Hystrix 負(fù)責(zé)處理服務(wù)超時(shí)熔斷;
Zipkin 進(jìn)行鏈路跟蹤。
應(yīng)用特性
Spring Cloud 目前主要的解決方案包括 Spring Cloud Netflix 系列,以及 Spring Cloud Config、Spring Cloud Consul 等。
Spring Cloud 典型的應(yīng)用如下:
配置中心,一般使用 Spring Cloud Config 實(shí)現(xiàn),服務(wù)發(fā)現(xiàn)也可以管理部分配置;
服務(wù)發(fā)現(xiàn),使用 Eureka 實(shí)現(xiàn),也可以擴(kuò)展 Consul 等;
API 網(wǎng)關(guān),使用 Zuul 實(shí)現(xiàn),另外還有 Kong 等應(yīng)用;
負(fù)載均衡,使用 Ribbon 實(shí)現(xiàn),也可以選擇 Feign;
限流降級(jí),使用 Hystrix 實(shí)現(xiàn)熔斷機(jī)制,也可以選擇 Sentinel。
Dubbo 和 Spring Cloud 對(duì)比
可以看到,在介紹 Dubbo 時(shí),主要是從 RPC 服務(wù)調(diào)用的特性入手,而在介紹 Spring Cloud 時(shí),更多的是強(qiáng)調(diào)其在微服務(wù)方面提供的整體解決方案。
Dubbo 更多關(guān)注遠(yuǎn)程服務(wù)調(diào)用功能特性,Spring Cloud 則包含了整體的解決方案,可以認(rèn)為 Dubbo 支持的功能是 Spring Cloud 的子集。
功能對(duì)比
生產(chǎn)環(huán)境使用 Dubbo 組件實(shí)現(xiàn)服務(wù)調(diào)用,需要強(qiáng)依賴 ZooKeeper 注冊(cè)中心;如果要實(shí)現(xiàn)服務(wù)治理的周邊功能,比如配置中心、服務(wù)跟蹤等,則需要集成其他組件的支持。
注冊(cè)中心:需要依賴 ZooKeeper,其他注冊(cè)中心應(yīng)用較少。
分布式配置:可以使用 diamond,淘寶的開源組件來實(shí)現(xiàn)。
分布式調(diào)用跟蹤:應(yīng)用擴(kuò)展 Filter 用 Zippin 來做服務(wù)跟蹤。
限流降級(jí):可以使用開源的 Sentinel 組件,或者自定義 Filter 實(shí)現(xiàn)。
對(duì)于 Spring Cloud,提供的功能更加多樣,服務(wù)治理只是其中的一個(gè)方面,面向的是微服務(wù)整體的解決方案。
調(diào)用方式
Dubbo 使用 RPC 協(xié)議進(jìn)行通訊,支持多種序列化方式,包括 Dubbo 協(xié)議、Hessian、Kryo 等,如果針對(duì)特定的業(yè)務(wù)場景,用戶還可以擴(kuò)展自定義協(xié)議實(shí)現(xiàn)。
Spring Cloud 一般使用 HTTP 協(xié)議的 RESTful API 調(diào)用,RESTful 接口相比 RPC 更為靈活,服務(wù)提供方和調(diào)用方可以更好地解耦,不需要依賴額外的 jar 包等,更適合微服務(wù)的場景。從性能角度考慮,一般來說,會(huì)認(rèn)為 PRC 方式的性能更高,但是如果對(duì)請(qǐng)求時(shí)延不是特別敏感的業(yè)務(wù),是可以忽略這一點(diǎn)的。
服務(wù)發(fā)現(xiàn)
Dubbo 的服務(wù)發(fā)現(xiàn)通過注冊(cè)中心實(shí)現(xiàn),支持多種注冊(cè)中心,另外本地測試支持 Multicast、Simple 等簡單的服務(wù)發(fā)現(xiàn)方式。Spring Cloud 有各種服務(wù)發(fā)現(xiàn)組件,包括 Eureka、Consul、Nacos 等。前面提到過,ZooKeeper 實(shí)現(xiàn)的是 CAP 中的 CP 一致性,Spring Cloud 中的 Eureka 實(shí)現(xiàn)的是 AP 一致性,AP 更適合服務(wù)發(fā)現(xiàn)的場景。
開發(fā)成本
應(yīng)用 Dubbo 需要一定的開發(fā)成本,自定義功能需要實(shí)現(xiàn)各種 Filter 來做定制,使用 Spring Cloud 就很少有這個(gè)問題,因?yàn)楦鞣N功能都有了對(duì)應(yīng)的開源實(shí)現(xiàn),應(yīng)用起來更加簡單。特別是,如果項(xiàng)目中已經(jīng)應(yīng)用了 Spring 框架、Spring Boot 等技術(shù),可以更方便地集成 Spring Cloud,減少已有項(xiàng)目的遷移成本。
經(jīng)過上面的對(duì)比可以看出,Dubbo 和 Spring Cloud 的目標(biāo)不同,關(guān)注的是微服務(wù)實(shí)現(xiàn)的不同維度,Dubbo 看重遠(yuǎn)程服務(wù)調(diào)用,Spring Cloud 則是作為一個(gè)微服務(wù)生態(tài),覆蓋了從服務(wù)調(diào)用,到服務(wù)治理的各個(gè)場景。
總結(jié)
這一課時(shí)的內(nèi)容對(duì)比了微服務(wù)的兩大技術(shù)棧,分別介紹了 Dubbo 和 Spring Cloud 的架構(gòu),以及應(yīng)用特性。
Spring Cloud 從發(fā)展到現(xiàn)在,社區(qū)一直保持高度活躍,各類解決方案越來越豐富,另外,Dubbo 在近幾年又重啟維護(hù),發(fā)布了新的版本,并且也官宣了新的升級(jí)計(jì)劃,相信在兩大開源框架的加持下,會(huì)更好地提高大家的開發(fā)效率。