軟件是有生命的版保,你做出來的架構(gòu)決定了這個(gè)軟件它這一生是坎坷還是幸福洲愤。
本文不是講解如何使用Spring Cloud的教程,而是探討Spring Cloud是什么横侦,以及它誕生的背景和意義挥萌。
1 背景
2008年以后,國內(nèi)互聯(lián)網(wǎng)行業(yè)飛速發(fā)展枉侧,我們對軟件系統(tǒng)的需求已經(jīng)不再是過去”能用就行”這種很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)域解決該問題唯一的出路翼虫,然而分布式系統(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)來簡化分布式系統(tǒng)的開發(fā)泪喊,Spring Cloud應(yīng)運(yùn)而生。
2 Spring Cloud是什么
Spring Cloud是一系列框架的有序集合勤晚。它利用Spring Boot的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā)川背,如服務(wù)發(fā)現(xiàn)注冊、配置中心闻妓、消息總線菌羽、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等注祖,都可以用Spring Boot的開發(fā)風(fēng)格做到一鍵啟動(dòng)和部署猾蒂。Spring并沒有重復(fù)制造輪子,它只是將目前各家公司開發(fā)的比較成熟是晨、經(jīng)得起實(shí)際考驗(yàn)的服務(wù)框架組合起來肚菠,通過Spring Boot風(fēng)格進(jìn)行再封裝屏蔽掉了復(fù)雜的配置和實(shí)現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂罩缴、易部署和易維護(hù)的分布式系統(tǒng)開發(fā)工具包蚊逢。
Spring Cloud正是對Netflix的多個(gè)開源組件進(jìn)一步的封裝而成,同時(shí)又實(shí)現(xiàn)了和云端平臺箫章,和Spring Boot開發(fā)框架很好的集成烙荷。
Spring Cloud是一個(gè)相對比較新的微服務(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í)能夠快速和云平臺資源進(jìn)行對接吏廉。
從上圖可以看出Spring Cloud各個(gè)組件相互配合,合作支持了一套完整的微服務(wù)架構(gòu)惰许。
- 其中Eureka負(fù)責(zé)服務(wù)的注冊與發(fā)現(xiàn)席覆,很好將各服務(wù)連接起來
- 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ù)去獲取最新的配置信息
- 所有對外的請求和服務(wù)晦毙,我們都通過Zuul來進(jìn)行轉(zhuǎn)發(fā)生巡,起到API網(wǎng)關(guān)的作用
- 最后我們使用Sleuth+Zipkin將所有的請求數(shù)據(jù)記錄下來,方便我們進(jìn)行后續(xù)分析
Spring Cloud從設(shè)計(jì)之初就考慮了絕大多數(shù)互聯(lián)網(wǎng)公司架構(gòu)演化所需的功能见妒,如服務(wù)發(fā)現(xiàn)注冊孤荣、配置中心、消息總線、負(fù)載均衡盐股、斷路器钱豁、數(shù)據(jù)監(jiān)控等。這些功能都是以插拔的形式提供出來疯汁,方便我們系統(tǒng)架構(gòu)演進(jìn)的過程中牲尺,可以合理的選擇需要的組件進(jìn)行集成,從而在架構(gòu)演進(jìn)的過程中會更加平滑幌蚊、順利谤碳。
微服務(wù)架構(gòu)是一種趨勢,Spring Cloud提供了標(biāo)準(zhǔn)化的溢豆、全站式的技術(shù)方案蜒简,意義可能會堪比當(dāng)前Servlet規(guī)范的誕生,有效推進(jìn)服務(wù)端軟件系統(tǒng)技術(shù)水平的進(jìn)步漩仙。
3 Spring Cloud組成
Spring Cloud的子項(xiàng)目臭蚁,大致可分成兩類,一類是對現(xiàn)有成熟框架”Spring Boot化”的封裝和抽象讯赏,也是數(shù)量最多的項(xiàng)目;第二類是開發(fā)了一部分分布式系統(tǒng)的基礎(chǔ)設(shè)施的實(shí)現(xiàn)冷尉,如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色漱挎。對于我們想快速實(shí)踐微服務(wù)的開發(fā)者來說,第一類子項(xiàng)目就已經(jīng)足夠使用雀哨,如:Spring Cloud Netflix磕谅,是對Netflix開發(fā)的一套分布式服務(wù)框架的封裝,包括服務(wù)的發(fā)現(xiàn)和注冊雾棺,負(fù)載均衡膊夹、斷路器、REST客戶端捌浩、請求路由等放刨。該項(xiàng)目是Spring Cloud的子項(xiàng)目之一,主要內(nèi)容是對Netflix公司一系列開源產(chǎn)品的包裝尸饺,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合进统。
通過一些簡單的注解,開發(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ù)中心撵颊,任何小弟需要其它小弟支持什么都需要從這里來拿宇攻,同樣的你有什么獨(dú)門武功的都趕緊過報(bào)道,方便以后其它小弟來調(diào)用倡勇;它的好處是你不需要直接找各種什么小弟支持逞刷,只需要到服務(wù)中心來領(lǐng)取,也不需要知道提供支持的其它小弟在哪里妻熊,還是幾個(gè)小弟來支持的夸浅,反正拿來用就行,服務(wù)中心來保證穩(wěn)定性和質(zhì)量扔役。
Spring Cloud Eureka提供在分布式環(huán)境下的服務(wù)發(fā)現(xiàn)帆喇,服務(wù)注冊的功能。
一個(gè)RESTful服務(wù)亿胸,用來定位運(yùn)行在AWS地區(qū)(Region)中的中間層服務(wù)坯钦。由兩個(gè)組件組成:Eureka服務(wù)器和Eureka客戶端。Eureka服務(wù)器用作服務(wù)注冊服務(wù)器侈玄。Eureka客戶端是一個(gè)java客戶端婉刀,用來簡化與服務(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ù)載均衡策略:
- 簡單輪詢負(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)控制臺(即將推出)
ribbon架構(gòu)示例
- 一個(gè)服務(wù)注冊中心粘室,eureka server,端口為8761
- service-hi工程跑了兩個(gè)實(shí)例,端口分別為8762,8763卜范,分別向服務(wù)注冊中心注冊
- sercvice-ribbon端口為8764,向服務(wù)注冊中心注冊
- 當(dāng)sercvice-ribbon通過restTemplate調(diào)用service-hi的hi接口時(shí)衔统,因?yàn)橛胷ibbon進(jìn)行了負(fù)載均衡,會輪流的調(diào)用service-hi:8762和8763 兩個(gè)端口的hi接口海雪;
3.3 Spring Cloud Config
俗稱的配置中心锦爵,配置管理工具包,讓你可以把配置放到遠(yuǎn)程服務(wù)器奥裸,集中化管理集群配置险掀,目前支持本地存儲、Git以及Subversion湾宙。就是以后大家武器樟氢、槍火什么的東西都集中放到一起,別隨便自己帶侠鳄,方便以后統(tǒng)一管理埠啃、升級裝備。
將配置信息中央化保存, 配置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)用原本放在本地文件的配置抽取出來放在中心服務(wù)器,本質(zhì)是配置信息從本地遷移到云端鹃骂。從而能夠提供更好的管理台盯、發(fā)布能力。
Spring Cloud Config分服務(wù)端和客戶端畏线,服務(wù)端負(fù)責(zé)將git(svn)中存儲的配置文件發(fā)布成REST接口静盅,客戶端可以從服務(wù)端REST接口獲取配置。但客戶端并不能主動(dòng)感知到配置的變化寝殴,從而主動(dòng)去獲取新的配置蒿叠,這需要每個(gè)客戶端通過POST方法觸發(fā)各自的/refresh。
3.4 Spring cloud Hystrix 熔斷器
熔斷器蚣常,容錯(cuò)管理工具市咽,旨在通過熔斷機(jī)制控制服務(wù)和第三方庫的節(jié)點(diǎn),從而對延遲和故障提供更強(qiáng)大的容錯(cuò)能力。比如突然某個(gè)小弟生病了抵蚊,但是你還需要它的支持施绎,然后調(diào)用之后它半天沒有響應(yīng)溯革,你卻不知道,一直在等等這個(gè)響應(yīng)谷醉;有可能別的小弟也正在調(diào)用你的武功絕技致稀,那么當(dāng)請求多之后,就會發(fā)生嚴(yán)重的阻塞影響老大的整體計(jì)劃俱尼。這個(gè)時(shí)候Hystrix就派上用場了抖单,當(dāng)Hystrix發(fā)現(xiàn)某個(gè)小弟不在狀態(tài)不穩(wěn)定立馬馬上讓它下線,讓其它小弟來頂上來遇八,或者給你說不用等了這個(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通過Netflix的Hystrix組件提供斷路器、資源隔離與自我修復(fù)功能揽碘。
斷路器可以防止一個(gè)應(yīng)用程序多次試圖執(zhí)行一個(gè)操作次屠,即很可能失敗,允許它繼續(xù)而不等待故障恢復(fù)或者浪費(fèi) CPU 周期雳刺,而它確定該故障是持久的劫灶。斷路器模式也使應(yīng)用程序能夠檢測故障是否已經(jīng)解決。如果問題似乎已經(jīng)得到糾正??掖桦,應(yīng)用程序可以嘗試調(diào)用操作本昏。
斷路器增加了穩(wěn)定性和靈活性,以一個(gè)系統(tǒng)枪汪,提供穩(wěn)定性涌穆,而系統(tǒng)從故障中恢復(fù),并盡量減少此故障的對性能的影響雀久。它可以幫助快速地拒絕對一個(gè)操作宿稀,即很可能失敗,而不是等待操作超時(shí)(或者不返回)的請求赖捌,以保持系統(tǒng)的響應(yīng)時(shí)間祝沸。如果斷路器提高每次改變狀態(tài)的時(shí)間的事件,該信息可以被用來監(jiān)測由斷路器保護(hù)系統(tǒng)的部件的健康狀況越庇,或以提醒管理員當(dāng)斷路器跳閘罩锐,以在打開狀態(tài)。
Netflix開源了Hystrix組件卤唉,實(shí)現(xiàn)了斷路器模式涩惑,SpringCloud對這一組件進(jìn)行了整合。 在微服務(wù)架構(gòu)中桑驱,一個(gè)請求需要調(diào)用多個(gè)服務(wù)是非常常見的境氢,如下圖:
較底層的服務(wù)如果出現(xiàn)故障蟀拷,會導(dǎo)致連鎖故障。當(dāng)對特定的服務(wù)的調(diào)用的不可用達(dá)到一個(gè)閥值(Hystric 是5秒20次) 斷路器將會被打開萍聊。
斷路打開后问芬,可用避免連鎖故障,fallback方法可以直接返回一個(gè)固定值寿桨。
在微服務(wù)架構(gòu)中通常會有多個(gè)服務(wù)層調(diào)用此衅,基礎(chǔ)服務(wù)的故障可能會導(dǎo)致級聯(lián)故障,進(jìn)而造成整個(gè)系統(tǒng)不可用的情況亭螟,這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)挡鞍。服務(wù)雪崩效應(yīng)是一種因“服務(wù)提供者”的不可用導(dǎo)致“服務(wù)消費(fèi)者”的不可用,并將不可用逐漸放大的過程。
如下圖所示: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會在某個(gè)服務(wù)連續(xù)調(diào)用N次不響應(yīng)的情況下牺蹄,立即通知調(diào)用端調(diào)用失敗忘伞,避免調(diào)用端持續(xù)等待而影響了整體服務(wù)。Hystrix間隔時(shí)間會再次檢查此服務(wù)沙兰,如果服務(wù)恢復(fù)將繼續(xù)提供服務(wù)氓奈。
Hystrix Dashboard和Turbine
當(dāng)熔斷發(fā)生的時(shí)候需要迅速的響應(yīng)來解決問題,避免故障進(jìn)一步擴(kuò)散鼎天,那么對熔斷的監(jiān)控就變得非常重要探颈。熔斷的監(jiān)控現(xiàn)在有兩款工具:Hystrix-dashboard和Turbine
Hystrix-dashboard是一款針對Hystrix進(jìn)行實(shí)時(shí)監(jiān)控的工具,通過Hystrix Dashboard我們可以直觀地看到各Hystrix Command的請求響應(yīng)時(shí)間, 請求成功率等數(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)的绩鸣,對于客戶端而言很難發(fā)現(xiàn)動(dòng)態(tài)改變的服務(wù)實(shí)例的訪問地址信息。因此在基于微服務(wù)的項(xiàng)目中為了簡化前端的調(diào)用邏輯纱兑,通常會引入API Gateway作為輕量級網(wǎng)關(guān)呀闻,同時(shí)API Gateway中也會實(shí)現(xiàn)相關(guān)的認(rè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)一訪問入口,同時(shí)也可以在網(wǎng)關(guān)做一些權(quán)限校驗(yàn)等類似的功能榜掌。
Zuul 是在云平臺上提供動(dòng)態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架优妙。Zuul 相當(dāng)于是設(shè)備和 Netflix 流應(yīng)用的 Web 網(wǎng)站后端所有請求的前門。當(dāng)其它門派來找大哥辦事的時(shí)候一定要先經(jīng)過zuul,看下有沒有帶刀子什么的給攔截回去憎账,或者是需要找那個(gè)小弟的直接給帶過去套硼。
類似Nginx,反向代理的功能胞皱,不過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來讀取竟块。
3.7 Spring Cloud Bus
事件、消息總線耐齐,用于在集群(例如浪秘,配置變化事件)中傳播狀態(tài)變化,可與Spring Cloud Config聯(lián)合實(shí)現(xiàn)熱部署埠况。相當(dāng)于水滸傳中日行八百里的神行太保戴宗耸携,確保各個(gè)小弟之間消息保持暢通。
分布式消息隊(duì)列辕翰,是對Kafka, MQ的封裝夺衍;事件、消息總線喜命,用于在集群(例如沟沙,配置變化事件)中傳播狀態(tài)變化河劝,可與Spring Cloud Config聯(lián)合實(shí)現(xiàn)熱部署。
Spring cloud bus通過輕量消息代理連接各個(gè)分布的節(jié)點(diǎn)矛紫。這會用在廣播狀態(tài)的變化(例如配置變化)或者其他的消息指令赎瞎。Spring bus的一個(gè)核心思想是通過分布式的啟動(dòng)器對spring boot應(yīng)用進(jìn)行擴(kuò)展,也可以用來建立一個(gè)多個(gè)應(yīng)用之間的通信頻道含衔。目前唯一實(shí)現(xiàn)的方式是用AMQP消息代理作為通道煎娇,同樣特性的設(shè)置(有些取決于通道的設(shè)置)在更多通道的文檔中。
Spring cloud bus被國內(nèi)很多都翻譯為消息總線贪染,也挺形象的缓呛。大家可以將它理解為管理和傳播所有分布式項(xiàng)目中的消息既可,其實(shí)本質(zhì)是利用了MQ的廣播機(jī)制在分布式的系統(tǒng)中傳播消息杭隙,目前常用的有Kafka和RabbitMQ哟绊。利用bus的機(jī)制可以做很多的事情,其中配置中心客戶端刷新就是典型的應(yīng)用場景之一痰憎,我們用一張圖來描述bus在配置中心使用的機(jī)制票髓。
根據(jù)此圖我們可以看出利用Spring Cloud Bus做配置更新的步驟:
- 提交代碼觸發(fā)post給客戶端A發(fā)送bus/refresh
- 客戶端A接收到請求從Server端更新配置并且發(fā)送給Spring Cloud Bus
- Spring Cloud bus接到消息并通知給其它客戶端
- 其它客戶端接收到通知,請求Server端獲取最新配置
- 全部客戶端均獲取到最新的配置
3.8 Spring Cloud Security
對Spring Security的封裝铣耘,并能配合Netflix使用洽沟,安全工具包,為你的應(yīng)用程序添加安全控制蜗细,主要是指OAuth2裆操。
基于spring security的安全工具包,為你的應(yīng)用程序添加安全控制炉媒。這個(gè)小弟很牛鼻專門負(fù)責(zé)整個(gè)幫派的安全問題踪区,設(shè)置不同的門派訪問特定的資源,不能把秘籍葵花寶典泄漏了吊骤。
3.9 Spring Cloud Zookeeper
對Zookeeper的封裝缎岗,使之能配置其它Spring Cloud的子項(xiàng)目使用;操作Zookeeper的工具包白粉,用于使用zookeeper方式的服務(wù)注冊和發(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ù),將簡單易用的接口和性能高效楷兽、功能穩(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)建裂明,用來建立單獨(dú)的/工業(yè)級spring應(yīng)用,使用spring integration提供與消息代理之間的連接太援。數(shù)據(jù)流操作開發(fā)包闽晦,封裝了與Redis,Rabbit、Kafka等發(fā)送接收消息提岔。
一個(gè)業(yè)務(wù)會牽扯到多個(gè)任務(wù)仙蛉,任務(wù)之間是通過事件觸發(fā)的,這就是Spring Cloud stream要干的事了碱蒙。
3.11 Spring Cloud Sleuth
隨著服務(wù)的越來越多荠瘪,對調(diào)用鏈的分析會越來越復(fù)雜,如服務(wù)之間的調(diào)用關(guān)系振亮、某個(gè)請求對應(yīng)的調(diào)用鏈巧还、調(diào)用之間消費(fèi)的時(shí)間等,對這些信息進(jìn)行監(jiān)控就成為一個(gè)問題坊秸。在實(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)了一種分布式追蹤解決方案磕瓷。
簡介
Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相應(yīng)的依賴即可困食。
服務(wù)追蹤分析
微服務(wù)架構(gòu)上通過業(yè)務(wù)來劃分服務(wù)的边翁,通過REST調(diào)用,對外暴露的一個(gè)接口硕盹,可能需要很多個(gè)服務(wù)協(xié)同才能完成這個(gè)接口功能符匾,如果鏈路上任何一個(gè)服務(wù)出現(xiàn)問題或者網(wǎng)絡(luò)超時(shí),都會形成導(dǎo)致接口調(diào)用失敗瘩例。隨著業(yè)務(wù)的不斷擴(kuò)張啊胶,服務(wù)之間互相調(diào)用會越來越復(fù)雜。
隨著服務(wù)的越來越多垛贤,對調(diào)用鏈的分析會越來越復(fù)雜焰坪。它們之間的調(diào)用關(guān)系也許如下:
術(shù)語
- Span:基本工作單元,例如南吮,在一個(gè)新建的span中發(fā)送一個(gè)RPC等同于發(fā)送一個(gè)回應(yīng)請求給RPC琳彩,span通過一個(gè)64位ID唯一標(biāo)識,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,你必須在未來的某個(gè)時(shí)刻停止它浩聋。 - Trace:一系列spans組成的一個(gè)樹狀結(jié)構(gòu)观蜗,例如,如果你正在跑一個(gè)分布式大數(shù)據(jù)工程衣洁,你可能需要?jiǎng)?chuàng)建一個(gè)trace墓捻。
-
Annotation:用來及時(shí)記錄一個(gè)事件的存在,一些核心annotations用來定義一個(gè)請求的開始和結(jié)束
cs - Client Sent -客戶端發(fā)起一個(gè)請求坊夫,這個(gè)annotion描述了這個(gè)span的開始
sr - Server Received -服務(wù)端獲得請求并準(zhǔn)備開始處理它凛辣,如果將其sr減去cs時(shí)間戳便可得到網(wǎng)絡(luò)延遲
ss - Server Sent -注解表明請求處理的完成(當(dāng)請求返回客戶端)廉丽,如果ss減去sr時(shí)間戳便可得到服務(wù)端需要的處理請求時(shí)間
cr - Client Received -表明span的結(jié)束悄窃,客戶端成功接收到服務(wù)端的回復(fù)萝挤,如果cr減去cs時(shí)間戳便可得到客戶端從服務(wù)端獲取回復(fù)的所有所需時(shí)間
將Span和Trace在一個(gè)系統(tǒng)中使用Zipkin注解的過程圖形化:
3.12 Spring Cloud Feign 使用HTTP請求遠(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考赛。但是腻惠,用起來最方便、最優(yōu)雅的還是要屬Feign了欲虚。
Feign是一種聲明式、模板化的HTTP客戶端悔雹。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn)复哆,開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請求腌零。
通過Feign梯找, 我們能把HTTP遠(yuǎn)程調(diào)用對開發(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無疑是最佳選擇。
Feign是一個(gè)聲明式的偽Http客戶端扭弧,它使得寫Http客戶端變得更簡單阎姥。使用Feign,只需要?jiǎng)?chuàng)建一個(gè)接口并注解鸽捻。它具有可插拔的注解特性呼巴,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的編碼器和解碼器御蒲。Feign默認(rèn)集成了Ribbon衣赶,并和Eureka結(jié)合,默認(rèn)實(shí)現(xiàn)了負(fù)載均衡的效果厚满。
簡而言之:
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon
3.13 Spring Cloud for Cloud Foundry
Cloud Foundry是VMware推出的業(yè)界第一個(gè)開源PaaS云平臺府瞄,它支持多種框架、語言痰滋、運(yùn)行時(shí)環(huán)境摘能、云平臺及應(yīng)用服務(wù),使開發(fā)人員能夠在幾秒鐘內(nèi)進(jìn)行應(yīng)用程序的部署和擴(kuò)展敲街,無需擔(dān)心任何基礎(chǔ)架構(gòu)的問題
其實(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 語言開發(fā), 基于 Mozilla Public License 2.0 的協(xié)議進(jìn)行開源. Consul 支持健康檢查,并允許 HTTP 和 DNS 協(xié)議調(diào)用 API 存儲鍵值對.
Spring Cloud Consul 封裝了Consul操作惭每,consul是一個(gè)服務(wù)發(fā)現(xiàn)與配置工具,與Docker容器可以無縫集成亏栈。
3.16 Spring Cloud Data Flow
Data flow 是一個(gè)用于開發(fā)和執(zhí)行大范圍數(shù)據(jù)處理其模式包括ETL台腥,批量運(yùn)算和持續(xù)運(yùn)算的統(tǒng)一編程模型和托管服務(wù)。
對于在現(xiàn)代運(yùn)行環(huán)境中可組合的微服務(wù)程序來說绒北,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 是基于原生云對 spring XD的重新設(shè)計(jì)脐往,該項(xiàng)目目標(biāo)是簡化大數(shù)據(jù)應(yīng)用的開發(fā)休吠。Spring XD 的流處理和批處理模塊的重構(gòu)分別是基于 spring boot的stream 和 task/batch 的微服務(wù)程序。這些程序現(xiàn)在都是自動(dòng)部署單元而且他們原生的支持像 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)度的工作,比如說某些定時(shí)任務(wù)晚上就跑一次克饶,或者某項(xiàng)數(shù)據(jù)分析臨時(shí)就跑幾次酝蜒。
3.18 Spring Cloud Connectors
Spring Cloud Connectors 簡化了連接到服務(wù)的過程和從云平臺獲取操作的過程,有很強(qiáng)的擴(kuò)展性矾湃,可以利用Spring Cloud Connectors來構(gòu)建你自己的云平臺亡脑。
便于云端應(yīng)用程序在各種PaaS平臺連接到后端,如:數(shù)據(jù)庫和消息代理服務(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è)工具,用來監(jiān)控集群下hystrix的metrics情況僵驰。
4 和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來實(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)系陈瘦。
5 Spring Cloud的優(yōu)勢
微服務(wù)的框架那么多比如:dubbo幌甘、Kubernetes,為什么就要使用Spring Cloud的呢痊项?
- 產(chǎn)出于Spring大家族锅风,Spring在企業(yè)級開發(fā)框架中無人能敵,來頭很大鞍泉,可以保證后續(xù)的更新皱埠、完善。比如dubbo現(xiàn)在就差不多死了
- 有Spring Boot 這個(gè)獨(dú)立干將可以省很多事咖驮,大大小小的活spring boot都搞的挺不錯(cuò)边器。
作為一個(gè)微服務(wù)治理的大家伙,考慮的很全面托修,幾乎服務(wù)治理的方方面面都考慮到了忘巧,方便開發(fā)開箱即用。 - Spring Cloud 活躍度很高睦刃,教程很豐富砚嘴,遇到問題很容易找到解決方案
- 輕輕松松幾行代碼就完成了熔斷、均衡負(fù)責(zé)涩拙、服務(wù)中心的各種平臺功能
- Spring Cloud 也有一個(gè)缺點(diǎn)际长,只能使用Java開發(fā),不適合小型獨(dú)立的項(xiàng)目。
6 Spring Cloud前景
Spring Cloud對于中小型互聯(lián)網(wǎng)公司來說是一種福音兴泥,因?yàn)檫@類公司往往沒有實(shí)力或者沒有足夠的資金投入去開發(fā)自己的分布式系統(tǒng)基礎(chǔ)設(shè)施工育,使用Spring Cloud一站式解決方案能在從容應(yīng)對業(yè)務(wù)發(fā)展的同時(shí)大大減少開發(fā)成本。同時(shí)搓彻,隨著近幾年微服務(wù)架構(gòu)和docker容器概念的火爆翅娶,也會讓Spring Cloud在未來越來越“云”化的軟件開發(fā)風(fēng)格中立有一席之地文留,尤其是在目前五花八門的分布式解決方案中提供了標(biāo)準(zhǔn)化的、全站式的技術(shù)方案竭沫,意義可能會堪比當(dāng)前Servlet規(guī)范的誕生燥翅,有效推進(jìn)服務(wù)端軟件系統(tǒng)技術(shù)水平的進(jìn)步。