軟件是有生命的,你做出來(lái)的架構(gòu)決定了這個(gè)軟件它這一生是坎坷還是幸福看彼。
本文不是講解如何使用Spring Cloud的教程廊佩,而是探討Spring Cloud是什么,以及它誕生的背景和意義靖榕。
轉(zhuǎn)載自簡(jiǎn)書作者
原文鏈接::http://www.reibang.com/p/3899d7f47303
一标锄、背景
2008年以后,國(guó)內(nèi)互聯(lián)網(wǎng)行業(yè)飛速發(fā)展序矩,我們對(duì)軟件系統(tǒng)的需求已經(jīng)不再是過(guò)去”能用就行”這種很low的檔次了鸯绿,像搶紅包、雙十一這樣的活動(dòng)不斷逼迫我們?nèi)ネ黄栖浖到y(tǒng)的性能上限,傳統(tǒng)的IT企業(yè)”能用就行”的開發(fā)思想已經(jīng)不能滿足互聯(lián)網(wǎng)高并發(fā)瓶蝴、大流量的性能要求毒返。系統(tǒng)架構(gòu)走向分布式已經(jīng)是服務(wù)器開發(fā)領(lǐng)域解決該問(wèn)題唯一的出路,然而分布式系統(tǒng)由于天生的復(fù)雜度舷手,并不像開發(fā)單體應(yīng)用一樣把框架一堆就能搞定拧簸,因此各大互聯(lián)網(wǎng)公司都在投入技術(shù)力量研發(fā)自己的基礎(chǔ)設(shè)施。這里面比較有名的如阿里的開源項(xiàng)目dubbo, Netflix開發(fā)的一系列服務(wù)框架男窟。在這種“百花齊放”盆赤、重復(fù)造輪子的狀況下,必然要出現(xiàn)一種統(tǒng)一的標(biāo)準(zhǔn)來(lái)簡(jiǎn)化分布式系統(tǒng)的開發(fā)歉眷,Spring Cloud應(yīng)運(yùn)而生牺六。
二、Spring Cloud是什么
Spring Cloud是一系列框架的有序集合汗捡。它利用Spring Boot的開發(fā)便利性巧妙地簡(jiǎn)化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā)淑际,如服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心扇住、消息總線春缕、負(fù)載均衡、斷路器艘蹋、數(shù)據(jù)監(jiān)控等锄贼,都可以用Spring Boot的開發(fā)風(fēng)格做到一鍵啟動(dòng)和部署。Spring并沒有重復(fù)制造輪子女阀,它只是將目前各家公司開發(fā)的比較成熟宅荤、經(jīng)得起實(shí)際考驗(yàn)的服務(wù)框架組合起來(lái),通過(guò)Spring Boot風(fēng)格進(jìn)行再封裝屏蔽掉了復(fù)雜的配置和實(shí)現(xiàn)原理浸策,最終給開發(fā)者留出了一套簡(jiǎn)單易懂膘侮、易部署和易維護(hù)的分布式系統(tǒng)開發(fā)工具包。
Spring Cloud正是對(duì)Netflix的多個(gè)開源組件進(jìn)一步的封裝而成的榛,同時(shí)又實(shí)現(xiàn)了和云端平臺(tái),和Spring Boot開發(fā)框架很好的集成逻锐。
Spring Cloud是一個(gè)相對(duì)比較新的微服務(wù)框架夫晌,2016年才推出1.0的release版本. 雖然Spring Cloud時(shí)間最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系統(tǒng)解決方案。
Spring Cloud 為開發(fā)者提供了在分布式系統(tǒng)(配置管理昧诱,服務(wù)發(fā)現(xiàn)晓淀,熔斷,路由盏档,微代理凶掰,控制總線,一次性token,全居瑣懦窘,leader選舉前翎,分布式session,集群狀態(tài))中快速構(gòu)建的工具畅涂,使用Spring Cloud的開發(fā)者可以快速的啟動(dòng)服務(wù)或構(gòu)建應(yīng)用港华、同時(shí)能夠快速和云平臺(tái)資源進(jìn)行對(duì)接。
從上圖可以看出Spring Cloud各個(gè)組件相互配合午衰,合作支持了一套完整的微服務(wù)架構(gòu)立宜。
- 其中Eureka負(fù)責(zé)服務(wù)的注冊(cè)與發(fā)現(xiàn),很好將各服務(wù)連接起來(lái)
- Hystrix 負(fù)責(zé)監(jiān)控服務(wù)之間的調(diào)用情況臊岸,連續(xù)多次失敗進(jìn)行熔斷保護(hù)橙数。
- Hystrix dashboard,Turbine 負(fù)責(zé)監(jiān)控 Hystrix的熔斷情況,并給予圖形化的展示
- Spring Cloud Config 提供了統(tǒng)一的配置中心服務(wù)
- 當(dāng)配置文件發(fā)生變化的時(shí)候帅戒,Spring Cloud Bus 負(fù)責(zé)通知各服務(wù)去獲取最新的配置信息
- 所有對(duì)外的請(qǐng)求和服務(wù)灯帮,我們都通過(guò)Zuul來(lái)進(jìn)行轉(zhuǎn)發(fā),起到API網(wǎng)關(guān)的作用
- 最后我們使用Sleuth+Zipkin將所有的請(qǐng)求數(shù)據(jù)記錄下來(lái)蜘澜,方便我們進(jìn)行后續(xù)分析
Spring Cloud從設(shè)計(jì)之初就考慮了絕大多數(shù)互聯(lián)網(wǎng)公司架構(gòu)演化所需的功能施流,如服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心鄙信、消息總線瞪醋、負(fù)載均衡、斷路器装诡、數(shù)據(jù)監(jiān)控等银受。這些功能都是以插拔的形式提供出來(lái),方便我們系統(tǒng)架構(gòu)演進(jìn)的過(guò)程中鸦采,可以合理的選擇需要的組件進(jìn)行集成宾巍,從而在架構(gòu)演進(jìn)的過(guò)程中會(huì)更加平滑、順利渔伯。
微服務(wù)架構(gòu)是一種趨勢(shì)顶霞,Spring Cloud提供了標(biāo)準(zhǔn)化的、全站式的技術(shù)方案锣吼,意義可能會(huì)堪比當(dāng)前Servlet規(guī)范的誕生选浑,有效推進(jìn)服務(wù)端軟件系統(tǒng)技術(shù)水平的進(jìn)步。
三玄叠、Spring Cloud組成
Spring Cloud的子項(xiàng)目古徒,大致可分成兩類,一類是對(duì)現(xiàn)有成熟框架”Spring Boot化”的封裝和抽象读恃,也是數(shù)量最多的項(xiàng)目隧膘;第二類是開發(fā)了一部分分布式系統(tǒng)的基礎(chǔ)設(shè)施的實(shí)現(xiàn)代态,如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色。對(duì)于我們想快速實(shí)踐微服務(wù)的開發(fā)者來(lái)說(shuō)疹吃,第一類子項(xiàng)目就已經(jīng)足夠使用蹦疑,如:Spring Cloud Netflix,是對(duì)Netflix開發(fā)的一套分布式服務(wù)框架的封裝互墓,包括服務(wù)的發(fā)現(xiàn)和注冊(cè)必尼,負(fù)載均衡、斷路器篡撵、REST客戶端突硝、請(qǐng)求路由等搞挣。該項(xiàng)目是Spring Cloud的子項(xiàng)目之一充甚,主要內(nèi)容是對(duì)Netflix公司一系列開源產(chǎn)品的包裝频敛,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合。
通過(guò)一些簡(jiǎn)單的注解膛檀,開發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)锰镀。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka),斷路器(Hystrix)咖刃,智能路由(Zuul)泳炉,客戶端負(fù)載均衡(Ribbon)等。
Spring Cloud Netflix
這可是個(gè)大boss嚎杨,地位僅次于老大花鹅,老大各項(xiàng)服務(wù)依賴與它,與各種Netflix OSS組件集成枫浙,組成微服務(wù)的核心刨肃,它的小弟主要有Eureka, Hystrix, Zuul, Archaius... 太多了
3.1、Spring Cloud Eureka 服務(wù)發(fā)現(xiàn)
服務(wù)中心箩帚,云端服務(wù)發(fā)現(xiàn)真友,一個(gè)基于 REST 的服務(wù),用于定位服務(wù)紧帕,以實(shí)現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移盔然。這個(gè)可是SpringCloud最牛鼻的小弟,服務(wù)中心是嗜,任何小弟需要其它小弟支持什么都需要從這里來(lái)拿轻纪,同樣的你有什么獨(dú)門武功的都趕緊過(guò)報(bào)道,方便以后其它小弟來(lái)調(diào)用叠纷;它的好處是你不需要直接找各種什么小弟支持,只需要到服務(wù)中心來(lái)領(lǐng)取潦嘶,也不需要知道提供支持的其它小弟在哪里涩嚣,還是幾個(gè)小弟來(lái)支持的崇众,反正拿來(lái)用就行,服務(wù)中心來(lái)保證穩(wěn)定性和質(zhì)量航厚。
Spring Cloud Eureka提供在分布式環(huán)境下的服務(wù)發(fā)現(xiàn)顷歌,服務(wù)注冊(cè)的功能。
一個(gè)RESTful服務(wù)幔睬,用來(lái)定位運(yùn)行在AWS地區(qū)(Region)中的中間層服務(wù)眯漩。由兩個(gè)組件組成:Eureka服務(wù)器和Eureka客戶端。Eureka服務(wù)器用作服務(wù)注冊(cè)服務(wù)器麻顶。Eureka客戶端是一個(gè)java客戶端赦抖,用來(lái)簡(jiǎn)化與服務(wù)器的交互、作為輪詢負(fù)載均衡器辅肾,并提供服務(wù)的故障切換支持队萤。Netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶端,它提供基于流量矫钓、資源利用率以及出錯(cuò)狀態(tài)的加權(quán)負(fù)載均衡要尔。
3.2、Spring Cloud Ribbon 客戶端負(fù)載均衡
Ribbon新娜,主要提供客戶側(cè)的軟件負(fù)載均衡算法赵辕。
Ribbon客戶端組件提供一系列完善的配置選項(xiàng),比如連接超時(shí)概龄、重試还惠、重試算法等。Ribbon內(nèi)置可插拔旁钧、可定制的負(fù)載均衡組件吸重。下面是用到的一些負(fù)載均衡策略:
- 簡(jiǎn)單輪詢負(fù)載均衡
- 加權(quán)響應(yīng)時(shí)間負(fù)載均衡
- 區(qū)域感知輪詢負(fù)載均衡
- 隨機(jī)負(fù)載均衡
Ribbon中還包括以下功能:
- 易于與服務(wù)發(fā)現(xiàn)組件(比如Netflix的Eureka)集成
- 使用Archaius完成運(yùn)行時(shí)配置
- 使用JMX暴露運(yùn)維指標(biāo),使用Servo發(fā)布
- 多種可插拔的序列化選擇
- 異步和批處理操作(即將推出)
- 自動(dòng)SLA框架(即將推出)
- 系統(tǒng)管理/指標(biāo)控制臺(tái)(即將推出)
ribbon架構(gòu)示例
- 一個(gè)服務(wù)注冊(cè)中心歪今,eureka server,端口為8761
- service-hi工程跑了兩個(gè)實(shí)例嚎幸,端口分別為8762,8763,分別向服務(wù)注冊(cè)中心注冊(cè)
- sercvice-ribbon端口為8764,向服務(wù)注冊(cè)中心注冊(cè)
- 當(dāng)sercvice-ribbon通過(guò)restTemplate調(diào)用service-hi的hi接口時(shí)寄猩,因?yàn)橛胷ibbon進(jìn)行了負(fù)載均衡嫉晶,會(huì)輪流的調(diào)用service-hi:8762和8763 兩個(gè)端口的hi接口;
3.3田篇、Spring Cloud Config
俗稱的配置中心替废,配置管理工具包,讓你可以把配置放到遠(yuǎn)程服務(wù)器泊柬,集中化管理集群配置椎镣,目前支持本地存儲(chǔ)、Git以及Subversion兽赁。就是以后大家武器状答、槍火什么的東西都集中放到一起冷守,別隨便自己帶,方便以后統(tǒng)一管理惊科、升級(jí)裝備拍摇。
將配置信息中央化保存, 配置Spring Cloud Bus可以實(shí)現(xiàn)動(dòng)態(tài)修改配置文件。這個(gè)還是靜態(tài)的馆截,得配合Spring Cloud Bus實(shí)現(xiàn)動(dòng)態(tài)的配置更新充活。
Spring Cloud Config就是我們通常意義上的配置中心。Spring Cloud Config-把應(yīng)用原本放在本地文件的配置抽取出來(lái)放在中心服務(wù)器蜡娶,本質(zhì)是配置信息從本地遷移到云端混卵。從而能夠提供更好的管理、發(fā)布能力翎蹈。
Spring Cloud Config分服務(wù)端和客戶端淮菠,服務(wù)端負(fù)責(zé)將git(svn)中存儲(chǔ)的配置文件發(fā)布成REST接口,客戶端可以從服務(wù)端REST接口獲取配置荤堪。但客戶端并不能主動(dòng)感知到配置的變化合陵,從而主動(dòng)去獲取新的配置,這需要每個(gè)客戶端通過(guò)POST方法觸發(fā)各自的/refresh澄阳。
3.4拥知、Spring cloud Hystrix 熔斷器
熔斷器,容錯(cuò)管理工具碎赢,旨在通過(guò)熔斷機(jī)制控制服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力低剔。比如突然某個(gè)小弟生病了,但是你還需要它的支持肮塞,然后調(diào)用之后它半天沒有響應(yīng)襟齿,你卻不知道,一直在等等這個(gè)響應(yīng)枕赵;有可能別的小弟也正在調(diào)用你的武功絕技猜欺,那么當(dāng)請(qǐng)求多之后,就會(huì)發(fā)生嚴(yán)重的阻塞影響老大的整體計(jì)劃拷窜。這個(gè)時(shí)候Hystrix就派上用場(chǎng)了开皿,當(dāng)Hystrix發(fā)現(xiàn)某個(gè)小弟不在狀態(tài)不穩(wěn)定立馬馬上讓它下線,讓其它小弟來(lái)頂上來(lái)篮昧,或者給你說(shuō)不用等了這個(gè)小弟今天肯定不行赋荆,該干嘛趕緊干嘛去別在這排隊(duì)了。
斷路器(Cricuit Breaker)是一種能夠在遠(yuǎn)程服務(wù)不可用時(shí)自動(dòng)熔斷(打開開關(guān))懊昨,并在遠(yuǎn)程服務(wù)恢復(fù)時(shí)自動(dòng)恢復(fù)(閉合開關(guān))的設(shè)施窄潭,Spring Cloud通過(guò)Netflix的Hystrix組件提供斷路器、資源隔離與自我修復(fù)功能酵颁。
斷路器可以防止一個(gè)應(yīng)用程序多次試圖執(zhí)行一個(gè)操作嫉你,即很可能失敗信认,允許它繼續(xù)而不等待故障恢復(fù)或者浪費(fèi) CPU 周期,而它確定該故障是持久的均抽。斷路器模式也使應(yīng)用程序能夠檢測(cè)故障是否已經(jīng)解決。如果問(wèn)題似乎已經(jīng)得到糾正??其掂,應(yīng)用程序可以嘗試調(diào)用操作油挥。
斷路器增加了穩(wěn)定性和靈活性,以一個(gè)系統(tǒng)款熬,提供穩(wěn)定性深寥,而系統(tǒng)從故障中恢復(fù),并盡量減少此故障的對(duì)性能的影響贤牛。它可以幫助快速地拒絕對(duì)一個(gè)操作惋鹅,即很可能失敗,而不是等待操作超時(shí)(或者不返回)的請(qǐng)求殉簸,以保持系統(tǒng)的響應(yīng)時(shí)間闰集。如果斷路器提高每次改變狀態(tài)的時(shí)間的事件,該信息可以被用來(lái)監(jiān)測(cè)由斷路器保護(hù)系統(tǒng)的部件的健康狀況般卑,或以提醒管理員當(dāng)斷路器跳閘武鲁,以在打開狀態(tài)。
Netflix開源了Hystrix組件蝠检,實(shí)現(xiàn)了斷路器模式沐鼠,SpringCloud對(duì)這一組件進(jìn)行了整合。 在微服務(wù)架構(gòu)中叹谁,一個(gè)請(qǐng)求需要調(diào)用多個(gè)服務(wù)是非常常見的饲梭,如下圖:
較底層的服務(wù)如果出現(xiàn)故障,會(huì)導(dǎo)致連鎖故障焰檩。當(dāng)對(duì)特定的服務(wù)的調(diào)用的不可用達(dá)到一個(gè)閥值(Hystric 是5秒20次) 斷路器將會(huì)被打開憔涉。
斷路打開后,可用避免連鎖故障锅尘,fallback方法可以直接返回一個(gè)固定值监氢。
在微服務(wù)架構(gòu)中通常會(huì)有多個(gè)服務(wù)層調(diào)用,基礎(chǔ)服務(wù)的故障可能會(huì)導(dǎo)致級(jí)聯(lián)故障藤违,進(jìn)而造成整個(gè)系統(tǒng)不可用的情況浪腐,這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)。服務(wù)雪崩效應(yīng)是一種因“服務(wù)提供者”的不可用導(dǎo)致“服務(wù)消費(fèi)者”的不可用,并將不可用逐漸放大的過(guò)程顿乒。
如下圖所示:A作為服務(wù)提供者议街,B為A的服務(wù)消費(fèi)者,C和D是B的服務(wù)消費(fèi)者璧榄。A不可用引起了B的不可用特漩,并將不可用像滾雪球一樣放大到C和D時(shí)吧雹,雪崩效應(yīng)就形成了。
在這種情況下就需要整個(gè)服務(wù)機(jī)構(gòu)具有故障隔離的功能涂身,避免某一個(gè)服務(wù)掛掉影響全局雄卷。在Spring Cloud 中Hystrix組件就扮演這個(gè)角色。
Hystrix會(huì)在某個(gè)服務(wù)連續(xù)調(diào)用N次不響應(yīng)的情況下蛤售,立即通知調(diào)用端調(diào)用失敗丁鹉,避免調(diào)用端持續(xù)等待而影響了整體服務(wù)。Hystrix間隔時(shí)間會(huì)再次檢查此服務(wù)悴能,如果服務(wù)恢復(fù)將繼續(xù)提供服務(wù)揣钦。
Hystrix Dashboard和Turbine
當(dāng)熔斷發(fā)生的時(shí)候需要迅速的響應(yīng)來(lái)解決問(wèn)題,避免故障進(jìn)一步擴(kuò)散漠酿,那么對(duì)熔斷的監(jiān)控就變得非常重要冯凹。熔斷的監(jiān)控現(xiàn)在有兩款工具:Hystrix-dashboard和Turbine
Hystrix-dashboard是一款針對(duì)Hystrix進(jìn)行實(shí)時(shí)監(jiān)控的工具,通過(guò)Hystrix Dashboard我們可以直觀地看到各Hystrix Command的請(qǐng)求響應(yīng)時(shí)間, 請(qǐng)求成功率等數(shù)據(jù)炒嘲。但是只使用Hystrix Dashboard的話, 你只能看到單個(gè)應(yīng)用內(nèi)的服務(wù)信息, 這明顯不夠. 我們需要一個(gè)工具能讓我們匯總系統(tǒng)內(nèi)多個(gè)服務(wù)的數(shù)據(jù)并顯示到Hystrix Dashboard上, 這個(gè)工具就是Turbine. 監(jiān)控的效果圖如下:
3.5宇姚、Spring Cloud Zuul 服務(wù)網(wǎng)關(guān),智能路由
在微服務(wù)架構(gòu)模式下摸吠,后端服務(wù)的實(shí)例數(shù)一般是動(dòng)態(tài)的空凸,對(duì)于客戶端而言很難發(fā)現(xiàn)動(dòng)態(tài)改變的服務(wù)實(shí)例的訪問(wèn)地址信息。因此在基于微服務(wù)的項(xiàng)目中為了簡(jiǎn)化前端的調(diào)用邏輯寸痢,通常會(huì)引入API Gateway作為輕量級(jí)網(wǎng)關(guān)呀洲,同時(shí)API Gateway中也會(huì)實(shí)現(xiàn)相關(guān)的認(rèn)證邏輯從而簡(jiǎn)化內(nèi)部服務(wù)之間相互調(diào)用的復(fù)雜度。
Spring Cloud體系中支持API Gateway落地的技術(shù)就是Zuul啼止。Spring Cloud Zuul路由是微服務(wù)架構(gòu)中不可或缺的一部分道逗,提供動(dòng)態(tài)路由,監(jiān)控献烦,彈性滓窍,安全等的邊緣服務(wù)。Zuul是Netflix出品的一個(gè)基于JVM路由和服務(wù)端的負(fù)載均衡器巩那。
它的具體作用就是服務(wù)轉(zhuǎn)發(fā)吏夯,接收并轉(zhuǎn)發(fā)所有內(nèi)外部的客戶端調(diào)用。使用Zuul可以作為資源的統(tǒng)一訪問(wèn)入口即横,同時(shí)也可以在網(wǎng)關(guān)做一些權(quán)限校驗(yàn)等類似的功能噪生。
Zuul 是在云平臺(tái)上提供動(dòng)態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架。Zuul 相當(dāng)于是設(shè)備和 Netflix 流應(yīng)用的 Web 網(wǎng)站后端所有請(qǐng)求的前門东囚。當(dāng)其它門派來(lái)找大哥辦事的時(shí)候一定要先經(jīng)過(guò)zuul,看下有沒有帶刀子什么的給攔截回去跺嗽,或者是需要找那個(gè)小弟的直接給帶過(guò)去。
類似Nginx,反向代理的功能桨嫁,不過(guò)netflix自己增加了一些配合其他組件的特性植兰。
3.6、Spring Netflix Archaius
配置管理API璃吧,包含一系列配置管理API楣导,提供動(dòng)態(tài)類型化屬性、線程安全配置操作畜挨、輪詢框架爷辙、回調(diào)機(jī)制等功能‰伲可以實(shí)現(xiàn)動(dòng)態(tài)獲取配置,
原理是每隔60s(默認(rèn)栓始,可配置)從配置源讀取一次內(nèi)容务冕,這樣修改了配置文件后不需要重啟服務(wù)就可以使修改后的內(nèi)容生效,前提使用archaius的API來(lái)讀取幻赚。
3.7禀忆、Spring Cloud Bus
事件、消息總線落恼,用于在集群(例如箩退,配置變化事件)中傳播狀態(tài)變化,可與Spring Cloud Config聯(lián)合實(shí)現(xiàn)熱部署佳谦。相當(dāng)于水滸傳中日行八百里的神行太保戴宗戴涝,確保各個(gè)小弟之間消息保持暢通。
分布式消息隊(duì)列钻蔑,是對(duì)Kafka, MQ的封裝啥刻;事件、消息總線咪笑,用于在集群(例如可帽,配置變化事件)中傳播狀態(tài)變化,可與Spring Cloud Config聯(lián)合實(shí)現(xiàn)熱部署窗怒。
Spring cloud bus通過(guò)輕量消息代理連接各個(gè)分布的節(jié)點(diǎn)映跟。這會(huì)用在廣播狀態(tài)的變化(例如配置變化)或者其他的消息指令。Spring bus的一個(gè)核心思想是通過(guò)分布式的啟動(dòng)器對(duì)spring boot應(yīng)用進(jìn)行擴(kuò)展扬虚,也可以用來(lái)建立一個(gè)多個(gè)應(yīng)用之間的通信頻道努隙。目前唯一實(shí)現(xiàn)的方式是用AMQP消息代理作為通道,同樣特性的設(shè)置(有些取決于通道的設(shè)置)在更多通道的文檔中孔轴。
Spring cloud bus被國(guó)內(nèi)很多都翻譯為消息總線剃法,也挺形象的。大家可以將它理解為管理和傳播所有分布式項(xiàng)目中的消息既可,其實(shí)本質(zhì)是利用了MQ的廣播機(jī)制在分布式的系統(tǒng)中傳播消息贷洲,目前常用的有Kafka和RabbitMQ收厨。利用bus的機(jī)制可以做很多的事情,其中配置中心客戶端刷新就是典型的應(yīng)用場(chǎng)景之一优构,我們用一張圖來(lái)描述bus在配置中心使用的機(jī)制诵叁。
根據(jù)此圖我們可以看出利用Spring Cloud Bus做配置更新的步驟:
- 提交代碼觸發(fā)post給客戶端A發(fā)送bus/refresh
- 客戶端A接收到請(qǐng)求從Server端更新配置并且發(fā)送給Spring Cloud Bus
- Spring Cloud bus接到消息并通知給其它客戶端
- 其它客戶端接收到通知,請(qǐng)求Server端獲取最新配置
- 全部客戶端均獲取到最新的配置
3.8 Spring Cloud Security
對(duì)Spring Security的封裝钦椭,并能配合Netflix使用拧额,安全工具包,為你的應(yīng)用程序添加安全控制彪腔,主要是指OAuth2侥锦。
基于spring security的安全工具包,為你的應(yīng)用程序添加安全控制德挣。這個(gè)小弟很牛鼻專門負(fù)責(zé)整個(gè)幫派的安全問(wèn)題恭垦,設(shè)置不同的門派訪問(wèn)特定的資源,不能把秘籍葵花寶典泄漏了格嗅。
3.9番挺、Spring Cloud Zookeeper
對(duì)Zookeeper的封裝,使之能配置其它Spring Cloud的子項(xiàng)目使用屯掖;操作Zookeeper的工具包玄柏,用于使用zookeeper方式的服務(wù)注冊(cè)和發(fā)現(xiàn)。
ZooKeeper是一個(gè)分布式的贴铜,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)粪摘,是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件绍坝。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件赶熟,提供的功能包括:配置維護(hù)、域名服務(wù)陷嘴、分布式同步映砖、組服務(wù)等。ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù)灾挨,將簡(jiǎn)單易用的接口和性能高效邑退、功能穩(wěn)定的系統(tǒng)提供給用戶。
操作Zookeeper的工具包劳澄,用于使用zookeeper方式的服務(wù)發(fā)現(xiàn)和配置管理地技,抱了Zookeeper的大腿。
3.10秒拔、Spring Cloud Stream
數(shù)據(jù)流莫矗;數(shù)據(jù)流操作開發(fā)包,封裝了與Redis,Rabbit、Kafka等發(fā)送接收消息作谚。
Spring Cloud Stream是創(chuàng)建消息驅(qū)動(dòng)微服務(wù)應(yīng)用的框架三娩。Spring Cloud Stream是基于spring boot創(chuàng)建,用來(lái)建立單獨(dú)的/工業(yè)級(jí)spring應(yīng)用妹懒,使用spring integration提供與消息代理之間的連接雀监。數(shù)據(jù)流操作開發(fā)包,封裝了與Redis,Rabbit眨唬、Kafka等發(fā)送接收消息会前。
一個(gè)業(yè)務(wù)會(huì)牽扯到多個(gè)任務(wù),任務(wù)之間是通過(guò)事件觸發(fā)的匾竿,這就是Spring Cloud stream要干的事了瓦宜。
3.11、Spring Cloud Sleuth
隨著服務(wù)的越來(lái)越多岭妖,對(duì)調(diào)用鏈的分析會(huì)越來(lái)越復(fù)雜歉提,如服務(wù)之間的調(diào)用關(guān)系、某個(gè)請(qǐng)求對(duì)應(yīng)的調(diào)用鏈区转、調(diào)用之間消費(fèi)的時(shí)間等,對(duì)這些信息進(jìn)行監(jiān)控就成為一個(gè)問(wèn)題版扩。在實(shí)際的使用中我們需要監(jiān)控服務(wù)和服務(wù)之間通訊的各項(xiàng)指標(biāo)废离,這些數(shù)據(jù)將是我們改進(jìn)系統(tǒng)架構(gòu)的主要依據(jù)。因此分布式的鏈路跟蹤就變的非常重要礁芦,Spring Cloud也給出了具體的解決方案:Spring Cloud Sleuth和Zipkin蜻韭。
服務(wù)跟蹤;日志收集工具包柿扣,封裝了Dapper,Zipkin和HTrace操作肖方。
日志收集工具包,封裝了Dapper和log-based追蹤以及Zipkin和HTrace操作未状,為SpringCloud應(yīng)用實(shí)現(xiàn)了一種分布式追蹤解決方案俯画。
簡(jiǎn)介
Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案,并且兼容支持了 zipkin司草,你只需要在pom文件中引入相應(yīng)的依賴即可艰垂。
服務(wù)追蹤分析
微服務(wù)架構(gòu)上通過(guò)業(yè)務(wù)來(lái)劃分服務(wù)的,通過(guò)REST調(diào)用埋虹,對(duì)外暴露的一個(gè)接口猜憎,可能需要很多個(gè)服務(wù)協(xié)同才能完成這個(gè)接口功能,如果鏈路上任何一個(gè)服務(wù)出現(xiàn)問(wèn)題或者網(wǎng)絡(luò)超時(shí)搔课,都會(huì)形成導(dǎo)致接口調(diào)用失敗胰柑。隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會(huì)越來(lái)越復(fù)雜。
隨著服務(wù)的越來(lái)越多柬讨,對(duì)調(diào)用鏈的分析會(huì)越來(lái)越復(fù)雜崩瓤。它們之間的調(diào)用關(guān)系也許如下:
術(shù)語(yǔ)
- Span:基本工作單元,例如姐浮,在一個(gè)新建的span中發(fā)送一個(gè)RPC等同于發(fā)送一個(gè)回應(yīng)請(qǐng)求給RPC谷遂,span通過(guò)一個(gè)64位ID唯一標(biāo)識(shí),trace以另一個(gè)64位ID表示卖鲤,span還有其他數(shù)據(jù)信息肾扰,比如摘要、時(shí)間戳事件蛋逾、關(guān)鍵值注釋(tags)集晚、span的ID、以及進(jìn)度ID(通常是IP地址)
span在不斷的啟動(dòng)和停止区匣,同時(shí)記錄了時(shí)間信息偷拔,當(dāng)你創(chuàng)建了一個(gè)span,你必須在未來(lái)的某個(gè)時(shí)刻停止它亏钩。 - Trace:一系列spans組成的一個(gè)樹狀結(jié)構(gòu)莲绰,例如,如果你正在跑一個(gè)分布式大數(shù)據(jù)工程姑丑,你可能需要?jiǎng)?chuàng)建一個(gè)trace蛤签。
- Annotation:用來(lái)及時(shí)記錄一個(gè)事件的存在,一些核心annotations用來(lái)定義一個(gè)請(qǐng)求的開始和結(jié)束
cs - Client Sent -客戶端發(fā)起一個(gè)請(qǐng)求栅哀,這個(gè)annotion描述了這個(gè)span的開始
sr - Server Received -服務(wù)端獲得請(qǐng)求并準(zhǔn)備開始處理它震肮,如果將其sr減去cs時(shí)間戳便可得到網(wǎng)絡(luò)延遲
ss - Server Sent -注解表明請(qǐng)求處理的完成(當(dāng)請(qǐng)求返回客戶端),如果ss減去sr時(shí)間戳便可得到服務(wù)端需要的處理請(qǐng)求時(shí)間
cr - Client Received -表明span的結(jié)束留拾,客戶端成功接收到服務(wù)端的回復(fù)戳晌,如果cr減去cs時(shí)間戳便可得到客戶端從服務(wù)端獲取回復(fù)的所有所需時(shí)間
將Span和Trace在一個(gè)系統(tǒng)中使用Zipkin注解的過(guò)程圖形化:
3.12、Spring Cloud Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)
在Spring Cloud Netflix棧中痴柔,各個(gè)微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的沦偎,因此在調(diào)用遠(yuǎn)程服務(wù)時(shí)就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection咳蔚、Apache的Http Client扛施、Netty的異步HTTP Client, Spring的RestTemplate。但是屹篓,用起來(lái)最方便疙渣、最優(yōu)雅的還是要屬Feign了。
Feign是一種聲明式堆巧、模板化的HTTP客戶端妄荔。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn)泼菌,開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求啦租。
通過(guò)Feign哗伯, 我們能把HTTP遠(yuǎn)程調(diào)用對(duì)開發(fā)者完全透明,得到與調(diào)用本地方法一致的編碼體驗(yàn)篷角。這一點(diǎn)與阿里Dubbo中暴露遠(yuǎn)程服務(wù)的方式類似焊刹,區(qū)別在于Dubbo是基于私有二進(jìn)制協(xié)議,而Feign本質(zhì)上還是個(gè)HTTP客戶端恳蹲。如果是在用Spring Cloud Netflix搭建微服務(wù)虐块,那么Feign無(wú)疑是最佳選擇。
Feign是一個(gè)聲明式的偽Http客戶端嘉蕾,它使得寫Http客戶端變得更簡(jiǎn)單贺奠。使用Feign,只需要?jiǎng)?chuàng)建一個(gè)接口并注解错忱。它具有可插拔的注解特性儡率,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的編碼器和解碼器以清。Feign默認(rèn)集成了Ribbon儿普,并和Eureka結(jié)合,默認(rèn)實(shí)現(xiàn)了負(fù)載均衡的效果掷倔。
簡(jiǎn)而言之:
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon
3.13眉孩、Spring Cloud for Cloud Foundry
Cloud Foundry是VMware推出的業(yè)界第一個(gè)開源PaaS云平臺(tái),它支持多種框架今魔、語(yǔ)言、運(yùn)行時(shí)環(huán)境障贸、云平臺(tái)及應(yīng)用服務(wù)错森,使開發(fā)人員能夠在幾秒鐘內(nèi)進(jìn)行應(yīng)用程序的部署和擴(kuò)展,無(wú)需擔(dān)心任何基礎(chǔ)架構(gòu)的問(wèn)題
其實(shí)就是與CloudFoundry進(jìn)行集成的一套解決方案篮洁,抱了Cloud Foundry的大腿涩维。
3.14、Spring Cloud Cluster
Spring Cloud Cluster將取代Spring Integration袁波。提供在分布式系統(tǒng)中的集群所需要的基礎(chǔ)功能支持瓦阐,如:選舉、集群的狀態(tài)一致性篷牌、全局鎖睡蟋、tokens等常見狀態(tài)模式的抽象和實(shí)現(xiàn)。
如果把不同的幫派組織成統(tǒng)一的整體枷颊,Spring Cloud Cluster已經(jīng)幫你提供了很多方便組織成統(tǒng)一的工具戳杀。
3.15该面、Spring Cloud Consul
Consul 是一個(gè)支持多數(shù)據(jù)中心分布式高可用的服務(wù)發(fā)現(xiàn)和配置共享的服務(wù)軟件,由 HashiCorp 公司用 Go 語(yǔ)言開發(fā), 基于 Mozilla Public License 2.0 的協(xié)議進(jìn)行開源. Consul 支持健康檢查,并允許 HTTP 和 DNS 協(xié)議調(diào)用 API 存儲(chǔ)鍵值對(duì).
Spring Cloud Consul 封裝了Consul操作,consul是一個(gè)服務(wù)發(fā)現(xiàn)與配置工具信卡,與Docker容器可以無(wú)縫集成隔缀。
3.16、Spring Cloud Data Flow
Data flow 是一個(gè)用于開發(fā)和執(zhí)行大范圍數(shù)據(jù)處理其模式包括ETL傍菇,批量運(yùn)算和持續(xù)運(yùn)算的統(tǒng)一編程模型和托管服務(wù)猾瘸。
對(duì)于在現(xiàn)代運(yùn)行環(huán)境中可組合的微服務(wù)程序來(lái)說(shuō),Spring Cloud data flow是一個(gè)原生云可編配的服務(wù)丢习。使用Spring Cloud data flow牵触,開發(fā)者可以為像數(shù)據(jù)抽取,實(shí)時(shí)分析泛领,和數(shù)據(jù)導(dǎo)入/導(dǎo)出這種常見用例創(chuàng)建和編配數(shù)據(jù)通道 (data pipelines)荒吏。
Spring Cloud data flow 是基于原生云對(duì) spring XD的重新設(shè)計(jì),該項(xiàng)目目標(biāo)是簡(jiǎn)化大數(shù)據(jù)應(yīng)用的開發(fā)渊鞋。Spring XD 的流處理和批處理模塊的重構(gòu)分別是基于 spring boot的stream 和 task/batch 的微服務(wù)程序绰更。這些程序現(xiàn)在都是自動(dòng)部署單元而且他們?cè)闹С窒?Cloud Foundry、Apache YARN锡宋、Apache Mesos和Kubernetes 等現(xiàn)代運(yùn)行環(huán)境儡湾。
Spring Cloud data flow 為基于微服務(wù)的分布式流處理和批處理數(shù)據(jù)通道提供了一系列模型和最佳實(shí)踐。
3.17执俩、Spring Cloud Task
Spring Cloud Task 主要解決短命微服務(wù)的任務(wù)管理徐钠,任務(wù)調(diào)度的工作,比如說(shuō)某些定時(shí)任務(wù)晚上就跑一次役首,或者某項(xiàng)數(shù)據(jù)分析臨時(shí)就跑幾次尝丐。
3.18、Spring Cloud Connectors
Spring Cloud Connectors 簡(jiǎn)化了連接到服務(wù)的過(guò)程和從云平臺(tái)獲取操作的過(guò)程衡奥,有很強(qiáng)的擴(kuò)展性爹袁,可以利用Spring Cloud Connectors來(lái)構(gòu)建你自己的云平臺(tái)。
便于云端應(yīng)用程序在各種PaaS平臺(tái)連接到后端矮固,如:數(shù)據(jù)庫(kù)和消息代理服務(wù)失息。
3.19、Spring Cloud Starters
Spring Boot式的啟動(dòng)項(xiàng)目档址,為Spring Cloud提供開箱即用的依賴管理盹兢。
3.20、Spring Cloud CLI
基于 Spring Boot CLI守伸,可以讓你以命令行方式快速建立云組件绎秒。
3.21、Netflix Turbine
Turbine是聚合服務(wù)器發(fā)送事件流數(shù)據(jù)的一個(gè)工具尼摹,用來(lái)監(jiān)控集群下hystrix的metrics情況替裆。
四校辩、和Spring Boot 是什么關(guān)系
Spring boot 是 Spring 的一套快速配置腳手架,可以基于spring boot 快速開發(fā)單個(gè)微服務(wù)辆童,Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具宜咒;Spring boot專注于快速、方便集成的單個(gè)個(gè)體把鉴,Spring Cloud是關(guān)注全局的服務(wù)治理框架故黑;spring boot使用了默認(rèn)大于配置的理念,很多集成方案已經(jīng)幫你選擇好了庭砍,能不配置就不配置场晶,Spring Cloud很大的一部分是基于Spring boot來(lái)實(shí)現(xiàn),可以不基于Spring boot嗎?不可以怠缸。
Spring boot可以離開Spring Cloud獨(dú)立使用開發(fā)項(xiàng)目诗轻,但是Spring Cloud離不開Spring boot,屬于依賴的關(guān)系揭北。
Spring -> Spring Boot > Spring Cloud 這樣的關(guān)系构拳。
五霞丧、Spring Cloud的優(yōu)勢(shì)
微服務(wù)的框架那么多比如:dubbo、Kubernetes,為什么就要使用Spring Cloud的呢漾稀?
- 產(chǎn)出于Spring大家族谚中,Spring在企業(yè)級(jí)開發(fā)框架中無(wú)人能敵甸怕,來(lái)頭很大博敬,可以保證后續(xù)的更新、完善呆奕。比如dubbo現(xiàn)在就差不多死了
- 有Spring Boot 這個(gè)獨(dú)立干將可以省很多事养晋,大大小小的活spring boot都搞的挺不錯(cuò)。
作為一個(gè)微服務(wù)治理的大家伙梁钾,考慮的很全面绳泉,幾乎服務(wù)治理的方方面面都考慮到了,方便開發(fā)開箱即用陈轿。 - Spring Cloud 活躍度很高圈纺,教程很豐富秦忿,遇到問(wèn)題很容易找到解決方案
- 輕輕松松幾行代碼就完成了熔斷麦射、均衡負(fù)責(zé)、服務(wù)中心的各種平臺(tái)功能
- Spring Cloud 也有一個(gè)缺點(diǎn)灯谣,只能使用Java開發(fā),不適合小型獨(dú)立的項(xiàng)目潜秋。
六、Spring Cloud前景
Spring Cloud對(duì)于中小型互聯(lián)網(wǎng)公司來(lái)說(shuō)是一種福音胎许,因?yàn)檫@類公司往往沒有實(shí)力或者沒有足夠的資金投入去開發(fā)自己的分布式系統(tǒng)基礎(chǔ)設(shè)施峻呛,使用Spring Cloud一站式解決方案能在從容應(yīng)對(duì)業(yè)務(wù)發(fā)展的同時(shí)大大減少開發(fā)成本罗售。同時(shí),隨著近幾年微服務(wù)架構(gòu)和docker容器概念的火爆钩述,也會(huì)讓Spring Cloud在未來(lái)越來(lái)越“云”化的軟件開發(fā)風(fēng)格中立有一席之地寨躁,尤其是在目前五花八門的分布式解決方案中提供了標(biāo)準(zhǔn)化的、全站式的技術(shù)方案牙勘,意義可能會(huì)堪比當(dāng)前Servlet規(guī)范的誕生职恳,有效推進(jìn)服務(wù)端軟件系統(tǒng)技術(shù)水平的進(jìn)步。
共同進(jìn)步方面,學(xué)習(xí)分享
歡迎大家關(guān)注我的公眾號(hào)【風(fēng)平浪靜如碼】放钦,海量Java相關(guān)文章,學(xué)習(xí)資料都會(huì)在里面更新恭金,整理的資料也會(huì)放在里面操禀。
覺得寫的還不錯(cuò)的就點(diǎn)個(gè)贊,加個(gè)關(guān)注唄横腿!點(diǎn)關(guān)注颓屑,不迷路,持續(xù)更新C锼P暇狻!