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

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

本篇文章講解 Config 如何實現配置中心自動刷新。git

  

配置中心自動刷新

  

  點擊連接觀看:配置中心自動刷新視頻(獲取更多請關注公衆號「哈嘍沃德先生」)web

  Spring Cloud Config 在項目啓動時纔會加載配置內容這一機制,致使了它存在一個缺陷,修改配置文件內容後,不會自動刷新。例如咱們以前的項目,當服務已經啓動的時候,修改 Github 上的配置文件內容,這時候,再次刷新頁面,對不起,仍是舊的配置內容,新內容不會主動刷新過來。spring

  訪問:http://localhost:9090/name 結果以下:bootstrap

  重啓 Config Client 之後,訪問:http://localhost:9090/name 結果以下:安全

  可是,總不能每次修改了配置後重啓服務吧。若是是那樣的話,仍是不要用它爲好,直接用本地配置文件豈不更快。app

  它提供了一個刷新機制,可是須要咱們主動觸發。那就是 @RefreshScope 註解並結合 Actuator,注意要引入 spring-boot-starter-actuatoride

  

添加依賴

  

  Config Client 添加 spring-boot-starter-actuator 依賴。spring-boot

<!-- 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 如何實現配置中心加解密,配置中心用戶安全認證,記得關注噢~

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

你們能夠經過 分類 查看更多關於 Spring Cloud 的文章。

  

🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

相關文章
相關標籤/搜索