springcloud系列—Config—第6章-1: Spring Cloud Config 配置中心
資料參考:《Spring Cloud 微服務實戰》
目錄
分散式配置中心
spring cloud config
是spring cloud
團隊建立的一個全新專案,用來為分散式系統中的基礎設施和微服務應用提供集中化的外部配置支援,它分為服務端和客戶端兩部分,其中服務端也稱為分散式配置中心,它是一個獨立的微服務應用,用來連線配置倉庫併為客戶端提供獲取配置資訊,加密/解密資訊等訪問介面,而客戶端則是微服務架構中的各個微服務應用或基礎設施,它們通過指定的配置中心管理應用資源與業務相關的配置內容,並在啟動的時候從配置中心獲取和載入配置資訊。spring cloud config
spring cloud config
實現的配置中心預設採用git來儲存配置資訊,所以使用spring cloud config
構建的配置伺服器,天然就支援對微服務應用配置資訊的版本管理,並且可以通過git
客戶端工具來方便地管理和訪問配置內容。當然它也提供了對其他儲存方式的支援,比如說svn倉庫,本地化檔案系統。
快速入門
構建一個基於git儲存的分散式配置中心,並在客戶端中演示如何通過配置指定微服務應用的所屬配置中心,並讓其能夠從配置中心獲取配置資訊並繫結到程式碼的整個過程。
構建配置中心
- 建立一個名
為config-server-git
的springboot服務,第一步,加入依賴:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <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> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 第二步,建立
springboot
程式主類,加上註解@EnableConfigServer
,開啟spring cloud config
的服務端功能。
@SpringBootApplication
@EnableConfigServer
public class GitApplication {
public static void main(String[] args) {
SpringApplication.run(GitApplication.class, args);
}
}
- 第三步,在
application.yml
中新增配置服務的基本資訊以及git倉庫的相關資訊
spring.application.name=config-server-git
server.port=7001
spring.cloud.config.server.git.uri=https://github.com/servef-toto/SpringCloud-Demo/
spring.cloud.config.server.git.search-paths=config-server-file/git-config
spring.cloud.config.server.git.username=xxxxxx
spring.cloud.config.server.git.password=xxxxx
其中git的配置分別表示如下內容
spring.cloud.config.server.git.uri
: 配置的git倉庫位置spring.cloud.config.server.git.search-paths
: 配置倉庫路徑下的相對搜尋位置,可以配置多個spring.cloud.config.server.git.username
: 訪問git的使用者名稱spring.cloud.config.server.git.password
: 訪問git倉庫的使用者密碼
到這裡,一個基本得基於git得配置中心就好了。
配置規則詳解
在git配置資訊中指定的倉庫位置,https://github.com/servef-toto/SpringCloud-Demo/config-server-file/git-config
目錄下建立五個不同的配置檔案:
zhihao.yml
zhihao-dev.yml
zhihao-test.yml
zhihao-pro.yml
application.yml
內容分別是:
zhihao.yml
from: git-default-1.0
spring:
datasource:
username: user_default
zhihao-dev.yml
from: git-dev-1.0
spring:
datasource:
username: user_dev
zhihao-test.yml
from: git-test-1.0
spring:
datasource:
username: user_test
zhihao-pro.yml
from: git-pro-1.0
spring:
datasource:
username: user_pro
application.yml
from: git-pro-1.0
spring:
datasource.
username:
zhihao.miao1
為了測試版本控制,在git
倉庫的master
分支中,我們為from
屬性加入1.0
的字尾,同時建立一個config-label-test
分支,並將各配置檔案中的值用2.0
做為字尾.
完成上面的工作我們就可以通過url來訪問這些配置內容了。
* /{application}/{profile}/[{label}]
* /{application}-{profile}.yml
* /{label}/{application}-{profile}.yml
* /{application}-{profile}.properties
* /{label}/{application}-{profile}.properties
上面的url會對映{application}-{profile}.yml
對應的配置檔案,其中{label}
對應git上不同的分支,預設是master
。我們可以嘗試構造不同的url來訪問不同的配置內容,比如,要訪問config-label-test
分支,zhihao
應用的prod環境,就可以訪問這個url:http://localhost:9090/zhihao/pro/config-label-test
同時,我們可以看到config-server-git
的控制檯中還輸出了下面的內容,配置伺服器在從git中獲取了配置資訊後,會儲存一份在config-server-git
的檔案系統中,實質上config-server-git
是通過git clone
命令將配置內容複製了一份在本地儲存,然後讀取這些內容並返回給微服務應用進行載入。
2017-08-15 22:10:07.568 INFO 28701 --- [io-9090-exec-10] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]5ac2c286: startup date [Tue Aug 15 22:10:07 CST 2017]; root of context hierarchy
2017-08-15 22:10:07.579 INFO 28701 --- [io-9090-exec-10] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application-pro.yml
2017-08-15 22:10:07.579 INFO 28701 --- [io-9090-exec-10] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application.yml
2017-08-15 22:10:07.579 INFO 28701 --- [io-9090-exec-10] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.[email protected]: startup date [Tue Aug 15 22:10:07 CST 2017]; root of context hierarchy
config-server-git
通過從git在本地的倉庫暫存,可以有效的防止當git倉庫出現故障而引起無法載入配置資訊的情況。我們可以通過斷開網路(斷開wifi),再次發起從http://localhost:9090/zhihaomiao/pro/config-label-test
請求,在控制檯中可以輸出如下內容,這些內容源於之前訪問時存在於config-server-git服務本地檔案系統中的配置資訊。
2017-08-15 22:23:15.002 WARN 28701 --- [nio-9090-exec-5] .c.s.e.MultipleJGitEnvironmentRepository : Could not fetch remote for config-label-test remote: http://git.oschina.net/zhihaomiao/config-repo-demo
2017-08-15 22:23:15.074 INFO 28701 --- [nio-9090-exec-5] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]7060493e: startup date [Tue Aug 15 22:23:15 CST 2017]; root of context hierarchy
2017-08-15 22:23:15.088 INFO 28701 --- [nio-9090-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application-pro.yml
2017-08-15 22:23:15.089 INFO 28701 --- [nio-9090-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo/application.yml
2017-08-15 22:23:15.089 INFO 28701 --- [nio-9090-exec-5] s.c.a.AnnotationConfigApplicationContext : Closing org.spring[email protected]7060493e: startup date [Tue Aug 15 22:23:15 CST 2017]; root of context hierarchy
客戶端配置對映
在完成上面得配置之後,確定配置中心已經啟動。如何在微服務應用中獲取上面的配置資訊?
- 建立一個Springboot應用
config-client
,並在pom檔案中引入依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 建立springboot應用主類
- 建立bootstrap.properties配置,來指定獲取配置檔案得配置中心得位置,和配置檔案得資訊。
#對應配置檔案規則中得{application}部分
spring.application.name=zhihao
#對應配置檔案規則中得{profile}部分
spring.cloud.config.profile=dev
#對應配置檔案規則中得{label}部分
spring.cloud.config.label=master
#對應配置中心得地址
spring.cloud.config.uri=http://localhost:7001/
server.port=7002
上述配置引數與git中儲存的配置檔案中各個部分的對應關係如下:
spring.application.name
: 對應配置檔案規則中的{application}
部分spring.cloud.config.profile
:對應配置檔案規則中{profile}
部分spring.cloud.config.label
:對應配置檔案規則中的{label}
部分spring.cloud.config.uri
:配置中心config-server
的地址。
這裡需要格外注意,上面的屬性必須配置在bootstrap.yml
中,這樣config-server
中的配置資訊才能被正確載入。springboot對配置檔案的載入順序,對於本應用jar包之外的配置檔案載入會優於應用jar包內的配置內容,而通過bootstrap.yml
對config-server-git
的配置,使得該應用會從config-server-git
中獲取一些外部配置資訊,這些資訊的優先順序比本地的內容要高,從而實現了外部化配置。
- 建立一個介面來獲取配置中心得from屬性,通過@Value("${from}") 獲取Environment物件,來獲取屬性得只
@RefreshScope
@RestController
public class TestController {
@Value("${from}")
private String from;
@Autowired
private Environment environment;
@RequestMapping("/from")
public String from() {
return this.from;
}
@RequestMapping("/envs")
public String envs() {
return this.environment.getProperty("from","undefined");
}
}
測試訪問http://localhost:7002/from 和 http://localhost:7002/envs
git地址:https://github.com/servef-toto/SpringCloud-Demo/tree/master/config-server-file/git-config