1. 程式人生 > >Spring Cloud 系列之 Config 配置中心(二)

Spring Cloud 系列之 Config 配置中心(二)

本篇文章為系列文章,未讀第一集的同學請猛戳這裡:Spring Cloud 系列之 Config 配置中心(一)

本篇文章講解 Config 如何實現配置中心自動重新整理。

配置中心自動重新整理

點選連結觀看:配置中心自動重新整理視訊(獲取更多請關注公眾號「哈嘍沃德先生」)

Spring Cloud Config 在專案啟動時才會載入配置內容這一機制,導致了它存在一個缺陷,修改配置檔案內容後,不會自動重新整理。例如我們之前的專案,當服務已經啟動的時候,修改 Github 上的配置檔案內容,這時候,再次重新整理頁面,對不起,還是舊的配置內容,新內容不會主動重新整理過來。

訪問:http://localhost:9090/name 結果如下:

重啟 Config Client 以後,訪問:http://localhost:9090/name 結果如下:

但是,總不能每次修改了配置後重啟服務吧。如果是那樣的話,還是不要用它為好,直接用本地配置檔案豈不更快。

它提供了一個重新整理機制,但是需要我們主動觸發。那就是 @RefreshScope 註解並結合 Actuator,注意要引入 spring-boot-starter-actuator

新增依賴

Config Client 新增 spring-boot-starter-actuator 依賴。

<!-- spring boot actuator 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置檔案

其實這裡主要用到的是 refresh 這個端點。以下為 Config Client 的 bootstrap.yml

spring:
  cloud:
    config:
      name: order-service # 配置檔名稱,對應 git 倉庫中配置檔案前半部分
      uri: http://localhost:8888 # config-server 服務端地址
      label: master # git 分支
      profile: dev # 指定環境
      discovery:
        enabled: true # 開啟
        service-id: config-server # 指定配置中心服務端的 service-id

# 度量指標監控與健康檢查
management:
  endpoints:
    web:
      base-path: /actuator    # 訪問端點根路徑,預設為 /actuator
      exposure:
        include: '*'          # 需要開啟的端點,這裡主要用到的是 refresh 這個端點
        #exclude:             # 不需要開啟的端點

控制層

在需要讀取配置的類上增加 @RefreshScope 註解。

package com.example.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
public class ConfigController {

    @Value("${name}")
    private String name;

    @GetMapping("/name")
    public String getName() {
        return name;
    }

}

測試

重啟 Config Client,訪問:http://localhost:9090/actuator 可以看到 refresh 端點已開啟。

修改 Github 上的配置檔案內容並提交,訪問:http://localhost:9090/name,沒有反應,不慌。

接下來,我們傳送 POST 請求到 http://localhost:9090/actuator/refresh 這個介面,用 Postman 之類的工具即可。

再次訪問:http://localhost:9090/name 結果如下:

在 Github 中配置 Webhook

這就結束了嗎,並沒有,總不能每次改了配置後,就用 Postman 訪問一下 refresh 介面吧,還是不夠方便呀。

Github 提供了一種 Webhook 的方式,當有程式碼變更的時候,會呼叫我們設定的地址,來實現我們想達到的目的。

進入 Github 倉庫配置頁面,選擇 Webhooks ,並點選 Add webhook。

填寫回調的地址,也就是上面提到的 actuator/refresh 這個地址,但是必須保證這個地址是可以被 Github 訪問的。如果是內網就沒辦法了。一般公司內的專案都會有自己的程式碼管理工具,例如自建的 gitlab,gitlab 也有 webhook 的功能,這樣就可以呼叫到內網的地址了。

還有一種辦法就是使用 spring-cloud-config-monitor,然後呼叫 /monitor 介面完成動態重新整理。

Spring Cloud Bus 自動重新整理

如果只有一個 Config Client 的話,那我們用 Webhook,設定手動重新整理都不算太費事,但是如果客戶端比較多的情況下,一個一個去手動重新整理未免有點複雜。我們可以藉助 Spring Cloud Bus 的廣播功能,讓 Config Client 都訂閱配置更新事件,當配置更新時,觸發其中一個端的更新事件,Spring Cloud Bus 就把此事件廣播到其他訂閱客戶端,以此來達到批量更新。

為了方便大家學習和整理,這部分的知識我會在微服務系列之 Spring Cloud Bus 中單獨給大家講解。記得關注噢 ~

下一篇我們講解 Config 如何實現配置中心加解密,配置中心使用者安全認證,記得關注噢~

![](https://user-gold-cdn.xitu.io/2020/5/12/172065f7c6d9e044?w=433&h=133&f=gif&s=333013) 本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。 大家可以通過 `分類` 檢視更多關於 `Spring Cloud` 的文章。