4.《kafka》spring-cloud-bus

一。spring-cloud-bus是什么瘤缩?

回答這個(gè)問(wèn)題之前,我們先回顧先前的分布式配置,當(dāng)配置中心發(fā)生變化后伯病,我們需要利用spring-boot-actuator里的refresh端點(diǎn)進(jìn)行手動(dòng)刷新:

spring-cloud-bus

根據(jù)上述示例情況:我們每次要獲取最新配置時(shí),要一個(gè)一個(gè)的通過(guò)refresh刷新服務(wù)節(jié)點(diǎn)否过,這種方式是不是非常low而且非常麻煩午笛,那該怎么辦呢?

大家還記得zookeeper中watch是做什么用的嗎苗桂?當(dāng)監(jiān)控的節(jié)點(diǎn)數(shù)據(jù)發(fā)生變化了药磺,那么是不是所有訂閱到該節(jié)點(diǎn)的客戶(hù)端都會(huì)觸發(fā)一個(gè)訂閱回調(diào)呢?這其實(shí)也類(lèi)似于我們的消息總線(xiàn)煤伟。在微服務(wù)架構(gòu)的系統(tǒng)中癌佩,我們通常會(huì)使用輕量級(jí)的消息代理來(lái)構(gòu)建一個(gè)公有的消息主題讓系統(tǒng)中所有微服務(wù)實(shí)例都連接上來(lái),由于該主題中產(chǎn)生的消息會(huì)被所有實(shí)例監(jiān)聽(tīng)和消費(fèi)便锨,所以我們稱(chēng)它為消息總線(xiàn)围辙。

那么在分布式配置中,我們的所有服務(wù)都訂閱消息總線(xiàn)的話(huà)放案,當(dāng)配置改變時(shí)姚建,配置中心通知消息總線(xiàn),然后所有的服務(wù)節(jié)點(diǎn)接收到訂閱消息后吱殉,在從配置中心獲取最新的配置掸冤,是不是一個(gè)一勞永逸的過(guò)程?那么可以得到如下結(jié)構(gòu)圖:

image

回到頂部

二友雳、實(shí)現(xiàn)分布式配置的消息總線(xiàn)

我先貼出:項(xiàng)目結(jié)構(gòu)圖

image

我們統(tǒng)一把配置放在config目錄下

1稿湿、在對(duì)應(yīng)的服務(wù)添加對(duì)應(yīng)的依賴(lài)

首先我們先配置config-server。gradle配置文件:

image.png
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.1.4.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.jayuan</groupId>
   <artifactId>config-server</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>config-server</name>
   <description>Demo project for Spring Boot</description>

   <properties>
       <java.version>1.8</java.version>
       <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.apache.kafka</groupId>
           <artifactId>kafka-streams</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-bus</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-config-server</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-stream-binder-kafka</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.kafka</groupId>
           <artifactId>spring-kafka</artifactId>
       </dependency>

       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.springframework.kafka</groupId>
           <artifactId>spring-kafka-test</artifactId>
           <scope>test</scope>
       </dependency>
   </dependencies>

   <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>${spring-cloud.version}</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
   </dependencyManagement>

   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

</project>


注意我們使用kafka作為消息總線(xiàn)的中間件

然后我們依次在所需的服務(wù)中添加對(duì)應(yīng)的依賴(lài)

image

View Code

2沥阱、配置對(duì)應(yīng)的application.yml

config-server的yml文件:

image

View Code

這里面注意要把端點(diǎn)先開(kāi)放出來(lái)缎罢,然后進(jìn)行kafka的相關(guān)配置,其余服務(wù)的配置文件也進(jìn)行這樣的操作考杉,使其能與消息總線(xiàn)通訊策精。

3、依次啟動(dòng)服務(wù)

當(dāng)服務(wù)啟動(dòng)成功時(shí)崇棠,SpringBootActuator給我們提供一個(gè)/bus/refresh端點(diǎn)咽袜,同時(shí)我們可以在kafka主題里面找到相應(yīng)的topics,其名字為springCloudBus:
image

4、訪(fǎng)問(wèn)Config-Server的/bus/refesh

我們先使用kafka的消費(fèi)端來(lái)監(jiān)聽(tīng)一下消息內(nèi)容枕稀。運(yùn)行:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Kite One", sans-serif; font-size: 12px !important;"> ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic springCloudBus</pre>

緊接著我們?cè)谠L(fǎng)問(wèn) http://localhost:8888/bus/refresh 刷新config-server的配置

然后我們可以發(fā)現(xiàn)消費(fèi)端询刹,訂閱到如下消息:

image

其中:type為消息的事件類(lèi)型

timestamp 為消息的時(shí)間戳

orginService:消息的來(lái)源服務(wù)實(shí)例

destinationService:消息的目標(biāo)服務(wù)實(shí)例谜嫉,**代表了總線(xiàn)上的所有服務(wù)實(shí)例

在本例子中,我們可以看到每個(gè)服務(wù)的ackId都來(lái)自于 type為RefreshRemoteApplicationEvent的服務(wù)ID

5凹联、運(yùn)行服務(wù)

我們先通過(guò)gradle的build任務(wù)進(jìn)行打包會(huì)得到如下文件:xxxx.jar與xxx.jar.orginal

那么進(jìn)入到對(duì)應(yīng)目錄下 啟動(dòng)兩個(gè)服務(wù)并注冊(cè)到注冊(cè)中心 命令如下:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Kite One", sans-serif; font-size: 12px !important;">java -Dserver.port=8300 -Dspring.profiles.active=local -jar xxxx.jar
java -Dserver.port=8200 -Dspring.profiles.active=local -jar xxxx.jar</pre>

注意一定不要在application.yml配置如上參數(shù)沐兰,否則通過(guò)(-Dxxx=xxx)系統(tǒng)變量設(shè)置的值將不會(huì)生效

此時(shí)我們更改config對(duì)應(yīng)的配置并commit后,在運(yùn)行步驟4蔽挠,就可以拿到最新的結(jié)果了住闯,再次附上相關(guān)代碼:

StudentConfig:

image

View Code

order-server-local:

image

View Code

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澳淑,隨后出現(xiàn)的幾起案子比原,更是在濱河造成了極大的恐慌,老刑警劉巖杠巡,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量窘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氢拥,警方通過(guò)查閱死者的電腦和手機(jī)蚌铜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嫩海,“玉大人厘线,你說(shuō)我怎么就攤上這事〕龈铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵渡讼,是天一觀的道長(zhǎng)骂束。 經(jīng)常有香客問(wèn)我,道長(zhǎng)成箫,這世上最難降的妖魔是什么展箱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蹬昌,結(jié)果婚禮上混驰,老公的妹妹穿的比我還像新娘。我一直安慰自己皂贩,他們只是感情好栖榨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著明刷,像睡著了一般婴栽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辈末,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天愚争,我揣著相機(jī)與錄音映皆,去河邊找鬼。 笑死轰枝,一個(gè)胖子當(dāng)著我的面吹牛捅彻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞍陨,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼步淹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了湾戳?” 一聲冷哼從身側(cè)響起贤旷,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砾脑,沒(méi)想到半個(gè)月后幼驶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡韧衣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年盅藻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畅铭。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氏淑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硕噩,到底是詐尸還是另有隱情假残,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布炉擅,位于F島的核電站辉懒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谍失。R本人自食惡果不足惜眶俩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望快鱼。 院中可真熱鬧颠印,春花似錦、人聲如沸抹竹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窃判。三九已至闻坚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兢孝,已是汗流浹背窿凤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工仅偎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雳殊。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓橘沥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親夯秃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子座咆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355