Spring Cloud 配置服務
1. 配置服務簡介
- 產生背景:
傳統開發中,我們通常是將系統的業務無關配置(數據庫,緩存服務器)在properties中配置,在這個文件中不會經常改變,但隨着系統規模的擴大,項目成員越來越多,會有越來越多的伙伴更改配置文件,開發、測試、生產環境分離,因配置產生的問題越來越多。完全可以避免因配置文件的導致的問題產生,配置服務應運而生。 - 什么是配置服務?
將配置統進行集中管理,提供一配置服務,開發、測試、生產環境均可直接從配置服務器中讀取配置信息。大致就是,應用在啟動后從配置服務器中獲取配置信息,加入到環境中。這樣所有的配置服務都可以進行集中管理。 - 頂層架構設計如圖所示。
2. SpringBoot搭建配置服務:
- pom.xml添加依賴:
<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>Camden.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- application.yml或者bootstrap.yml添加scm相關配置
spring:
profiles:
active: git
cloud:
config:
enabled: true
server:
git:
uri: http://ip:port/test/remoteConfig.git
username: username
password: password
3. 應用系統使用配置服務
- pom.xml中添加配置:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- application.yml或者bootstrap.yml添加配置服務器:
spring:
cloud:
config:
name: db
profile: dev
label: master
uri: http://ip:port
enabled: true
profiles:
active: db
4. 服務器端實現:
服務器端實現比較簡單,大致流程是:當服務器接收到配置服務請求的時候,會首先從git倉庫中pull最新的配置信息到本地倉庫,然后服務器從本地倉庫中讀取所需要的配置信息返回給客戶端。
5. 客戶端實現:
- spring-cloud-config-client.jar中的Spring.factories有如下一段配置
# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.config.client.ConfigServiceBootstrapConfiguration,\
org.springframework.cloud.config.client.DiscoveryClientConfigServiceBootstrapConfiguration
很明顯關鍵入口為ConfigServiceBootstrapConfiguration,關鍵配置為
@Bean
@ConditionalOnProperty(value = "spring.cloud.config.enabled", matchIfMissing = true)
public ConfigServicePropertySourceLocator configServicePropertySource(ConfigClientProperties properties) {
ConfigServicePropertySourceLocator locator = new ConfigServicePropertySourceLocator(
properties);
return locator;
}
向spring容器中注入了ConfigServicePropertySourceLocator,容器在初始化的時候會調用locate方法,其流程如圖所示。
關鍵方法為RestTemplate的exchange方法。其主要功能為的調用遠程服務器的接口獲取相關配置。