SpringCloud之分散式配置中心Spring Cloud Config例項
一、簡介
Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設施和微服務應用提供集中化的外部配置支援,它分為服務端與客戶端兩個部分。其中服務端也稱為分散式配置中心,它是一個獨立的微服務應用,用來連線配置倉庫併為客戶端提供獲取配置資訊、加密/解密資訊等訪問介面;而客戶端則是微服務架構中的各個微服務應用或基礎設施,它們通過指定的配置中心來管理應用資源與業務相關的配置內容,並在啟動的時候從配置中心獲取和載入配置資訊。Spring Cloud Config實現了對服務端和客戶端中環境變數和屬性配置的抽象對映,所以它除了適用於Spring構建的應用程式之外,也可以在任何其他語言執行的應用程式中使用。由於Spring Cloud Config實現的配置中心預設採用Git來儲存配置資訊,所以使用Spring Cloud Config構建的配置伺服器,天然就支援對微服務應用配置資訊的版本管理,並且可以通過Git客戶端工具來方便地管理和訪問配置內容。
- 在spring cloud config元件中,分兩個角色,一是config server,二是config client。
二、構建配置中心config-server
(1)新建一個SpringBoot專案,命令無要求,需要新增config-server的依賴。
(2)pom.xml
(3)入口類<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
@EnableConfigServer
@SpringBootApplication
public class SpringcloudconfigserverApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudconfigserverApplication.class, args);
}
}
(4)application.yml
其中Git的配置資訊分別表示如下內容:server: port: 5588 spring: application: name: config-server cloud: config: server: git: uri: https://gitee.com/smartdt/springcloudconfig.git #配置Git倉庫位置。 searchPaths: config-repo #配置倉庫路徑下的相對搜尋位置,可以配置多個。 username: username #訪問 Git 倉庫的使用者名稱。 password: password #訪問 Git 倉庫的使用者密碼。 label: master #配置倉庫的分支 ###如果Git倉庫為公開倉庫,可以不填寫使用者名稱和密碼,如果是私有倉庫需要填寫。
- spring.cloud.config.server.git.uri: 配置Git倉庫位置。
- spring.cloud.config.server.git.searchPaths: 配置倉庫路徑下的相對搜尋位置,可以配置多個。
- spring.cloud.config.server.git.username:訪問Git倉庫的使用者名稱。
- spring.cloud.config.server.git.password:訪問Git倉庫的使用者密碼。
- 如果Git倉庫為公開倉庫,可以不填寫使用者名稱和密碼,如果是私有倉庫需要填寫。
(5)在Git配置資訊中指定的倉庫位置,在https://gitee.com/smartdt/springcloudconfig.git下建立config-repo目錄作為配置倉庫,並根據不同環境新建下面4個配置檔案:
- configspace-dev.properties:
from=git-dev-v1.0 by springcloud config-server
username=springcloud
password=********
- configspace-prod.properties:
from=git-prod-v1.0 by springcloud config-server
- configspace-test.properties:
from=git-test-v1.0 by springcloud config-server
- configspace.properties
from=git-default-v1.0 by springcloud config server.
(6)測試:
完成了這些準備工作之後,我們就可以通過瀏覽器、POSTMAN或CURL等工具直接來訪問我們的配置內容了。訪問配置資訊的URL與配置檔案的對映關係如下所示:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
- 訪問預設:http://localhost:5588/configspace/*
- 訪問http://localhost:5588/configspace/dev
- 訪問http://localhost:5588/configspace/test
- 訪問:http://localhost:5588/configspace/prod
三、客戶端配置對映config-client
(1)新建一個SpringBoot專案,命令無要求,需要新增config的依賴。
(2)pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(2)新建bootstrap.properties
spring.application.name=configspace
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:5588/
server.port=5589
- spring.application.name:對應配置檔案規則中的{application} 部分。在這裡也就是configspace;
- spring.cloud.config.profile:對應配置檔案規則中的 {profile} 部分。在這裡也就是dev;
- spring.cloud.config.label:對應配置檔案規則中的 {label} 部分。在這裡就是master;
- spring.cloud.config.uri:配置中心conigg-server的地址。在這裡就是http://localhost:5588/
@RefreshScope
@RestController
public class ConfigController {
@Value("${from}")
private String from;
@Value("${username}")
private String username;
@Value("${password}")
private String password;
@RequestMapping("/from")
public String from() {
return this.from + "~user:" + this.username + "~pass:" + this.password;
}
}
(4)測試
這裡配置的http://localhost:5588/,master分支,dev的資訊:
git-dev-1.0v and by smartdt~user:springcloudconfig~pass:********
通過訪問http://localhost:5589/from,得到了http://localhost:5588/configspace/dev分支下from、username、password的資訊。
四、服務端詳解
在動手實踐了上面關於SpringCloud Config的基礎入門內容之後,在這裡我們深入理解一下它是如何運作起來的。
主要包含下面幾個要素:
- 遠端Git倉庫:用來儲存配置檔案的地方,上例中我們用來儲存針對應用名為configspace的多環境配置檔案:configspace-{profile}.properties。
- Config Server: 這是我們上面構建的分散式配置中心,config-server工程,在該工程中指定了所要連線的Git倉庫位置以及賬戶、密碼等連線資訊。
- 本地Git倉庫:在Config Server的檔案系統中,每次客戶端請求獲取配置資訊時,Config Server從Git倉庫中獲取最新配置到本地,然後在本地Git倉庫中讀取並返回。當遠端倉庫無法獲取時,直接將本地內容返回。
- Service A、Service B: 具體的微服務應用,它們指定了ConfigServer的地址,從而實現從外部化獲取應用自己要用的配置資訊。這些應用在啟動的時候,會向Config Server請求獲取配置資訊來進行載入。
客戶端應用從配置管理中獲取配置資訊遵從下面的執行流程:
- 應用啟動時,根據bootstrap.properties中配置的應用名{application}、環境名{profile}、分支名{label}, 向ConfigServer請求獲取配置資訊。
- Config Server根據自己維護的Git倉庫資訊和客戶端傳遞過來的配置定位資訊去查詢配置資訊。
- 通過git clone命令將找到的配置資訊下載到Config Server的檔案系統中。
- Config Server建立Spring的ApplicalionContext例項,並從Git本地倉庫中載入配置檔案,最後將這些配置內容讀取出來返回給客戶端應用。
- 客戶端應用在獲得外部配置檔案後加載到客戶端的ApplicationContext例項,該配置內容的優先順序高於客戶端Jar包內部的配置內容, 所以在Jar包中重複的內容將不再被載入。
參考資料《Spring Cloud微服務實戰》