1.Spring Cloud Bus簡介
Spring Cloud Bus 是 Spring Cloud 體系內的消息總線,用來連接分佈式系統的所有節點。 Spring Cloud Bus 將分佈式的節點用輕量的消息代理(RibbitMQ、Kafka)連接起來。可以通過消息代理廣播配置文件的更改,或服務之間的通訊,也可以用於監控。解決了微服務數據變更,及時同步的問題。 目前 Spring Cloud Bus 支持兩種消息代理:RabbitMQ 和 Kafka,下面以 RabbitMQ 爲例來演示下使用Spring Cloud Bus 動態刷新配置的功能。
2.搭建演示工程
2.1 環境準備
由於本文中使用 RabbitMQ 作爲消息代理,故需要安裝RabbitMQ,安裝部署參考: https://blog.csdn.net/ThinkWon/article/details/103753372
本文案例基於上一篇文章中Config Server與Config Client工程改造。並啓動Eureka Server。
2.2 Config Server工程改造
引入bus相關依賴,具體pom如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-demo</artifactId>
<groupId>com.hxmec</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-config-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- config server依賴包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Spring Cloud Bus-->
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在配置文件application.yml中加上RabbitMq的配置,包括RabbitMq的地址、端口,用戶名、密碼。並需要加上spring.cloud.bus的配置,具體如下:
server:
port: 9005
spring:
application:
name: config-server
cloud:
config:
label: master
server:
git:
#github配置地址
uri: https://github.com/ty1972873004/spring-cloud-config.git
#配置文件路徑
search-paths: appconfig
#username:
#password:
#git分支
default-label: master
bus:
enabled: true
trace:
enabled: true
# 消息隊列
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /
# 度量指標監控與健康檢查
management:
endpoints:
web:
base-path: /actuator # 訪問端點根路徑,默認爲 /actuator
exposure:
include: bus-refresh # 需要開啓的端點
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
2.2 Config Client工程改造
引入bus相關依賴,具體pom如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-demo</artifactId>
<groupId>com.hxmec</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-config-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- config client依賴包-->
<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>
<!-- SpringCloud Bus -->
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在配置文件application.yml中加上RabbitMq的配置,包括RabbitMq的地址、端口,用戶名、密碼。並需要加上spring.cloud.bus的配置,具體如下:
spring:
application:
name: config-client
cloud:
config:
uri: http://127.0.0.1:9005/
label: master
profile: dev
name: ${spring.application.name}
discovery:
enabled: true
service-id: config-server
bus:
enabled: true
trace:
enabled: true
# 消息隊列
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /
management:
endpoints:
web:
exposure:
include: 'refresh'
server:
port: 9006
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
在獲取動態配置的類或者啓動類中添加@RefreshScope註解用於刷新配置
@RestController
@RequestMapping("/demo")
@Slf4j
@RefreshScope
public class DemoController {
@Value("${hx.name:#{null}}")
private String name;
@GetMapping(value = "/test1")
public String test1(){
return "Hello " + name;
}
}
2.3 工程演示
啓動Config Server,Config Client工程此時配置文件如下訪問config client中接口http://127.0.0.1:9006/demo/test1 可以看下如下結果。修改github中配置文件,如下此時訪問訪問接口還是返回沒有更改前的結果。此時,我們發送post請求:http://localhost:9005/actuator/bus-refresh ,再次請求接口http://127.0.0.1:9006/demo/test1 ,可以看下如下結果,說明驗證通過。
3.工程地址
https://github.com/ty1972873004/spring-cloud-demo
4.參考文檔
- https://cloud.spring.io/spring-cloud-static/spring-cloud-bus/2.2.1.RELEASE/reference/html/