微服務(wù)之消息總線

簡(jiǎn)介

在上篇文章《微服務(wù)之配置中心》中寫到,客戶端可從服務(wù)端獲取配置信息,當(dāng)Git倉(cāng)庫(kù)中的配置文件修改后,為了讓客戶端獲取最新的配置信息站刑,可以通過執(zhí)行refresh操作進(jìn)行手動(dòng)刷新。但是這樣有問題鼻百,當(dāng)客戶端很多時(shí)(隨之系統(tǒng)的不斷擴(kuò)大)绞旅,如果需要每個(gè)客戶端都執(zhí)行一遍,那就蛋疼了温艇,顯然這種方案就不適合了玻靡。Spring Cloud作為微服務(wù)架構(gòu)的一個(gè)綜合解決方案,也提供了對(duì)應(yīng)的解決方案Spring Cloud Bus中贝,即消息總線囤捻。

這里要理解一個(gè)概念,消息總線邻寿。簡(jiǎn)單理解就是一個(gè)消息中心蝎土,眾多微服務(wù)實(shí)例可以連接到總線上,實(shí)例可以往消息中心發(fā)送或接收信息(通過監(jiān)聽)绣否。比如:實(shí)例A發(fā)送一條消息到總線上誊涯,總線上的實(shí)例B可以接收到信息(實(shí)例B訂閱了實(shí)例A),這樣的話蒜撮,消息總線就充當(dāng)一個(gè)中間者的角色暴构,使得實(shí)例A和實(shí)例B解偶了跪呈,很方便。

圖片發(fā)自簡(jiǎn)書App

消息總線(Spring Cloud Bus)

原理

Spring Cloud Bus通過建立多個(gè)應(yīng)用之間的通信頻道取逾,管理和傳播應(yīng)用間的消息耗绿,從技術(shù)角度來(lái)說(shuō),應(yīng)用了AMQP消息代理作為通道砾隅,通過MQ的廣播機(jī)制實(shí)現(xiàn)消息的發(fā)送和接收误阻。以其典型應(yīng)用——配置中心客戶端刷新為例,說(shuō)明下工作流程:

圖片發(fā)自簡(jiǎn)書App

(1)修改配置文件晴埂,觸發(fā)webhook向clientA發(fā)送bus/refresh究反;

(2)clientA重新從配置中心獲取新的配置信息,同時(shí)發(fā)送消息到Spring Cloud Bus儒洛;

(3)Spring Cloud Bus收到消息精耐,同時(shí)通知clientB、clientC(訂閱配置更新事件)琅锻;

(4)clientB卦停、clientC收到通知,重新請(qǐng)求配置中心浅浮,獲取新的配置信息。

這樣捷枯,三個(gè)客戶端均得到最新的配置滚秩。

消息代理

這個(gè)過程中,作為通道的AMQP消息代理很重要淮捆。AMQP(高級(jí)消息隊(duì)列協(xié)議郁油,是一個(gè)標(biāo)準(zhǔn))是一個(gè)網(wǎng)絡(luò)協(xié)議,從扮演角色來(lái)說(shuō)攀痊,消息代理從生產(chǎn)者(producers)那兒接收消息桐腌,并根據(jù)既定的路由規(guī)則把接收到的消息發(fā)送給處理消息的消費(fèi)者(consumers),這個(gè)過程中的發(fā)布者,消費(fèi)者苟径,消息代理可以存在于不同的設(shè)備上案站,下面簡(jiǎn)單介紹下工作流程(其實(shí)跟上面的類似):

圖片發(fā)自簡(jiǎn)書App

消息(message)被發(fā)布者(publisher)發(fā)送給交換機(jī)(exchange),交換機(jī)常常被比喻成郵局或者郵箱棘街。然后交換機(jī)將收到的消息根據(jù)路由規(guī)則分發(fā)給綁定的隊(duì)列(queue)蟆盐。最后AMQP代理會(huì)將消息投遞給訂閱了此隊(duì)列的消費(fèi)者,或者消費(fèi)者按照需求自行獲取遭殉。

? ? ? AMQP作為一個(gè)標(biāo)準(zhǔn)協(xié)議石挂,主要實(shí)現(xiàn)方案有RabbitMQ、ActiveMQ险污、Qpid等痹愚。這里我主要以RabbitMQ為例進(jìn)行說(shuō)明,它是一個(gè)優(yōu)秀的微服務(wù)架構(gòu)消息中間件,與Spring Cloud Bus能夠很好的結(jié)合使用拯腮。

下圖顯示了RabbitMQ的Web管理首頁(yè):

圖片發(fā)自簡(jiǎn)書App

(1)Broker:消息隊(duì)列服務(wù)器窖式,即負(fù)責(zé)接收生產(chǎn)者消息,發(fā)送至消費(fèi)者的疾瓮;

(2)Connections:連接脖镀,即發(fā)送者、消息接收者狼电、消費(fèi)者之間的物理連接蜒灰;

(3)Channel:通道,連接生產(chǎn)者肩碟、消費(fèi)者的邏輯結(jié)構(gòu)强窖。一個(gè)Connection可以對(duì)應(yīng)多個(gè)Channel;

圖片發(fā)自簡(jiǎn)書App

(4)Exchange:消息交換機(jī)削祈,消息第一個(gè)到達(dá)的地方翅溺,可以指定路由規(guī)則,決定消息分發(fā)到不同的消息隊(duì)列中去髓抑;

(5)Queue:消息隊(duì)列咙崎,消息經(jīng)Exchange路由轉(zhuǎn)發(fā)至此,進(jìn)入邏輯等待狀態(tài)(等待消費(fèi)吨拍,即客戶端獲韧拭汀);

(6)Binding:綁定羹饰,把Exchange和Queue按照路由規(guī)則進(jìn)行綁定伊滋,即決定Exchange接收消息后,需要發(fā)送到哪些Queue中:

圖片發(fā)自簡(jiǎn)書App

消息發(fā)送-接收原理圖

圖片發(fā)自簡(jiǎn)書App

配置步驟

Config Server服務(wù)端

(1)在Config Server添加RabbitMQ依賴队秩,非常簡(jiǎn)單:

圖片發(fā)自簡(jiǎn)書App

(2)修改配置文件笑旺,添加RabbitMQ的配置信息:

圖片發(fā)自簡(jiǎn)書App

(3)啟動(dòng)類加注解:

圖片發(fā)自簡(jiǎn)書App

Config Client客戶端

(1)在Config Client添加RabbitMQ依賴,非常簡(jiǎn)單:

圖片發(fā)自簡(jiǎn)書App

(2)修改配置文件馍资,添加RabbitMQ的配置信息:

圖片發(fā)自簡(jiǎn)書App

Eureka Server注冊(cè)中心

省略筒主。

測(cè)試

(1)啟動(dòng)Eureka Server注冊(cè)中心、ConfigServer服務(wù)端鸟蟹、Config Client客戶端(開啟兩個(gè)實(shí)例)物舒,如圖:

圖片發(fā)自簡(jiǎn)書App

(2)客戶端獲取配置文件的值,如圖:


圖片發(fā)自簡(jiǎn)書App
圖片發(fā)自簡(jiǎn)書App
圖片發(fā)自簡(jiǎn)書App

(3)修改配置文件值戏锹,改為apps.caac.net/demo冠胯,如圖:


圖片發(fā)自簡(jiǎn)書App

(4)通過curl執(zhí)行刷新操作(配置服務(wù)端執(zhí)行/bus/refresh),如圖:


圖片發(fā)自簡(jiǎn)書App

(5)客戶端重新獲取配置文件的值锦针,可知已獲取最新配置信息荠察,如圖:


圖片發(fā)自簡(jiǎn)書App
圖片發(fā)自簡(jiǎn)書App

(6)至此完成配置自動(dòng)刷新置蜀,當(dāng)部署正式環(huán)境時(shí),可以在配置文件修改時(shí)自動(dòng)執(zhí)行一個(gè)操作:curl -X POST http://localhost:8889/bus/refresh悉盆,在碼云后臺(tái)可以進(jìn)行設(shè)置(這里測(cè)試環(huán)境盯荤,設(shè)置不了,必須是公網(wǎng)地址)焕盟,如圖:

圖片發(fā)自簡(jiǎn)書App

局部刷新

有時(shí)我們只想刷新部分微服務(wù)的配置秋秤,此時(shí)可通過/bus/refresh端點(diǎn)的destination參數(shù)來(lái)定位要刷新的應(yīng)用程序。

刷新指定實(shí)例(某一服務(wù))

執(zhí)行:/bus/refresh?destination=customers:9000脚翘,

其中灼卢,customers:9000指的是各個(gè)微服務(wù)的ApplicationContext ID(默認(rèn)為:${spring.application.name}:${server.port})。

刷新全部實(shí)例(某一服務(wù))

執(zhí)行:/bus/refresh?destination=customers:**来农,這樣就可以觸發(fā)customers微服務(wù)所有實(shí)例的配置刷新鞋真。

圖片發(fā)自簡(jiǎn)書App

注意:這里的${spring.application.name}區(qū)分大小寫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沃于,一起剝皮案震驚了整個(gè)濱河市涩咖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌繁莹,老刑警劉巖檩互,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咨演,居然都是意外死亡闸昨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門雪标,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)零院,“玉大人溉跃,你說(shuō)我怎么就攤上這事村刨。” “怎么了撰茎?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嵌牺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我龄糊,道長(zhǎng)逆粹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任炫惩,我火速辦了婚禮僻弹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘他嚷。我一直安慰自己蹋绽,他們只是感情好芭毙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卸耘,像睡著了一般退敦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚣抗,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天侈百,我揣著相機(jī)與錄音,去河邊找鬼翰铡。 笑死钝域,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的两蟀。 我是一名探鬼主播网梢,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赂毯!你這毒婦竟也來(lái)了战虏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤党涕,失蹤者是張志新(化名)和其女友劉穎烦感,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膛堤,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡手趣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肥荔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绿渣。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖燕耿,靈堂內(nèi)的尸體忽然破棺而出中符,到底是詐尸還是另有隱情,我是刑警寧澤誉帅,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布淀散,位于F島的核電站,受9級(jí)特大地震影響蚜锨,放射性物質(zhì)發(fā)生泄漏档插。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一亚再、第九天 我趴在偏房一處隱蔽的房頂上張望郭膛。 院中可真熱鬧,春花似錦氛悬、人聲如沸则剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忍级。三九已至帆谍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轴咱,已是汗流浹背汛蝙。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朴肺,地道東北人窖剑。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像戈稿,于是被迫代替她去往敵國(guó)和親西土。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理鞍盗,服務(wù)發(fā)現(xiàn)需了,斷路器,智...
    卡卡羅2017閱讀 134,661評(píng)論 18 139
  • 前言 在微服務(wù)架構(gòu)的系統(tǒng)中般甲,我們通常會(huì)使用輕量級(jí)的消息代理來(lái)構(gòu)建一個(gè)共用的消息主題讓系統(tǒng)中所有微服務(wù)實(shí)例都連接上來(lái)...
    Chandler_玨瑜閱讀 6,580評(píng)論 2 39
  • 前言 在微服務(wù)架構(gòu)的系統(tǒng)中肋乍,我們通常會(huì)使用輕量級(jí)的消息代理來(lái)構(gòu)建一個(gè)共用的消息主題讓系統(tǒng)中所有微服務(wù)實(shí)例都能連接上...
    二月_春風(fēng)閱讀 10,514評(píng)論 0 14
  • 先回顧一下,在之前的Spring Cloud Config的介紹中敷存,我們還留了一個(gè)懸念:如何實(shí)現(xiàn)對(duì)配置信息的實(shí)時(shí)更...
    程序猿DD閱讀 4,299評(píng)論 3 19
  • 客戶端獲取到最新的配置信息需要執(zhí)行refresh墓造,可以利用webhook的機(jī)制每次提交代碼發(fā)送請(qǐng)求來(lái)刷新客戶端,當(dāng)...
    Superwind20閱讀 981評(píng)論 0 2