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

Spring cloud作為當(dāng)下主流的微服務(wù)框架,讓我們實現(xiàn)微服務(wù)架構(gòu)簡單快捷瓦阐,Spring cloud中各個組件在微服務(wù)架構(gòu)中扮演的角色如下圖所示,黑線表示注釋說明,藍(lán)線由A指向B搀暑,表示B從A處獲取服務(wù)。

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

由上圖所示微服務(wù)架構(gòu)大致由上圖的邏輯結(jié)構(gòu)組成跨琳,其包括各種微服務(wù)自点、注冊發(fā)現(xiàn)、服務(wù)網(wǎng)關(guān)脉让、熔斷器桂敛、統(tǒng)一配置、跟蹤服務(wù)等溅潜。下面說說Spring cloud中的組件分別充當(dāng)其中的什么角色术唬。

Fegin(接口調(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)得就像同一個進(jìn)程調(diào)用一樣。

Netflix eureka(注冊發(fā)現(xiàn)):微服務(wù)模式下博秫,一個大的Web應(yīng)用通常都被拆分為很多比較小的web應(yīng)用(服務(wù))潦牛,這個時候就需要有一個地方保存這些服務(wù)的相關(guān)信息,才能讓各個小的應(yīng)用彼此知道對方挡育,這個時候就需要在注冊中心進(jìn)行注冊巴碗。每個應(yīng)用啟動時向配置的注冊中心注冊自己的信息(ip地址,端口號, 服務(wù)名稱等信息)即寒,注冊中心將他們保存起來橡淆,服務(wù)間相互調(diào)用的時候召噩,通過服務(wù)名稱就可以到注冊中心找到對應(yīng)的服務(wù)信息,從而進(jìn)行通訊逸爵。注冊與發(fā)現(xiàn)服務(wù)為微服務(wù)之間的調(diào)用帶來了方便具滴,解決了硬編碼的問題。服務(wù)間只通過對方的服務(wù)id师倔,而無需知道其ip和端口即可以獲取對方方服務(wù)构韵。

Ribbon(負(fù)載均衡):Ribbon是Netflix發(fā)布的負(fù)載均衡器,它有助于控制HTTP和TCP客戶端的行為趋艘。為Ribbon疲恢,配置服務(wù)提供者的地址列表后,Ribbon就可基于某種負(fù)載均衡算法瓷胧,自動地幫助服務(wù)消費者去請求显拳。Ribbon默認(rèn)為我們提供了很多的負(fù)載均衡算法,例如輪詢搓萧、隨機等杂数。當(dāng)然,我們也可為Ribbon實現(xiàn)自定義的負(fù)載均衡算法矛绘。在SpringCloud中耍休,當(dāng)Ribbon與Eureka配合使用時刃永,Ribbon可自動從EurekaServer獲取服務(wù)提供者的地址列表货矮,并基于負(fù)載均衡算法,請求其中一個服務(wù)提供者的實例(為了服務(wù)的可靠性斯够,一個微服務(wù)可能部署多個實例)囚玫。

Hystrix(熔斷器):當(dāng)服務(wù)提供者響應(yīng)非常緩慢,那么消費者對提供者的請求就會被強制等待读规,直到提供者響應(yīng)或超時抓督。在高負(fù)載場景下,如果不做任何處理束亏,此類問題可能會導(dǎo)致服務(wù)消費者的資源耗竭甚至整個系統(tǒng)的崩潰(雪崩效應(yīng))铃在。Hystrix正是為了防止此類問題發(fā)生。Hystrix是由Netflix開源的一個延遲和容錯庫碍遍,用于隔離訪問遠(yuǎn)程系統(tǒng)定铜、服務(wù)或者第三方庫,防止級聯(lián)失敗怕敬,從而提升系統(tǒng)的可用性與容錯性揣炕。Hystrix主要通過以下幾點實現(xiàn)延遲和容錯。

包裹請求:使用HystrixCommand(或HystrixObservableCommand)包裹對依賴的調(diào)用邏輯东跪,每個命令在獨立線程中執(zhí)行畸陡。這使用了設(shè)計模式中的“命令模式”鹰溜。

跳閘機制:當(dāng)某服務(wù)的錯誤率超過一定閾值時,Hystrix可以自動或者手動跳閘丁恭,停止請求該服務(wù)一段時間曹动。

資源隔離:Hystrix為每個依賴都維護了一個小型的線程池(或者信號量)。如果該線程池已滿牲览,發(fā)往該依賴的請求就被立即拒絕仁期,而不是排隊等候,從而加速失敗判定竭恬。

監(jiān)控:Hystrix可以近乎實時地監(jiān)控運行指標(biāo)和配置的變化跛蛋,例如成功、失敗痊硕、超時和被拒絕的請求等赊级。

回退機制:當(dāng)請求失敗、超時岔绸、被拒絕理逊,或當(dāng)斷路器打開時,執(zhí)行回退邏輯盒揉〗唬回退邏輯可由開發(fā)人員指定。

Zuul(微服務(wù)網(wǎng)關(guān)) :不同的微服務(wù)一般會有不同的網(wǎng)絡(luò)地址刚盈,而外部客戶端可能需要調(diào)用多個服務(wù)的接口才能完成一個業(yè)務(wù)需求羡洛。例如一個電影購票的手機APP,可能調(diào)用多個微服務(wù)的接口才能完成一次購票的業(yè)務(wù)流程,如果讓客戶端直接與各個微服務(wù)通信,會有以下的問題:

客戶端會多次請求不同的微服務(wù)疫粥,增加了客戶端的復(fù)雜性。

存在跨域請求威蕉,在一定場景下處理相對復(fù)雜。

認(rèn)證復(fù)雜橄仍,每個服務(wù)都需要獨立認(rèn)證韧涨。

難以重構(gòu),隨著項目的迭代侮繁,可能需要重新劃分微服務(wù)虑粥。例如,可能將多個服務(wù)合并成一個或者將一個服務(wù)拆分成多個鼎天。如果客戶端直接與微服務(wù)通信舀奶,那么重構(gòu)將很難實施。

某些微服務(wù)可能使用了對防火墻/瀏覽器不友好的協(xié)議斋射,直接訪問時會有一定的困難育勺。

以上問題可借助微服務(wù)網(wǎng)關(guān)解決但荤。微服務(wù)網(wǎng)關(guān)是介于客戶端和服務(wù)器端之間的中間層,所有的外部請求都會先經(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ā)就可以得到簡化赘方。不僅如此烧颖,使用微服務(wù)網(wǎng)關(guān)還有以下優(yōu)點:

易于監(jiān)控≌福可在微服務(wù)網(wǎng)關(guān)收集監(jiān)控數(shù)據(jù)并將其推送到外部系統(tǒng)進(jìn)行分析炕淮。

易于認(rèn)證√玻可在微服務(wù)網(wǎng)關(guān)上進(jìn)行認(rèn)證涂圆,然后再將請求轉(zhuǎn)發(fā)到后端的微服務(wù),而無須在每個微服務(wù)中進(jìn)行認(rèn)證币叹。

減少了客戶端與各個微服務(wù)之間的交互次數(shù)润歉。

Spring cloud bus( 統(tǒng)一配置服務(wù)):對于傳統(tǒng)的單體應(yīng)用,常使用配置文件管理所有配置颈抚。例如一個SpringBoot開發(fā)的單體應(yīng)用踩衩,可將配置內(nèi)容放在application.yml文件中。如果需要切換環(huán)境邪意,可設(shè)置多個Profile九妈,并在啟動應(yīng)用時指定spring.profiles.active={profile}反砌。然而雾鬼,在微服務(wù)架構(gòu)中,微服務(wù)的配置管理一般有以下需求:

集中管理配置宴树。一個使用微服務(wù)架構(gòu)的應(yīng)用系統(tǒng)可能會包含成百上千個微服務(wù)策菜,因此集中管理配置是非常有必要的。

不同環(huán)境酒贬,不同配置又憨。例如,數(shù)據(jù)源配置在不同的環(huán)境(開發(fā)锭吨、測試蠢莺、預(yù)發(fā)布、生產(chǎn)等)中是不同的零如。

運行期間可動態(tài)調(diào)整躏将。例如锄弱,可根據(jù)各個微服務(wù)的負(fù)載情況,動態(tài)調(diào)整數(shù)據(jù)源連接池大小或熔斷閾值祸憋,并且在調(diào)整配置時不停止微服務(wù)会宪。

配置修改后可自動更新。如配置內(nèi)容發(fā)生變化蚯窥,微服務(wù)能夠自動更新配置掸鹅。綜上所述,對于微服務(wù)架構(gòu)而言拦赠,一個通用的配置管理機制是必不可少的巍沙,常見做法是使用配置服務(wù)器管理配置。Spring cloud bus利用Git或SVN等管理配置荷鼠、采用Kafka或者RabbitMQ等消息總線通知所有應(yīng)用赎瞎,從而實現(xiàn)配置的自動更新并且刷新所有微服務(wù)實例的配置。

Sleuth+ZipKin(跟蹤服務(wù)):Sleuth和Zipkin結(jié)合使用可以通過圖形化的界面查看微服務(wù)請求的延遲情況以及各個微服務(wù)的依賴情況颊咬。需要注意的是Spring boot2及以上不在支持Zipkin的自定義务甥,需要到官方網(wǎng)站下載ZipKin相關(guān)的jar包。

另外需要提一點的是Spring boot actuator喳篇,提供了很多監(jiān)控端點如/actuator/info敞临、/actuator/health、/acutator/refresh等麸澜,可以查看微服務(wù)的信息挺尿、健康狀況、刷新配置等炊邦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末编矾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子馁害,更是在濱河造成了極大的恐慌窄俏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘菜,死亡現(xiàn)場離奇詭異凹蜈,居然都是意外死亡,警方通過查閱死者的電腦和手機忍啸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門仰坦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人计雌,你說我怎么就攤上這事悄晃。” “怎么了凿滤?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵妈橄,是天一觀的道長鼠渺。 經(jīng)常有香客問我,道長眷细,這世上最難降的妖魔是什么拦盹? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮溪椎,結(jié)果婚禮上普舆,老公的妹妹穿的比我還像新娘。我一直安慰自己校读,他們只是感情好沼侣,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歉秫,像睡著了一般蛾洛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雁芙,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天轧膘,我揣著相機與錄音,去河邊找鬼兔甘。 笑死谎碍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洞焙。 我是一名探鬼主播蟆淀,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澡匪!你這毒婦竟也來了熔任?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤唁情,失蹤者是張志新(化名)和其女友劉穎疑苔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荠瘪,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夯巷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哀墓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡喷兼,死狀恐怖篮绰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情季惯,我是刑警寧澤臀突,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站贾漏,受9級特大地震影響候学,放射性物質(zhì)發(fā)生泄漏梳码。R本人自食惡果不足惜伍掀,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一濒蒋、第九天 我趴在偏房一處隱蔽的房頂上張望把兔。 院中可真熱鬧县好,春花似錦焰坪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至善绎,卻和暖如春黔漂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禀酱。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工炬守, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剂跟。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓减途,卻偏偏與公主長得像,于是被迫代替她去往敵國和親曹洽。 傳聞我的和親對象是個殘疾皇子鳍置,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容