Feign
Eureka
Ribbon
Hystrix
Zuul
Config
Zipkin
其它
Spring cloud作為當(dāng)下主流的微服務(wù)框架而账,讓我們實(shí)現(xiàn)微服務(wù)架構(gòu)簡(jiǎn)單快捷胰坟,Spring cloud中各個(gè)組件在微服務(wù)架構(gòu)中扮演的角色如下圖所示,黑線表示注釋說明泞辐,藍(lán)線由A指向B腕铸,表示B從A處獲取服務(wù)。
Spring cloud組成的微服務(wù)架構(gòu)圖
由上圖所示微服務(wù)架構(gòu)大致由上圖的邏輯結(jié)構(gòu)組成铛碑,其包括各種微服務(wù)、注冊(cè)發(fā)現(xiàn)虽界、服務(wù)網(wǎng)關(guān)汽烦、熔斷器、統(tǒng)一配置莉御、跟蹤服務(wù)等撇吞。下面說說Spring cloud中的組件分別充當(dāng)其中的什么角色。
Feign
Feign(接口調(diào)用):微服務(wù)之間通過Rest接口通訊礁叔,Spring Cloud提供Feign框架來支持Rest的調(diào)用牍颈,F(xiàn)eign使得不同進(jìn)程的Rest接口調(diào)用得以用優(yōu)雅的方式進(jìn)行,這種優(yōu)雅表現(xiàn)得就像同一個(gè)進(jìn)程調(diào)用一樣琅关。
Eureka
Netflix eureka(注冊(cè)發(fā)現(xiàn)):微服務(wù)模式下煮岁,一個(gè)大的Web應(yīng)用通常都被拆分為很多比較小的web應(yīng)用(服務(wù)),這個(gè)時(shí)候就需要有一個(gè)地方保存這些服務(wù)的相關(guān)信息涣易,才能讓各個(gè)小的應(yīng)用彼此知道對(duì)方画机,這個(gè)時(shí)候就需要在注冊(cè)中心進(jìn)行注冊(cè)。每個(gè)應(yīng)用啟動(dòng)時(shí)向配置的注冊(cè)中心注冊(cè)自己的信息(ip地址新症,端口號(hào), 服務(wù)名稱等信息)步氏,注冊(cè)中心將他們保存起來,服務(wù)間相互調(diào)用的時(shí)候徒爹,通過服務(wù)名稱就可以到注冊(cè)中心找到對(duì)應(yīng)的服務(wù)信息荚醒,從而進(jìn)行通訊芋类。注冊(cè)與發(fā)現(xiàn)服務(wù)為微服務(wù)之間的調(diào)用帶來了方便,解決了硬編碼的問題界阁。服務(wù)間只通過對(duì)方的服務(wù)id侯繁,而無需知道其ip和端口即可以獲取對(duì)方方服務(wù)。
Ribbon
Ribbon(負(fù)載均衡):Ribbon是Netflix發(fā)布的負(fù)載均衡器铺董,它有助于控制HTTP和TCP客戶端的行為巫击。為Ribbon,配置服務(wù)提供者的地址列表后精续,Ribbon就可基于某種負(fù)載均衡算法坝锰,自動(dòng)地幫助服務(wù)消費(fèi)者去請(qǐng)求。Ribbon默認(rèn)為我們提供了很多的負(fù)載均衡算法重付,例如輪詢顷级、隨機(jī)等。當(dāng)然确垫,我們也可為Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法弓颈。在SpringCloud中,當(dāng)Ribbon與Eureka配合使用時(shí)删掀,Ribbon可自動(dòng)從EurekaServer獲取服務(wù)提供者的地址列表翔冀,并基于負(fù)載均衡算法,請(qǐng)求其中一個(gè)服務(wù)提供者的實(shí)例(為了服務(wù)的可靠性披泪,一個(gè)微服務(wù)可能部署多個(gè)實(shí)例)纤子。
Hystrix
Hystrix(熔斷器):當(dāng)服務(wù)提供者響應(yīng)非常緩慢,那么消費(fèi)者對(duì)提供者的請(qǐng)求就會(huì)被強(qiáng)制等待款票,直到提供者響應(yīng)或超時(shí)控硼。在高負(fù)載場(chǎng)景下,如果不做任何處理艾少,此類問題可能會(huì)導(dǎo)致服務(wù)消費(fèi)者的資源耗竭甚至整個(gè)系統(tǒng)的崩潰(雪崩效應(yīng))卡乾。Hystrix正是為了防止此類問題發(fā)生。Hystrix是由Netflix開源的一個(gè)延遲和容錯(cuò)庫(kù)缚够,用于隔離訪問遠(yuǎn)程系統(tǒng)幔妨、服務(wù)或者第三方庫(kù),防止級(jí)聯(lián)失敗潮瓶,從而提升系統(tǒng)的可用性與容錯(cuò)性陶冷。Hystrix主要通過以下幾點(diǎn)實(shí)現(xiàn)延遲和容錯(cuò)。
包裹請(qǐng)求:使用HystrixCommand(或HystrixObservableCommand)包裹對(duì)依賴的調(diào)用邏輯毯辅,每個(gè)命令在獨(dú)立線程中執(zhí)行埂伦。這使用了設(shè)計(jì)模式中的“命令模式”。
跳閘機(jī)制:當(dāng)某服務(wù)的錯(cuò)誤率超過一定閾值時(shí)思恐,Hystrix可以自動(dòng)或者手動(dòng)跳閘沾谜,停止請(qǐng)求該服務(wù)一段時(shí)間膊毁。
資源隔離:Hystrix為每個(gè)依賴都維護(hù)了一個(gè)小型的線程池(或者信號(hào)量)。如果該線程池已滿基跑,發(fā)往該依賴的請(qǐng)求就被立即拒絕婚温,而不是排隊(duì)等候,從而加速失敗判定媳否。
監(jiān)控:Hystrix可以近乎實(shí)時(shí)地監(jiān)控運(yùn)行指標(biāo)和配置的變化栅螟,例如成功、失敗篱竭、超時(shí)和被拒絕的請(qǐng)求等力图。
回退機(jī)制:當(dāng)請(qǐng)求失敗、超時(shí)掺逼、被拒絕吃媒,或當(dāng)斷路器打開時(shí),執(zhí)行回退邏輯吕喘∽改牵回退邏輯可由開發(fā)人員指定。
Zuul
Zuul(微服務(wù)網(wǎng)關(guān)) :不同的微服務(wù)一般會(huì)有不同的網(wǎng)絡(luò)地址氯质,而外部客戶端可能需要調(diào)用多個(gè)服務(wù)的接口才能完成一個(gè)業(yè)務(wù)需求募舟。例如一個(gè)電影購(gòu)票的手機(jī)APP,可能調(diào)用多個(gè)微服務(wù)的接口才能完成一次購(gòu)票的業(yè)務(wù)流程闻察,如果讓客戶端直接與各個(gè)微服務(wù)通信胃珍,會(huì)有以下的問題:
客戶端會(huì)多次請(qǐng)求不同的微服務(wù),增加了客戶端的復(fù)雜性蜓陌。
存在跨域請(qǐng)求,在一定場(chǎng)景下處理相對(duì)復(fù)雜吩蔑。
認(rèn)證復(fù)雜钮热,每個(gè)服務(wù)都需要獨(dú)立認(rèn)證。
難以重構(gòu)烛芬,隨著項(xiàng)目的迭代隧期,可能需要重新劃分微服務(wù)。例如赘娄,可能將多個(gè)服務(wù)合并成一個(gè)或者將一個(gè)服務(wù)拆分成多個(gè)仆潮。如果客戶端直接與微服務(wù)通信,那么重構(gòu)將很難實(shí)施遣臼。
某些微服務(wù)可能使用了對(duì)防火墻/瀏覽器不友好的協(xié)議性置,直接訪問時(shí)會(huì)有一定的困難。
以上問題可借助微服務(wù)網(wǎng)關(guān)解決揍堰。微服務(wù)網(wǎng)關(guān)是介于客戶端和服務(wù)器端之間的中間層鹏浅,所有的外部請(qǐng)求都會(huì)先經(jīng)過微服務(wù)網(wǎng)關(guān)嗅义。使用微服務(wù)網(wǎng)關(guān)后,微服務(wù)網(wǎng)關(guān)將封裝應(yīng)用程序的內(nèi)部結(jié)構(gòu)隐砸,客戶端只用跟網(wǎng)關(guān)交互之碗,而無須直接調(diào)用特定微服務(wù)的接口。這樣季希,開發(fā)就可以得到簡(jiǎn)化褪那。不僅如此,使用微服務(wù)網(wǎng)關(guān)還有以下優(yōu)點(diǎn):
易于監(jiān)控式塌〔┚矗可在微服務(wù)網(wǎng)關(guān)收集監(jiān)控?cái)?shù)據(jù)并將其推送到外部系統(tǒng)進(jìn)行分析。
易于認(rèn)證珊搀∫背溃可在微服務(wù)網(wǎng)關(guān)上進(jìn)行認(rèn)證,然后再將請(qǐng)求轉(zhuǎn)發(fā)到后端的微服務(wù)境析,而無須在每個(gè)微服務(wù)中進(jìn)行認(rèn)證囚枪。
減少了客戶端與各個(gè)微服務(wù)之間的交互次數(shù)。
Config
Spring cloud Config( 統(tǒng)一配置服務(wù)):對(duì)于傳統(tǒng)的單體應(yīng)用劳淆,常使用配置文件管理所有配置链沼。例如一個(gè)SpringBoot開發(fā)的單體應(yīng)用,可將配置內(nèi)容放在application.yml文件中沛鸵。如果需要切換環(huán)境括勺,可設(shè)置多個(gè)Profile,并在啟動(dòng)應(yīng)用時(shí)指定spring.profiles.active={profile}曲掰。然而疾捍,在微服務(wù)架構(gòu)中,微服務(wù)的配置管理一般有以下需求:
集中管理配置栏妖。一個(gè)使用微服務(wù)架構(gòu)的應(yīng)用系統(tǒng)可能會(huì)包含成百上千個(gè)微服務(wù)乱豆,因此集中管理配置是非常有必要的。
不同環(huán)境吊趾,不同配置宛裕。例如,數(shù)據(jù)源配置在不同的環(huán)境(開發(fā)论泛、測(cè)試揩尸、預(yù)發(fā)布、生產(chǎn)等)中是不同的屁奏。
運(yùn)行期間可動(dòng)態(tài)調(diào)整岩榆。例如,可根據(jù)各個(gè)微服務(wù)的負(fù)載情況,動(dòng)態(tài)調(diào)整數(shù)據(jù)源連接池大小或熔斷閾值朗恳,并且在調(diào)整配置時(shí)不停止微服務(wù)湿颅。
配置修改后可自動(dòng)更新。如配置內(nèi)容發(fā)生變化粥诫,微服務(wù)能夠自動(dòng)更新配置油航。綜上所述,對(duì)于微服務(wù)架構(gòu)而言怀浆,一個(gè)通用的配置管理機(jī)制是必不可少的谊囚,常見做法是使用配置服務(wù)器管理配置。Spring cloud bus利用Git或SVN等管理配置执赡、采用Kafka或者RabbitMQ等消息總線通知所有應(yīng)用镰踏,從而實(shí)現(xiàn)配置的自動(dòng)更新并且刷新所有微服務(wù)實(shí)例的配置。
Zipkin
Sleuth+ZipKin(跟蹤服務(wù)):Sleuth和Zipkin結(jié)合使用可以通過圖形化的界面查看微服務(wù)請(qǐng)求的延遲情況以及各個(gè)微服務(wù)的依賴情況沙合。需要注意的是Spring boot2及以上不在支持Zipkin的自定義奠伪,需要到官方網(wǎng)站下載ZipKin相關(guān)的jar包。
其它
另外需要提一點(diǎn)的是Spring boot actuator首懈,提供了很多監(jiān)控端點(diǎn)如/actuator/info绊率、/actuator/health、/acutator/refresh等究履,可以查看微服務(wù)的信息滤否、健康狀況、刷新配置等最仑。