SpringCloud Bus自動刷新配置

解決的問題

爲解決配置文件改變後,項目需要重啓的問題

使改變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/

如此既可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章