Spring Cloud Bus
概念
Spring Cloud Bus 通過一個輕量級訊息代理連線分散式系統的節點。這可以用於廣播狀態更改(如配置更改)或其他管理指令。當前唯一的實現方式是通過一個AMQP代理作為訊息傳輸,但相同的基本特徵(傳輸上的一些依賴)是其他傳輸的路線圖
AMQP,即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體不同產品,不同的開發語言等條件的限制。Erlang中的實現有RabbitMQ等
Erlang下載地址:http://www.erlang.org/download.html
RabbitMQ下載地址:http://www.rabbitmq.com/download.html
Erlang需要環境變數才能執行,安裝完RabbitMQ會自動生產環境變數ERLANG_HOME,如果沒有,自己配置
進入RabbitMQ安裝目錄下的sbin目錄,開啟cmd輸入rabbitmq-plugins enable rabbitmq_management安裝視覺化外掛
開啟服務,訪問http://localhost:15672/檢視自己是否安裝成功,使用者名稱密碼預設都是guest
環境
- jdk11
- maven3.8.1
- SpringBoot 2.2.2
- SpringCloud Hoxton.SR1
再建一個客戶端cloud-config-client-3366
pom
<dependencies> <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-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
bootstrap.yml
server: port: 3366 spring: application: name: config-client cloud: #Config客戶端配置 config: label: master #分支名稱 name: config #配置檔名稱 profile: dev #讀取字尾名稱 上述3個綜合:master分支上config-dev.yml的配置檔案被讀取http://config-3344.com:3344/master/config-dev.yml uri: http://localhost:3344 #配置中心地址 #服務註冊到eureka地址 eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 暴露監控端點 management: endpoints: web: exposure: include: "*"
主啟動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class ConfigClientMain3366 { public static void main(String[] args) { SpringApplication.run(ConfigClientMain3366.class,args); } }
controller
import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class ConfigClientController { @Value("${server.port}") private String serverPort; @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String configInfo() { return "serverPort: "+serverPort+"\t\n\n configInfo: "+configInfo; } }
利用訊息匯流排觸發一個客戶端/bus/refresh,而重新整理所有客戶端的配置
利用訊息匯流排觸發一個服務端ConfigServer的/bus/refresh端點,而重新整理所有客戶端的配置
圖二的架構顯然更加適合,圖一打破了微服務的職責單一性,因為微服務本身是業務模組,它本不應該承擔配置重新整理的職責。
給3344服務端新增訊息匯流排支援
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-actuator</artifactId> </dependency>
yml
management:
endpoints: #暴露bus重新整理配置的端點
web:
exposure:
include: 'bus-refresh'
給客戶端3355,3366新增訊息匯流排支援
pom
<!--新增訊息匯流排RabbitMQ支援--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
yml
server: port: 3355 spring: application: name: config-client cloud: #Config客戶端配置 config: label: master #分支名稱 name: config #配置檔名稱 profile: dev #讀取字尾名稱 上述3個綜合:master分支上config-dev.yml的配置檔案被讀取 uri: http://localhost:3344 #配置中心地址k #rabbitmq相關配置 15672是Web管理介面的埠;5672是MQ訪問的埠 rabbitmq: host: localhost port: 5672 username: guest password: guest #服務註冊到eureka地址 eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 暴露監控端點 management: endpoints: web: exposure: include: "*" # 'refresh'
server: port: 3366 spring: application: name: config-client cloud: #Config客戶端配置 config: label: master #分支名稱 name: config #配置檔名稱 profile: dev #讀取字尾名稱 上述3個綜合:master分支上config-dev.yml的配置檔案被讀取 uri: http://localhost:3344 #配置中心地址k #rabbitmq相關配置 15672是Web管理介面的埠;5672是MQ訪問的埠 rabbitmq: host: localhost port: 5672 username: guest password: guest #服務註冊到eureka地址 eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 暴露監控端點 management: endpoints: web: exposure: include: "*" # 'refresh'
修改gitee上配置檔案增加版本號
傳送 curl -X POST "http://localhost:3344/actuator/bus-refresh"請求
訪問:
- http://config-3344.com:3344/config-dev.yml
- http://localhost:3355/configInfo
- http://localhost:3366/configInfo
發現配置檔案都已經重新整理
定點通知
指定具體某一個例項生效而不是全部 ,修改gutee的配置檔案,公式:http://localhost:配置中心的埠號/actuator/bus-refresh/{destination},傳送請求curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
destination=服務名稱+埠號