SpringCloud (第九篇)整合消息總線 Bus

前面兩篇文章我們聊了Spring Cloud Config配置中心,當(dāng)我們?cè)诟耮ithub上面的配置以后,如果想要獲取到最新的配置,需要手動(dòng)刷新或者利用webhook的機(jī)制每次提交代碼發(fā)送請(qǐng)求來刷新客戶端,客戶端越來越多的時(shí)候,需要每個(gè)客戶端都執(zhí)行一遍,這種方案就不太適合了。
Spring Cloud Bus的一個(gè)功能就是讓這個(gè)過程變得簡(jiǎn)單,當(dāng)遠(yuǎn)程Git倉(cāng)庫(kù)的配置更改后,只需要向其中的一個(gè)微服務(wù)實(shí)例發(fā)送一個(gè)Post請(qǐng)求,通過消息組件通知其它微服務(wù)實(shí)例重新拉去配置文件即可。

一、 SpringCloud Bus簡(jiǎn)介

Spring Cloud Bus 將分布式的節(jié)點(diǎn)用輕量的消息代理連接起來。它可以用于廣播配置文件的更改或者服務(wù)之間的通訊,
也可以用于監(jiān)控。本文要講述的是用Spring Cloud Bus實(shí)現(xiàn)通知微服務(wù)架構(gòu)的配置文件的更改。Spring Cloud Bus可選的消息代理組件包括RabbitMQ,AMQP和Kafka等。
整體實(shí)現(xiàn)架構(gòu)圖:


image.png

架構(gòu)圖分析

架構(gòu)圖的簡(jiǎn)單分析:
⑴Eureka-Server服務(wù)
        這個(gè)服務(wù)主要是用來服務(wù)的注冊(cè)和發(fā)現(xiàn)的,它是一個(gè)注冊(cè)中心,我們會(huì)將Config Server,Config Client這些服務(wù)都注冊(cè)進(jìn)去。
⑵ Config Server服務(wù)
        這個(gè)是一個(gè)分布式配置中心Config Server,通過它我們可以從遠(yuǎn)處Git倉(cāng)庫(kù)讀取我們需要的配置文件,所以,
Config Client  服務(wù)可以通過連接它來獲取自己需要的配置信息。
⑶ Config Client服務(wù)
        這個(gè)服務(wù)是ConfigClient客戶端,它需要從ConfigServer服務(wù)端獲取自己的配置文件信息。
⑷ 消息總線
           可以理解為一個(gè)消息代理,它可以將分布式的節(jié)點(diǎn)都連接起來,也可以完成各個(gè)應(yīng)用程序節(jié)點(diǎn)間的相互通信, 這里我們主要用來廣播配置文件的更改,
  并且消息總線的可選消息代理組件包括RabbitMQ,AMQP和Kafka等,這 里我們選中的是RabbitMQ組件。
⑸/bus/refresh
         這個(gè)是用來刷新配置的請(qǐng)求,當(dāng)遠(yuǎn)程倉(cāng)庫(kù)的配置文件修改后,我們不需要重新啟動(dòng)各個(gè)子節(jié)點(diǎn),只需向某一個(gè) 子節(jié)點(diǎn)發(fā)送一個(gè)Post請(qǐng)求即可,
消息總線會(huì)自動(dòng)通知其它各個(gè)節(jié)點(diǎn)進(jìn)行配置文件的刷新。

二、 SpringCloud Bus 使用

1. 準(zhǔn)備工作

本文還是基于上一篇文章來實(shí)現(xiàn)。按照官方文檔,我們只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;這就是說我們需要裝rabbitMq,已在本機(jī)上安裝。安裝教程:https://blog.csdn.net/qq_41307443/article/details/80865409

image.png

2. 改造 cloud_13_config_client_high 模塊

復(fù)制子模塊 cloud_13_config_client_high 該名稱 cloud_14_config_client_bus ,修改子模塊的pom,并引入父模塊。


image.png

在父模塊 引入 子模塊:


image.png

3. 在 子模塊的pom中添加依賴

      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
     </dependency>

完整依賴:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 服務(wù)注冊(cè)中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--config-config 的服務(wù)依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!-- 消息總線 Bus -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

4. 修改配置文件

修改 bootstrap.yml ,修改如下:

server:
  port: 9105

## spring cloud eureka
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:9090/eureka/

# spring config
spring:
  application:
    ####注冊(cè)中心應(yīng)用名稱
    name:  config-client


  cloud:
      config:
        #  github 上的 配置文件前綴名稱
        name: config-client
        label: master
        profile: dev
        ####讀取config-server注冊(cè)地址
        discovery:
          #指定server端的name,也就是server
          service-id: config-server
          #開啟Config服務(wù)發(fā)現(xiàn)支持
          enabled: true

# 新添加 Bus 配置
      bus:
        enabled: true
        trace:
          enabled: true
# 新添加 RabbitMQ
  rabbitmq:
    host: 192.168.1.107
    port: 5672
    username: root
    password: 123456
management:
  endpoint:
  endpoints:
    web:
      exposure:
        include: bus-refresh

注意:這里我一開始使用了http的端口 15672,發(fā)生了上述異常。后面改成了 5672 可以成功連接。映射2個(gè)RabbitMQ有2個(gè)端口:5672端口是客戶端和RabbitMQ及通信的接口,15672端口為管理界面訪問web界面的端口。

5. 修改啟動(dòng)類

在啟動(dòng)類上添加注解

@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class CloudClientBusApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudClientBusApplication.class, args);
    }
}

6. 控制類讀取配置文件

@RefreshScope
@RestController
public class ConfigClientController {

    // 果獲取不到冒號(hào)前的配置,則使用冒號(hào)后作為默認(rèn)值
   //@Value("${yaosy:yaosy default}")
    @Value("${yaosy}")
    private String yaosy;

    @Value("${github}")
    private String github;

    @GetMapping("/yaosy")
    public String getYaosy(){
        return yaosy ;
    }
}

注意:注解 @RefreshScope //配置文件自動(dòng)刷新

7. 啟動(dòng)服務(wù)并測(cè)試

依次啟動(dòng)eureka-cloud_eureka_01、 cloud_12_config_server_high, cloud_14_config_client_bus,端口為:9106。
啟動(dòng)成功后會(huì)自動(dòng)添加RabbitMQ隊(duì)列,如圖:


image.png

在瀏覽器中訪問:http://127.0.0.1:9106/yaosy 頁(yè)面顯示:

image.png

進(jìn)入 github 將yaosy的值改為 : “yaosy version 2.0.0”,即改變配置文件 yaosy 的值。如果是傳統(tǒng)的做法,需要重啟cloud_14_config_client_bus服務(wù),才能達(dá)到配置文件的更新。

image.png

然而通過Bus,我們只需要發(fā)送post請(qǐng)求:http://127.0.0.1:9106/actuator/bus-refresh,你會(huì)發(fā)現(xiàn)cloud_14_config_client_bus會(huì)重新讀取配置文件。
在這里我使用 postman 進(jìn)行post請(qǐng)求發(fā)送,http://127.0.0.1:9106/actuator/bus-refresh .

image.png

請(qǐng)求發(fā)送后 cloud_14_config_client_bus 進(jìn)行重新讀取配置文件。
image.png

刷新瀏覽器頁(yè)面:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容