SpringCloud全家桶學習之消息總線---SpringCloud Bus


一、概述

  ConfigClient(微服務)從ConfigServer端獲取自己對應的配置文件,但是目前的問題是:當遠程git倉庫配置文件發生改變時,每次都是需要重啟ConfigCient(微服務),如果有上百上千個微服務呢?我想我們不會一個個去重啟每個微服務,也就是說如何讓ConfigServer端通知到ConfigClient端?即ConfigClient端如何感知到配置發生更新?

  SpringCloud Bus會向外提供一個http接口,即下圖中的/bus/refresh。我們將這個接口配置到git的webhook上,當git上的內容發生改變時,就會自動調用/bus/refresh接口。Bus就會通知ConfigServer,configserver會發布更新消息到消息總線的消息隊列,其他服務訂閱到該消息就會信息刷新,從而實現整個微服務進行自動刷新。

  SpringCloud Bus官網地址:https://www.springcloud.cc/spring-cloud-bus.html

二、實現方式

(1)方式一:某個微服務承擔配置刷新的職責

①提交配置出發post請求調用客戶端A的/bus/refresh接口

②客戶端A收到請求從Server端更新配置並且發送給Spring Cloud Bus消息總線

③Spring Cloud Bus接收消息並通知給其他連線在總線上的客戶端,所有總線上的客戶端均能接收到消息。

④其他客戶端接收到消息,請求Server端獲取最新配置

⑤全部客戶端均獲取到最新的配置

以上存在問題:

  ①打破微服務的單一原則。微服務本身是業務模塊,本不應該承擔配置刷新的職責

  ②WebHook的配置也隨着承擔刷新配置的微服務節點發生變化。

(2)方式二:配置中心Server端承擔起配置刷新的職責,原理圖如下:

 

①提交配置觸發post請求給server端的/bus/refresh接口

②server端接收到請求並發送給SpringCloud Bus總線

③Sping Cloud Bus接收到消息並通知給其他連接的總線的客戶端

④其他客戶端接收到通知,請求Server端獲取最新配置

⑤全部客戶端獲取到最新的配置

三、實現步驟

  基於方式二的實現,分為Config Server和Config Client配置

0.RabbitMQ的安裝

Linux下RabbitMQ的安裝及使用

1.ConfigServer服務端配置

1.1添加pom、application.yml配置

 <!--config server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
<!-- springcloud-bus依賴實現配置自動更新,rabbitmq -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
pom
server:
  port: 3344

spring:
  application:
    name: microservice-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Simple-Coder/microservice-config.git #github上的倉庫地址
          search-paths: /**
          username: ********  #這里配置用戶名
          password: ********  #這里配置密碼
      label: master
  rabbitmq:
    host: 39.98.190.54    #公網地址
    port: 5672
    username: guest
    password: guest

#SpringCloud暴露接口,暴露/bus/refresh接口
management:
  security:
    enabled: false

#開啟基本的權限,默認為true
security:
  basic:
    enabled: false
application.yml

1.2 啟動類添加@EnableConfigServer

   ConfigServer服務端配置完成!

2.ConfigClient服務端配置

2.1添加pom依賴、bootstrap.yml配置

<!--config-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
 <!--amqp-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
 <!--actuator-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
pom
spring:
  cloud:
    config:
      name: microservice-config-client   #需要從github上讀取的資源名稱,注意沒有yml名稱
      profile: test                       #本次訪問的配置項
      label: master
      uri: http://39.98.190.54:3344       #本服務啟動后先去找3344服務,通過SpringCloudConfig獲取github的服務地址
  rabbitmq:
    host: 39.98.190.54
    port: 5672
    username: guest
    password: guest

security:
  basic:
    enabled: false
bootstrap.yml

 2.2添加注解: @RefreshScope添加在需要刷新的配置文件上

   至此,Config Client端配置完成!

 3.WebHook配置

  前邊:ConfigServer和ConfigClient配置完成,要實現自動刷新需要調用/bus/refresh接口通過ConfigServer

3.1方式一:手動調用(post請求):http://config3344.com:3344/bus/refresh

 3.2方式二:配置git的webhook ,當git端配置發生改變,自動調用/bus-refresh接口

 四、測試

(1)啟動ConfigServer(含有公網IP的服務器,我這里買的阿里雲服務器)

 (2)啟動ConfigClient:本地代碼工程(microservice-config-client3355)

 (3)瀏覽器訪問:http://localhost:5002/config

 (4)修改配置文件:microservice-config-client.yml

修改完成以后,查看ConfigServer服務端的控制台日志打印如下:

 (5)刷新:http://localhost:5002/config

 至此,Config配置自動刷新完成!

本項目地址https://github.com/Simple-Coder/microservice-demo-study

參考鏈接:https://blog.csdn.net/wtdm_160604/article/details/83720391


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM