解決的問題
爲解決配置文件改變後,項目需要重啓的問題
使改變git中配置文件後,推送配置到相應項目,完成配置更新而不需要重啓
架構
改造config的架構圖,引入消息隊列的使用(這裏選擇RabbitMQ)。
git配置文件改變後,通過調用bus-refresh捷庫推送到config server,config server將配置文件發送給消息隊列,服務監聽消息隊列拿到對應配置,拉取完成更新
集成
RabbitMQ的安裝
前邊說過docker與微服務的關係了,自此,docker開始正式使用。RabbitMQ便使用docker的方式進行安裝。
docker安裝很簡單在這裏就不寫教程了。
docker輸入
docker run -d --hostname my-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
docker的5672端口映射爲本機5672
15672是管理界面的端口,瀏覽器通過 ip:15672訪問
版本 rabbitmq:3-management 帶有 -managemen是指有管理界面的mq
此時在瀏覽器輸入 localhost:15672
賬號密碼均爲 guest
mq就啓動完成了
bus自動刷新集成
首先是config配置中心項目
pom引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
配置文件加入mq的配置
spring:
application:
name: config
cloud:
config:
server:
git:
uri:
username:
password:
rabbitmq:
host: your-mq-ip
port: 5672
username: guest
password: guest
host是docker啓動mq的IP地址
啓動config項目
此時mq的Queues菜單會如下圖所示
有個springcloudbus的隊列
order項目
此時爲驗證自動刷新,啓動另一個項目order,同樣註冊eureka,基本配置保留
spring:
application:
name: order
cloud:
config:
profile: dev
discovery:
service-id: CONFIG
enabled: true
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
其他的在git中新建order-dev.yml文件
spring:
application:
name: order
rabbitmq:
host:
port: 5672
username: guest
password: guest
env:
devtest
其中env是爲了測試修改後是否成功的測試字段
pom引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
啓動order項目
此時mq有兩個隊列
測試刷新
爲了更加直觀的測試配置文件是否拉取成功,新建一個EnvController文件,獲取env的值
@RestController
@RequestMapping("/env")
@RefreshScope //此註解會實現配置文件的實時自動刷新,不寫不會刷新
public class EnvController {
@Value("${env}") //${}讀取配置文件的env字段
private String env;
@GetMapping("/print")
public String print() {
return env;
}
}
啓動兩個項目後,清空兩個項目的控制檯,測試是否拉取了配置
首先測試order的配置正確與否 輸入 localhost:8080/order-dev.yml(我加了些其他配置,按上邊的配置來)
此時瀏覽器輸入 http://localhost:8081/env/print ,顯示爲
此時修改git中env由devtest改爲test,保存後再次輸入 http://localhost:8081/env/print
發現還是devtest並沒有改變,控制檯也還是空白
由最上邊的架構圖發現,需要訪問bus-refresh接口才會推送更新,所以需要訪問此接口
由於此接口訪問方式爲 POST,所以使用命令行的方式,打開電腦cmd窗口,輸入
curl -v -X POST "http://localhost:8080/actuator/bus-refresh"
此時config控制檯
order的控制檯
此時訪問 http://localhost:8081/env/print
Webhooks自動刷新
到此時仍然是要通過訪問接口才能刷新配置,下面通過git的webhooks自動刷新配置,即git中配置文件更改後,項目自動接收配置並刷新。實際上webhooks指的就是文件改變時,他會自動訪問一個我們指定接口,來完成刷新。
打開git,點擊settings,點擊webhooks菜單,Add webhook
點擊後
其中Payload URL是項目的公網ip,使用localhost肯定是不行了,本機的IP地址也不行
可以使用一個內網穿透工具 https://natapp.cn/ ,可以註冊一個免費的,只不過地址浮動,開一次變一個
就把自己的地址寫上,並在之後加上 /monitor 就可以了,monitor即爲git的bus-refresh
我的就是
http://fk7248.natappfree.cc/monitor
Conetent Type使用json
點擊綠色的Add webhook即可
最後更改配置文件,加上
bus:
id: ${spring.application.name}:${spring.cloud.config.profile}:${random.value}
完整的配置文件
spring:
application:
name: order
cloud:
config:
profile: dev
discovery:
service-id: CONFIG
enabled: true
bus:
id: ${spring.application.name}:${spring.cloud.config.profile}:${random.value}
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
如此既可以了