一張圖了解Spring cloud微服務(wù)架構(gòu)

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ù)汪拥。

Spring cloud組成的微服務(wù)架構(gòu)圖??

由上圖所示微服務(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ù)的信息、健康狀況窝趣、刷新配置等疯暑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哑舒,隨后出現(xiàn)的幾起案子妇拯,更是在濱河造成了極大的恐慌,老刑警劉巖洗鸵,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件越锈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡膘滨,警方通過(guò)查閱死者的電腦和手機(jī)瞪浸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吏祸,“玉大人对蒲,你說(shuō)我怎么就攤上這事」鼻蹋” “怎么了蹈矮?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鸣驱。 經(jīng)常有香客問(wèn)我泛鸟,道長(zhǎng),這世上最難降的妖魔是什么踊东? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任北滥,我火速辦了婚禮刚操,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘再芋。我一直安慰自己菊霜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布济赎。 她就那樣靜靜地躺著鉴逞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪司训。 梳的紋絲不亂的頭發(fā)上构捡,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音壳猜,去河邊找鬼勾徽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛统扳,可吹牛的內(nèi)容都是我干的捂蕴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼闪幽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啥辨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起盯腌,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溉知,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腕够,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體级乍,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年帚湘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玫荣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡大诸,死狀恐怖捅厂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情资柔,我是刑警寧澤焙贷,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站贿堰,受9級(jí)特大地震影響辙芍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一故硅、第九天 我趴在偏房一處隱蔽的房頂上張望庶灿。 院中可真熱鬧,春花似錦吃衅、人聲如沸往踢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菲语。三九已至妄辩,卻和暖如春惑灵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眼耀。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工英支, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哮伟。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓干花,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親楞黄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子池凄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348