本文代碼地址
- https://github.com/Colinlyj210/spring-cloud-demo
- https://github.com/Colinlyj210/spring-cloud-demo-config
Spring Cloud大家庭
- Eureka:服務(wù)注冊和發(fā)現(xiàn)組件
- Ribbon:負(fù)載均衡
- Hystrix:熔斷組件
- Config:統(tǒng)一配置管理
- Zuul:路由網(wǎng)關(guān)
- Bus:消息總線
- Sleuth:分布式鏈路追蹤
- ...

Eureka
Spring Cloud Eureka提供服務(wù)端與客戶端,服務(wù)端即是服務(wù)注冊中心,客戶端完成注冊與發(fā)現(xiàn)。

Ribbon
在微服務(wù)中使用Ribbon實(shí)現(xiàn)負(fù)載均衡,Ribbon先從Eureka Server中獲取列表,然后根據(jù)負(fù)載均衡算法進(jìn)行負(fù)載均衡,將請(qǐng)求轉(zhuǎn)發(fā)到其他微服務(wù)。

Hystrix
由于網(wǎng)絡(luò)原因或者自身的原因,服務(wù)并不能保證100%可用,如果單個(gè)服務(wù)出現(xiàn)問題,調(diào)用這個(gè)服務(wù)就會(huì)出現(xiàn)線程阻塞,此時(shí)若有大量的請(qǐng)求涌入,Servlet容器的線程資源會(huì)被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)之間的依賴性,故障會(huì)傳播,會(huì)對(duì)整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果,這就是服務(wù)故障的“雪崩”效應(yīng)。為了解決這個(gè)問題,業(yè)界提出了斷路器模型。

Config
在分布式系統(tǒng)中,由于服務(wù)數(shù)量巨多,為了方便服務(wù)配置文件統(tǒng)一管理,實(shí)時(shí)更新,所以需要分布式配置中心組件。在Spring Cloud中,有分布式配置中心組件spring cloud config ,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中(即本地),也支持放在遠(yuǎn)程Git倉庫中。在spring cloud config 組件中,分兩個(gè)角色,一是config server,二是config client。


Zuul
Zuul的主要功能是路由轉(zhuǎn)發(fā)和過濾器。路由功能是微服務(wù)的一部分,比如/api/user轉(zhuǎn)發(fā)到到user服務(wù),/api/shop轉(zhuǎn)發(fā)到到shop服務(wù)。zuul默認(rèn)和Ribbon結(jié)合實(shí)現(xiàn)了負(fù)載均衡的功能。
Zuul有以下等功能:
- Dynamic Routing
- Authentication
- Security
- Static Response handling
- Stress Testing
- Service Migration
- Load Shedding

Bus
Spring Cloud Bus 將分布式的節(jié)點(diǎn)用輕量的消息代理連接起來。它可以用于廣播配置文件的更改或者服務(wù)之間的通訊,也可以用于監(jiān)控。當(dāng)git文件更改的時(shí)候,通過pc端用post 向端口為8882的config-client發(fā)送請(qǐng)求/bus/refresh/;此時(shí)8882端口會(huì)發(fā)送一個(gè)消息,由消息總線向其他服務(wù)傳遞,從而使整個(gè)微服務(wù)集群都達(dá)到更新配置文件。(Webhook)

Sleuth
微服務(wù)架構(gòu)上通過業(yè)務(wù)來劃分服務(wù)的,通過REST調(diào)用,對(duì)外暴露的一個(gè)接口,可能需要很多個(gè)服務(wù)協(xié)同才能完成這個(gè)接口功能,如果鏈路上任何一個(gè)服務(wù)出現(xiàn)問題或者網(wǎng)絡(luò)超時(shí),都會(huì)形成導(dǎo)致接口調(diào)用失敗。隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會(huì)越來越復(fù)雜。Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相應(yīng)的依賴即可。
Spring Cloud VS Dubbo
Dubbo

Spring Cloud 與Dubbo核心架構(gòu)要素對(duì)比
| 微服務(wù)關(guān)注點(diǎn) | Spring Cloud | Dubbo |
|---|---|---|
| 服務(wù)注冊中心 | Eureka | Zookeeper |
| 服務(wù)調(diào)用方式 | REST API | RPC |
| 服務(wù)網(wǎng)關(guān) | Zuul | 無 |
| 斷路器 | Hystrix | 不完善 |
| 分布式配置 | Config | 無 |
| 負(fù)載均衡 | Ribbon | 自帶 |
| 分布式追蹤 | Spring Cloud Sleuth | 無 |
| 消息總線 | Spring Cloud Bus | 無 |
? Dubbo 只是實(shí)現(xiàn)了服務(wù)治理,而 Spring Cloud 子項(xiàng)目分別覆蓋了微服務(wù)架構(gòu)下的眾多部件,服務(wù)治理只是其中的一個(gè)方面。
? Dubbo 提供了各種 Filter,對(duì)于上述中“無”的要素,可以通過擴(kuò)展 Filter 來完善。例如:
? 分布式配置:可以使用淘寶的 diamond、百度的 disconf 來實(shí)現(xiàn)分布式配置管理。
? 服務(wù)跟蹤:可以使用京東開源的 Hydra,或者擴(kuò)展 Filter 用 Zippin 來做服務(wù)跟蹤。
? 批量任務(wù):可以使用當(dāng)當(dāng)開源的 Elastic-Job、tbschedule。
從核心要素來看,Spring Cloud 更勝一籌,在開發(fā)過程中只要整合 Spring Cloud 的子項(xiàng)目就可以順利的完成各種組件的融合,而 Dubbo 卻需要通過實(shí)現(xiàn)各種 Filter 來做定制,開發(fā)成本以及技術(shù)難度略高。
通訊協(xié)議
Dubbo 使用 RPC 通訊協(xié)議,提供序列化方式如下:
- Dubbo:Dubbo 缺省協(xié)議采用單一長連接和 NIO 異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。
- RMI:RMI 協(xié)議采用 JDK 標(biāo)準(zhǔn)的 java.rmi.* 實(shí)現(xiàn),采用阻塞式短連接和 JDK 標(biāo)準(zhǔn)序列化方式。
- Hessian:Hessian 協(xié)議用于集成 Hessian 的服務(wù),Hessian 底層采用 HTTP 通訊,采用 Servlet 暴露服務(wù),Dubbo 缺省內(nèi)嵌 Jetty 作為服務(wù)器實(shí)現(xiàn)。
- HTTP:采用 Spring 的 Http Invoker 實(shí)現(xiàn)。
- Webservice:基于 CXF 的 frontend-simple 和 transports-http 實(shí)現(xiàn)。
Spring Cloud 使用 HTTP 協(xié)議的 REST API。
性能比較

Dubbo 支持各種通信協(xié)議,而且消費(fèi)方和服務(wù)方使用長鏈接方式交互,通信速度上略勝 Spring Cloud,如果對(duì)于系統(tǒng)的響應(yīng)時(shí)間有嚴(yán)格要求,長鏈接更合適。
服務(wù)依賴方式
Dubbo需要為每個(gè)微服務(wù)定義各自的 Interface 接口,并通過持續(xù)集成發(fā)布到私有倉庫中。調(diào)用方應(yīng)用對(duì)微服務(wù)提供的抽象接口存在強(qiáng)依賴關(guān)系,開發(fā)、測試、集成環(huán)境都需要嚴(yán)格的管理版本依賴。
Spring Cloud 通過 Json 交互,省略了版本管理的問題,但是具體字段含義需要統(tǒng)一管理,自身 Rest API 方式交互,為跨平臺(tái)調(diào)用奠定了基礎(chǔ)。
組件運(yùn)行流程
Dubbo 需要自己開發(fā)一套 API 網(wǎng)關(guān),而 Spring Cloud 則可以通過 Zuul 配置即可完成網(wǎng)關(guān)定制。
Kubernates
Kubernates是一個(gè)容器集群管理系統(tǒng),為容器化的應(yīng)用程序提供部署運(yùn)行、維護(hù)、擴(kuò)展、資源調(diào)度、服務(wù)發(fā)現(xiàn)等功能。Kubernates是Google運(yùn)行Borg大規(guī)模系統(tǒng)達(dá)15年之久的一個(gè)經(jīng)驗(yàn)總結(jié)。它結(jié)合了社區(qū)的最佳創(chuàng)意和實(shí)踐,旨在幫助開發(fā)人員將容器打包、動(dòng)態(tài)編排,同時(shí)幫助各大公司向微服務(wù)方向進(jìn)行技術(shù)演進(jìn)。
Kubernates VS Spring Cloud
| 服務(wù)關(guān)注點(diǎn) | Spring Cloud | Kubernates |
|---|---|---|
| 配置管理 | Config | Kubernates ConfigMap |
| 服務(wù)發(fā)現(xiàn) | Eureka | Kubernates Services |
| 負(fù)載均衡 | Ribbon | Kubernates Services |
| 網(wǎng)關(guān) | Zuul | Kubernates Services |
| 分布式追蹤 | Sleuth | Open tracing |
| 容錯(cuò) | Hystrix | Kubernates Health Check |
| 分布式日志 | ELK | EFK |
| 任務(wù)管理 | Spring Batch | Kubernates Jobs |
Kubernates是支持多語言,是一個(gè)容器管理平臺(tái),使程序容器化,并在容器管理上提供微服務(wù)功能。
除了提供基本的構(gòu)建微服務(wù)功能外,還提供了環(huán)境、資源限制、管理應(yīng)用程序生命周期的功能。Kubernates更像是一個(gè)平臺(tái),而Spring Cloud是一個(gè)框架。
Kubernates面向DevOps人員,普通開發(fā)人員需要學(xué)習(xí)很多這方面的知識(shí),而且新特性更新快,需要DevOps人員學(xué)習(xí)跟進(jìn),學(xué)習(xí)成本非常高。