Spring cloud作為當(dāng)下主流的微服務(wù)框架棒厘,讓我們實(shí)現(xiàn)微服務(wù)架構(gòu)簡(jiǎn)單快捷,Spring cloud中各個(gè)組件在微服務(wù)架構(gòu)中扮演的角色如下圖所示下隧,黑線表示注釋說(shuō)明奢人,藍(lán)線由A指向B,表示B從A處獲取服務(wù)汪拥。
由上圖所示微服務(wù)架構(gòu)大致由上圖的邏輯結(jié)構(gòu)組成达传,其包括各種微服務(wù)、注冊(cè)發(fā)現(xiàn)迫筑、服務(wù)網(wǎng)關(guān)宪赶、熔斷器、統(tǒng)一配置脯燃、跟蹤服務(wù)等搂妻。下面說(shuō)說(shuō)Spring cloud中的組件分別充當(dāng)其中的什么角色。
Fegin(接口調(diào)用):微服務(wù)之間通過(guò)Rest接口通訊辕棚,Spring Cloud提供Feign框架來(lái)支持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)用一樣逝嚎。
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è)中心將他們保存起來(lái),服務(wù)間相互調(diào)用的時(shí)候叽掘,通過(guò)服務(wù)名稱就可以到注冊(cè)中心找到對(duì)應(yīng)的服務(wù)信息楣铁,從而進(jìn)行通訊。注冊(cè)與發(fā)現(xiàn)服務(wù)為微服務(wù)之間的調(diào)用帶來(lái)了方便更扁,解決了硬編碼的問(wèn)題盖腕。服務(wù)間只通過(guò)對(duì)方的服務(wù)id赫冬,而無(wú)需知道其ip和端口即可以獲取對(duì)方方服務(wù)。
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(熔斷器):當(dāng)服務(wù)提供者響應(yīng)非常緩慢,那么消費(fèi)者對(duì)提供者的請(qǐng)求就會(huì)被強(qiáng)制等待钦勘,直到提供者響應(yīng)或超時(shí)陋葡。在高負(fù)載場(chǎng)景下,如果不做任何處理彻采,此類問(wèn)題可能會(huì)導(dǎo)致服務(wù)消費(fèi)者的資源耗竭甚至整個(gè)系統(tǒng)的崩潰(雪崩效應(yīng))腐缤。Hystrix正是為了防止此類問(wèn)題發(fā)生。Hystrix是由Netflix開源的一個(gè)延遲和容錯(cuò)庫(kù)肛响,用于隔離訪問(wèn)遠(yuǎn)程系統(tǒng)岭粤、服務(wù)或者第三方庫(kù),防止級(jí)聯(lián)失敗特笋,從而提升系統(tǒng)的可用性與容錯(cuò)性剃浇。Hystrix主要通過(guò)以下幾點(diǎn)實(shí)現(xiàn)延遲和容錯(cuò)。
包裹請(qǐng)求:使用HystrixCommand(或HystrixObservableCommand)包裹對(duì)依賴的調(diào)用邏輯雹有,每個(gè)命令在獨(dú)立線程中執(zhí)行偿渡。這使用了設(shè)計(jì)模式中的“命令模式”臼寄。
跳閘機(jī)制:當(dāng)某服務(wù)的錯(cuò)誤率超過(guò)一定閾值時(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(微服務(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ì)有以下的問(wèn)題:
客戶端會(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é)議王财,直接訪問(wèn)時(shí)會(huì)有一定的困難。
以上問(wèn)題可借助微服務(wù)網(wǎng)關(guān)解決裕便。微服務(wù)網(wǎng)關(guān)是介于客戶端和服務(wù)器端之間的中間層绒净,所有的外部請(qǐng)求都會(huì)先經(jīng)過(guò)微服務(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)交互改览,而無(wú)須直接調(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ù)瞻离,而無(wú)須在每個(gè)微服務(wù)中進(jìn)行認(rèn)證腾仅。
減少了客戶端與各個(gè)微服務(wù)之間的交互次數(shù)。
Spring cloud bus( 統(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í)例的配置馅笙。
Sleuth+ZipKin(跟蹤服務(wù)):Sleuth和Zipkin結(jié)合使用可以通過(guò)圖形化的界面查看微服務(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ù)的信息、健康狀況窝趣、刷新配置等疯暑。