從零學SpringCloud系列(八):分佈式配置中心Spring Cloud Config

一、快速入門

1.1 項目版本

spring boot:2.2.5.RELEASE

spring cloud:Hoxton.SR3

1.2 項目地址

https://github.com/zhenghaoxiao/spring-cloud-in-action/tree/dev

在搭建配置中心的時候,我們需要注意的一個地方就是,在配置客戶端的時候,我們需要使用bootstrap.properties,這樣config-server中的配置信息才能被正確的加載。具體搭建過程可以參考下面文章:

https://blog.csdn.net/hao134838/article/details/105339907

二、配置詳解

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

上面的url會映射{application}-{profile}.properties對應的配置文件,{label}對應git上不同的分支,默認爲master。
 

所以在上面項目中,我們啓動config-server工程後,我們可以訪問:

http://localhost:7071/config-client/dev 地址得到下面內容

{
    "name":"config-client",
    "profiles":[
        "dev"
    ],
    "label":null,
    "version":"40af4c2ef1ad8ac9a394b8a244396fa303c3e665",
    "state":null,
    "propertySources":[
        {
            "name":"https://github.com/zhenghaoxiao/springcloudconfig/rpo/config-client-dev.properties",
            "source":{
                "from":"jack-cloud"
            }
        }
    ]
}

客戶端配置詳和git中存儲文件中各個部分的對應關係

spring.application.name:對應配置文件規則中的{application}部分
spring.cloud.config.label:對應配置文件規則中{profile}部分
spring.cloud.config.profile:對應配置文件規則中{label}部分
spring.cloud.config.uri=http:對應配置文件規則中config-server的地址

三、服務端詳解

3.1 基礎架構

   

3.2 執行流程

1、應用啓動時,根據bootstrap.properties中配置的應用名{application}、環境名{profile}、分支名{label},向Config Server請求獲取配置信息。

2、Config Server根據自己維護的Git倉庫信息和客戶端傳遞過來的配置定位信息去查找配置信息

3、通過 git clone命令將找到的配置信息下載到Config Server的文件系統中。

4、Config Server創建Spring 的ApplicationContext實例,並從Git本地倉庫中加載配置文件,最後將這些配置內容讀取出來返回給客戶端應用。

5、客戶端應用在獲得外部配置文件後加載到客戶端的ApplicationContext實例,該配置內容的優先級高於客戶端jar包內部的配置內容,所以在jar中重複內容將不再被加載。

Config Server巧妙的通過 git clone將配置信息存於本地,起到了緩存的作用,即使當git服務端無法訪問的時候,依然可以讀取C onfig Server中緩存內容進行使用。

3.3 倉庫 配置

對於倉庫配置config默認採用了git。git非常使用存儲配置內容,他可以非常方法的利用各種第三方工具對配置內容進行修改,並且它的Hook功能還可以幫助我們實時監控配置內容的修改。同時,它也支持SVN、本地文件系統等方式進行存儲配置內容。

下面我們主要介紹一下使用git作爲配置倉庫的內容

spring.cloud.config.server.git.uri=https://github.com/zhenghaoxiao/springcloudconfig
spring.cloud.config.server.git.searchPaths=rpo
spring.cloud.config.server.git.username=jack
spring.cloud.config.server.git.password=******

如果我們將uri的值通過file://前綴來設置爲一個文件地址,那麼它將以本地 倉庫的方式運行,這樣我們就可以脫離git服務端來快速進行調試與開發,比如:

spring.cloud.config.server.git.uri=file://${user.home}/config-repo

其中{user.home}代表當前用戶所屬目錄。

3.3.1 佔位符配置URI

{application}、{profile}、{label}這些 佔位符除了用於標識配置文件的規則之外,還可以用於Config Server中對git 倉庫地址的URI配置,比如,我們可以通過{application}佔位符來實現一個 應用對一個一個git倉庫目錄的配置效果,具體配置如下:

spring.cloud.config.server.git.uri=https://github.com/zhenghaoxiao/springcloudconfig/{application}
spring.cloud.config.server.git.searchPaths=rpo
spring.cloud.config.server.git.username=jack
spring.cloud.config.server.git.password=******

其中,{application}代表了應用名,所以當客戶端應用向Config Server發起獲取配置的要求時,Config Server會根據客戶端的spring.application.name信息來填充{application}佔位符以定位配置 資源的存儲位置,從而實現根據微服務應用的屬性動態獲取不同位置的配置。另外,在這些佔位符中,{label}參數較爲特別,如果git的分支和標籤名包含了“/”,那麼{label}參數在http的URL中應該使用“(_)”來代替,以避免改變了uri含義,指向到其他的URI資源。

3.3.2 子目錄存儲

除了支持佔位符配置外,config server還可以將配置文件定位到git倉庫的子目錄中,我們在快速入門項目中的的配置中有一個配置是

spring.cloud.config.server.git.searchPaths=rpo

對於這個參數的配置也支持使用{application}、{profile}、{label}佔位符

3.4 屬性覆蓋

config server還有一個“屬性覆蓋”的 特性,他可以讓開發人員爲所有的應用提供配置屬性,只需要通過spring.cloud.config.server.overrides.name屬性來設置鍵值對的參數,這些參數會以map的方式 加載到客戶端。

spring.cloud.config.server.overrides.name=didi

通過 該屬性配置的參數,不會被spring cloud的客戶端修改,並且spring cloud中獲取配置的信息時,都會取得這些配置信息。

3.5  服務化配置

服務化配置就是將config server作爲一個服務單元納入到服務中心管理之中,然後通過服務發現來訪問config server。這樣我們服務端和客戶端都需要依賴eureka,加入到eurka服務治理體系,在上面項目中應配置了,大家可以參考一下項目中的配置。

spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server

四、動態刷新配置

4.1 手動刷新配置

手動刷新是指,我們修改了git倉庫中的配置內容以後, 客戶端獲取到的內容並不是最新的, 需要我們手動調用一個接口來觸發 刷新。我們需要修改客戶端項目:

pom 依賴:

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

配置文件增加:

management.endpoints.web.exposure.include= health,info,refresh

在需要獲得配置文件的類上增加註解:@RefreshScope

@RestController
@RefreshScope
public class TestController {

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

    @GetMapping("/test")
    public String getFrom() {
        return from;
    }
}

這樣我們修改完遠程倉庫中的內容手動調用接口:http://localhost:7072/actuator/refresh 即可

4.2 利用git 的webhooks實現自動刷新

1、進入 github 倉庫配置頁面,選擇 Webhooks ,並點擊 add webhook;

2、之後填上回調的地址,也就是上面提到的 actuator/refresh 這個地址,但是必須保證這個地址是可以被 github 訪問到的。如果是內網就沒辦法了。這也僅僅是個演示,一般公司內的項目都會有自己的代碼管理工具,例如自建的 gitlab,gitlab 也有 webhook 的功能,這樣就可以調用到內網的地址了。

五、小結

對於一些簡單的項目來說,我們一般都是直接把相關配置放在單獨的配置文件中,以 properties 或者 yml 的格式出現,更省事兒的方式是直接放到 application.properties 或 application.yml 中。但是這樣的方式有個明顯的問題,那就是,當修改了配置之後,必須重啓服務,否則配置無法生效。

目前有一些用的比較多的開源的配置中心,比如攜程的 Apollo、螞蟻金服的 disconf 等,對比 Spring Cloud Config,這些配置中心功能更加強大。有興趣的可以拿來試一試。

在spring cloud 家族中 config也是 足夠好用了。。

後續。。。。。

續我們會利用消息總線 Spring Cloud Bus 來實現動態刷新。

 

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