一、Spring Cloud Config 動態刷新配置
spring-boot-starter-actuator模塊包含了/refresh 刷新API。通過此API可以刷新獲取到GIT裏最新的配置。
在config-client的pom文件中添加actuator依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改GIT裏的配置,然後在客戶端調用/refresh API, 比如localhost:8080/refresh。 可以發現獲取到最新的GIT配置。
二、RabbitMQ 消息總線
我們已經可以通過/refresh和git的web Hook來實現配置的手動刷新,消息代理中間件可以將消息路由到一個或多個目的地。
於是我們可以通過Spring Cloud Bus總線來將連接到總線的所有隊列都能夠實時的接收到GIT倉庫中的應用配置。
三、 RabbitMQ 實現
我們可以在RabbitMQ的客戶端添加一個spring-cloud-bus-amqp 模塊,需要注意的是,在此之前有添加過spring-boot-starter-actuator模塊是必須的。
1.在Config-client客戶端添加Spring Cloud Bus依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2. 添加RabbitMQ配置:
spring.rabbitmq.port = 5672
spring.rabbitmq.username = admin
spring.rabbitmq.password = Aegon_2018
spring.rabbitmq.virtual-host = /fec-uat
spring.rabbitmq.host = rabbitmq-fec.dev
3. 步驟:
1) 先訪問我們之前2個應用定義的/from請求,會返回當前的倉庫的from 配置。
2) 然後修改GIT配置,from=測試, 可以自定義內容。
3) 然後發送一個POST請求到其中一個客戶端的/bus/refresh上。
4) 重新訪問另外一個客戶端,查看配置是否被修改。
Spring Cloud Bus 的/bus/refresh 接口, 出發了總線上其他服務實例的/refresh。
4. 指定刷新範圍
/bus/refresh 請求提供了destination參數,用來定位具體要刷新的應用程序。 destination 對應的值爲rabbitmq中的不同Exchange。通過指定一個exchange,可以把一個exchange視爲一個環境,來指定刷新該路由下綁定的所有隊列。
比如添加一個exchange屬性配置:
spring.rabbitmq.publisher-confirms = true
spring.cloud.stream.default-binder = rabbit
spring.cloud.stream.bindings.springCloudBusInput.destination = springCloudBus.fec-uat
spring.cloud.stream.bindings.springCloudBusInput.group = fec-uat-${spring.application.name}
spring.cloud.stream.bindings.springCloudBusOutput.destination = springCloudBus.fec-uat
spring.cloud.stream.bus.enabled = true
spring.cloud.stream.bus.trace.enabled = true
四、 架構優化
前面可以通過config-client客戶端連接config-server的形式從config-server那兒拿到對應的配置,服務實例與config-server都是註冊到eureka上的,因此可以在config-server模塊中添加 spring-cloud-starter-bus-amqp模塊,由config-server來擔任從GIT中拉取配置和實時更新配置的職責。只要config-server的/bus/refresh觸發了 ,那麼指定destination的實例將會獲取到最新的配置。
改動如下:
1. 在Config Server中也引⼊Spring Cloud Bus依賴,將配置服務端也加⼊到消息總線中來。
2. /bus/refresh 請求不在發送到具體服務實例上,⽽是發送給Config Server,並通 過 destination參數來指定需要更新配置的服務或實例。