在Spring Boot服務中,我們可以通過設置多個profile來配置不同的application-{profile}.yml
,然後在啓動服務時指定要加載的配置文件spring.profiles.active={profile}
。
但是在Spring Cloud微服務架構中,這種配置方式不再適用。Spring Cloud對於配置有着更高、更靈活的要求,需要做到統一管理,實時更新,這時我們使用分佈式配置中心組件來管理配置,也就是Spring Cloud Config。
0. 開發環境
-
IDE:IntelliJ IDEA 2017.1 x64
-
JDK:1.8.0_91
-
Spring Boot:2.0.9.RELEASE
-
Spring Cloud:Finchley.RELEASE
1. Spring Cloud Config簡介
Spring Cloud Config是一個解決分佈式系統的配置管理方案,爲分佈式系統外部化配置提供了支持,包含Config Server和Config Client兩部分,Server提供配置文件存儲,對外提供接口以獲取配置文件的內容,Client通過接口獲取數據,並初始化自己。
2. 創建Config Server
2.1 新建Git倉庫
新建Git倉庫,用於存放配置文件。
這裏我們直接在SpringCloudDemo倉庫中新建spring-cloud-config-repo文件夾,然後新建三個配置文件
spring-cloud-config-client-pro.yml
version: 1.0
profile: pro
spring-cloud-config-client-dev.yml
version: 1.0
profile: dev
spring-cloud-config-client-test.yml
version: 1.0
profile: test
2.2 新建Config Server
新建Config Server服務spring-cloud-config-server
2.3 引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.4 新建啓動類
@EnableConfigServer 註解表示開啓配置服務器
package cn.wbnull.springcloudconfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}
2.5 新建application.yml
server:
port: 8092
servlet:
context-path: /springcloudconfig
spring:
application:
name: spring-cloud-config-server
cloud:
config:
server:
git:
uri: https://github.com/dkbnull/SpringCloudDemo
search-paths: spring-cloud-config-repo
username: ""
password: ""
label: master
- spring.cloud.config.server.git.uri 配置Git倉庫的地址
- spring.cloud.config.server.git.searchPaths 配置文件的路徑
- spring.cloud.config.label 配置倉庫的分支
- spring.cloud.config.server.git.username 訪問Git倉庫的用戶名,公開倉庫可不填寫
- spring.cloud.config.server.git.password 訪問Git倉庫的密碼,公開倉庫可不填寫
2.6 測試
啓動spring-cloud-config-server服務,瀏覽器訪問 http://127.0.0.1:8092/springcloudconfig/spring-cloud-config-client/pro ,返回如下
{
"name": "spring-cloud-config-client",
"profiles": [
"pro"
],
"label": null,
"version": "8bddb99fecf031d284f1d7503b70c212f665e86f",
"state": null,
"propertySources": [
{
"name": "https://github.com/dkbnull/SpringCloudDemo/spring-cloud-config-repo/spring-cloud-config-client-pro.yml",
"source": {
"version": 1.0,
"profile": "pro"
}
}
]
}
瀏覽器訪問 http://127.0.0.1:8092/springcloudconfig/spring-cloud-config-client/dev ,返回如下
{
"name": "spring-cloud-config-client",
"profiles": [
"dev"
],
"label": null,
"version": "2fa4983d777889ef29e453a7b4818645269124b1",
"state": null,
"propertySources": [
{
"name": "https://github.com/dkbnull/SpringCloudDemo/spring-cloud-config-repo/spring-cloud-config-client-dev.yml",
"source": {
"version": 1.0,
"profile": "dev"
}
}
]
}
從Git倉庫獲取配置成功。
2.7 配置文件映射關係
Http請求地址與配置文件映射關係如下:
映射{application}-{profile}.yml或{application}-{profile}.properties配置文件
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.yml
/{label}/{application}-{profile}.properties
- {application}通常使用微服務的名稱,對應於Git倉庫中配置文件文件名的前綴
- {profile}對應於{application}-{profile}的{profile}
- {label}對應於Git倉庫的分支名,默認爲master
3. 創建Config Client
3.1 新建Config Client
新建Config Client服務spring-cloud-config-client
3.2 引入依賴
<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>
3.3 新建啓動類
package cn.wbnull.springcloudconfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringCloudConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigClientApplication.class, args);
}
}
3.4 新建application.yml
server:
port: 8093
servlet:
context-path: /springcloudconfig
3.5 新建bootstrap.yml
Spring Boot服務啓動時會加載application.yml/application.properties配置文件,Spring Cloud中有”引導上下文“的概念,引導上下文會加載bootstrap.yml/bootstrap.properties配置文件,即bootstrap.yml/bootstrap.properties會在Spring Boot服務啓動之前加載,具有更高的優先級。默認情況下bootstrap.yml/bootstrap.properties中的屬性不能被覆蓋。
spring:
application:
name: spring-cloud-config-client
cloud:
config:
uri: http://127.0.0.1:8092/springcloudconfig
profile: pro
label: master
-
spring.application.name 配置Config Server獲取的配置文件的{application}
-
spring.cloud.config.uri 配置Config Server的地址
-
spring.cloud.config.profile 配置Config Server獲取的配置文件的{profile}
-
spring.cloud.config.label 配置Config Server獲取的配置文件的{label}
3.6 新建控制器類
package cn.wbnull.springcloudconfig.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Scope("prototype")
public class GatewayController {
@Value("${version}")
private String version;
@Value("${profile}")
private String profile;
@GetMapping(value = "/gateway")
public String gateway() throws Exception {
return "version:" + version + ",profile:" + profile;
}
}
3.7 測試
依次啓動spring-cloud-config-server、spring-cloud-config-client,瀏覽器訪問 http://127.0.0.1:8093/springcloudconfig/gateway ,返回如下
version:1.0,profile:pro
spring-cloud-config-client成功通過spring-cloud-config-server從Git倉庫中獲取到了指定配置文件的配置信息。
GitHub:https://github.com/dkbnull/SpringCloudDemo
微信:https://mp.weixin.qq.com/s/jcFZUliJ5Fq5MSQWQNombw