SpringCloud Bus訊息匯流排
在微服務架構中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題來連線各個微服務例項,它廣播的訊息會被所有在註冊中心的微服務例項監聽和消費,也稱訊息匯流排。
SpringCloud中也有對應的解決方案,SpringCloud Bus 將分散式的節點用輕量的訊息代理連線起來,可以很容易搭建訊息匯流排,配合SpringCloud config 實現微服務應用配置資訊的動態更新。
訊息代理屬於中介軟體。設計代理的目的就是為了能夠從應用程式中傳入訊息,並執行一些特別的操作。開源產品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud僅支援RabbitMQ和Kafka。本文采用RabbitMQ實現這一功能。
搭建分散式配置中心
Config架構
當一個系統中的配置檔案發生改變的時候,我們需要重新啟動該服務,才能使得新的配置檔案生效,spring cloud config可以實現微服務中的所有系統的配置檔案的統一管理,而且還可以實現當配置檔案發生變化的時候,系統會自動更新獲取新的配置。
訊息代理屬於中介軟體。設計代理的目的就是為了能夠從應用程式中傳入訊息,並執行一些特別的操作。開源產品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud僅支援RabbitMQ和Kafka。本文采用RabbitMQ實現這一功能。
Git環境搭建
使用碼雲環境搭建git伺服器端
碼雲環境地址:https://gitee.com/yushengjun/events
Git伺服器上傳配置檔案
命名規範 服務名稱-版本.yml 例如configclient_dev.yml
搭建Eureka 註冊中心
搭建config-server
Maven依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version </parent> <dependencies> <!-- SpringBoot整合Web元件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--spring-cloud 整合 config-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.0.2.RELEASE</version> </dependency> <!-- SpringBoot整合eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies> <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> |
application.yml
###服務註冊到eureka地址 eureka: client: service-url: defaultZone:http://localhost:8100/eureka spring: application: ####註冊中心應用名稱 name:config-server cloud: config: server: git: ###git環境地址 uri:https://gitee.com/itmayi/config_003.git ####搜尋目錄 search-paths: - config ####讀取分支 label:master ####埠號 server: port:8888 |
啟動config-server
@SpringBootApplication @EnableEurekaClient @EnableConfigServer publicclassAppConfigServer { publicstaticvoidmain(String[] args) { SpringApplication.run(AppConfigServer.class, args); } } |
讀取配置檔案http://127.0.0.1:8888/configclient-dev.yml
搭建config-client
Maven依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus-parent</artifactId> <version>2.0.0.RC2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- SpringBoot整合Web元件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> <!-- SpringBoot整合eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> <!--核心jar包 --> <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> </dependencies> <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> |
application.yml
spring: application: ####註冊中心應用名稱 name:configclient cloud: config: ####讀取字尾 profile:dev ####讀取config-server註冊地址 discovery: service-id:config-server enabled:true ##### eureka服務註冊地址 eureka: client: service-url: defaultZone:http://localhost:8100/eureka server: port:8882 |
啟動config-client
@RestController publicclassConfigClientController { // 年齡 @Value("${userAge}") privateString userAge; @RequestMapping("/userAge") publicString userAge() { returnuserAge; } } |
@SpringBootApplication @EnableEurekaClient publicclassAppConfigClient { publicstaticvoidmain(String[] args) { SpringApplication.run(AppConfigClient.class, args); } } |
重新整理配置檔案
1.手動採用actuator端點重新整理資料
2.採用bus廣播通知
手動actuator端點重新整理資料
Maven依賴資訊
<!-- actuator監控中心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> |
Bootstrap.xml新增
開啟監控斷點
management: endpoints: web: exposure: include:"*" |
生效前提
在需要重新整理的Bean上新增@RefreshScope註解。
@RestController // @SpringBootApplication @RefreshScope publicclassConfigClientController { http://127.0.0.1:8882/actuator/refresh @Value("${itmayieduInfo}") privateString itmayieduInfo; |
當配置更改時,標有@RefreshScope的Bean將得到特殊處理來生效配置
手動重新整理介面
Post請求手動重新整理
http://127.0.0.1:8882/actuator/refresh啟動重新整理器 從cofnig server讀取
http://127.0.0.1:8882/actuator/bus-refresh
使用訊息匯流排
三個專案中都加上該依賴資訊
Maven依賴
<!--核心jar包 --> <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> |
配置檔案
###開啟bus重新整理 management: endpoints: web: exposure: include:bus-refresh |
重新整理介面http://127.0.0.1:8882/actuator/bus-refresh