上一篇學習了spring cloud config的基本使用,但發現有個問題,就是每次更改配置后,都需要重啟服務才能更新配置,這樣肯定是不行的。在上網查資料了解后,spring cloud支持通過AMQP來實現配置的實時更新。
一、安裝rabbitmq
1.1
如果要使用spring cloud的amqp,需要安裝rabbitmq。我們可以通過官網 https://www.rabbitmq.com/download.html 下載。我用的是mac,下載解壓后,執行$RABBITMQ_HOME/sbin/rabbitmq-server來啟動rabbitmq。
rabbitmq的默認用戶和密碼都是guest,而默認端口是5672
其他rabbitmq相關的這里就不多說了。
二、改造config-server和client-a
2.1
在config-server和client-a兩個模塊下的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>
這里說明下spring-boot-starter-actuator是spring-boot自帶的監控模塊,我們要使用spring-cloud-starter-bus-amqp的話,也必須加上。
2.2
修改client-a模塊的配置文件,主要是加上rabbitmq的配置,修改后如下,而config-server的配置文件不用修改
server:
port: 8910
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8010/eureka/
spring:
application:
name: client-a
cloud:
config:
discovery:
enabled: true #開啟通過服務來訪問Config Server的功能
service-id: config-server
profile: dev
label: master
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
2.3
注意,要達到配置自動更新,這里需要修改client-a的TestController,添加@RefreshScope注解
@RestController
@RefreshScope
public class TestController {
...
}
2.4
重啟config-server和client-a
可以注意下啟動日志,其中應該有一段是
o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/bus/refresh],methods=[POST]}"
這就是觸發配置刷新的方式。
打開http://localhost:8910/getProperties 應該看到配置還是舊的配置
修改git上的配置文件
以post形式訪問配置中心的http://localhost:8030/bus/refresh 來觸發配置更新,看本地的日志,config-server和client-a都會有刷新配置的日志打印
再打開http://localhost:8910/getProperties 應該可以看到配置已經更新了
2.5
現在雖然可以不用重啟服務就更新配置了,但還是需要我們手動操作,這樣還是不可取的。
所以,這里就要用到git的webhooks來達到自動更新配置。
打開git上配置倉庫的地址,添加webhooks
上面的Payload URL就填寫我們的配置中心觸發刷新的地址,當然這里不能寫localhost啦,要外網訪問地址才行。
還有這里面有個Secret的秘鑰驗證,如果這里填寫的話,在配置文件上要寫上encrypt.key與之對應。