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

1、概述

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

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

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

2、實現方式

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

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

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

③Spring Cloud Bus接收消息並通知給其餘連線在總線上的客戶端,全部總線上的客戶端均能接收到消息。bootstrap

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

⑤所有客戶端均獲取到最新的配置服務器

以上存在問題:併發

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

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

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

 

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

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

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

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

⑤所有客戶端獲取到最新的配置

3、實現步驟

  基於方式二的實現,分爲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接口

 4、測試

(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

參考連接:http://www.javashuo.com/article/p-wcjlagtu-cz.html

相關文章
相關標籤/搜索