Spring cloud Config客戶端和服務端快速入門環境搭建
一.構建配置中心
通過Spring Cloud Config構建一個配置中心非常簡單,可以分為三步:
- 建立一個基礎的spring boot專案, 命名為config-server,並在pom.xml檔案中引入如下配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.config</groupId> <artifactId>server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.M1</spring-cloud.version> </properties> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
- 建立spring boot的程式主類,並新增你@EnableConfigServer註解,開啟Spring Cloud Config的服務端功能:
package com.config.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }
- 在application.properties中新增配置服務的基本資訊以及Git倉庫的相關資訊,我是使用GitHub做的測試:
spring.applica七ion.name=config-server
server.port=7001
[email protected]:xxxx/config-center.git
spring.cloud.config.server.git.searchPaths=spring-cloud-config
[email protected]
spring.cloud.config.server.git.password=6xxxx8
其中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.g江.password:訪問Git倉庫的使用者密碼。 到這一步我們通過Spring Cloud Config實現,並使用Git管理配置內容的分散式配置中心就完成了;然後我們啟動伺服器看有沒有報錯,沒有說明以上的配置就是OK的,執行結果如下:
二、配置規則詳解
為了驗證上面完成的分散式配置中心config-server,根據Git配置資訊中指定的倉庫位置,在[email protected]:xxxx/config-center.git下建立一個spring-cloud-config目錄作為配置倉庫,並根據不同的環境新建4個配置檔案:
-
server.properties
-
server-dev.properties
-
server-test.properties
-
server-prod.properties 在上面的4個檔案中均設定了一個from屬性,並未每個配置檔案分別設定了不同的值,如下所示:
-
from=git-default-1.0
-
from=git-test-1.0
-
from=git-dev-1.0
-
from=git-prod-1.0
將上面的4個配置檔案提交到GitHub上: 為了測試版本控制,在該Git倉庫的master分支中,我們為from屬性加入1.0的字尾,同時建立了一個dev分支,並將配置檔案中的值用2.0做字尾。
完成了上面這些工作之後我們可以在瀏覽器中訪問我們的配置了,訪問配置資訊的URL與配置檔案的對映關係如下所示:
- /{application}/{profile}[/{label}]
- {/application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties 上面的url會對映到{application}-{profile}.properties對應的配置檔案,其中{label}對應Git上不同的分支,預設是master分支;如下我們通過http://localhost:7001/server/test/master訪問的結果:
{
"name": "server",
"profiles": [
"test"
],
"label": "master",
"version": "2f64482a317ebe84e0ab47196d05c80623438b8c",
"state": null,
"propertySources": [
{
"name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server-test.properties",
"source": {
"from": "git-test-1.0"
}
},
{
"name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server.properties",
"source": {
"from": "git-default-1.0"
}
}
]
}
我們將{label}更換為dev分支訪問結果是:
{
"name": "server",
"profiles": [
"test"
],
"label": "dev",
"version": "18e4edba793210ff965050ce447061b4e3e5977a",
"state": null,
"propertySources": [
{
"name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server-test.properties",
"source": {
"from": "git-test-2.0"
}
},
{
"name": "[email protected]:yaomy2072608191/config-center.git/spring-cloud-config/server.properties",
"source": {
"from": "git-default-2.0"
}
}
]
}
我們可以看到JSON中返回了應用名server,環境名test,分支名dev/master;以及default和dev環境的配置內容。另外還有一個version版本號,它對應的是在Git上的commit號。
同時,我們可以看到config-server的控制檯中還輸出了下面的內容,配置伺服器從Git中獲取配置資訊後,會儲存一份在config-server的檔案系統中,實質上config-server是通過git clone命令將配置內容複製了一份在本地儲存,然後讀取這些內容並返回給微服務應用進行載入。
2018-11-03 11:38:53.043 INFO 3695 --- [nio-7001-exec-8] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/zx/tkgn67q979j6wxk0lqd9t2fm0000gn/T/config-repo-4776505257090435200/spring-cloud-config/server-test.properties
2018-11-03 11:38:53.043 INFO 3695 --- [nio-7001-exec-8] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/var/folders/zx/tkgn67q979j6wxk0lqd9t2fm0000gn/T/config-repo-4776505257090435200/spring-cloud-config/server.properties
config-server通過Git在本地倉庫暫存,可以有效防止當Git倉庫出現故障而引起無法載入配置資訊的情況。
三、客戶端應用程式配置對映
上面我們完成了配置中心得配置,並且可以正常的執行,下面我們嘗試如何在微服務應用中獲取上述配置資訊。
- 建立一個spring boot應用,命名為config-client,並在pom.xml中引入下述依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.config</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>client</name>
<description>Spring config client</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M1</spring-cloud.version>
</properties>
<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>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
- 建立一個spring boot主類,如下:
package com.config.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
- 建立bootstrap.properties配置,來指定獲取配置檔案的config-server位置,如下配置:
spring.application.name=server
spring.cloud.config.profile=prod
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
server.port=7002
上述配置引數與Git中儲存的配置檔案中的各個部分的對應關係如下:
- spring.cloud.config.profile:對應配置檔案規則中的{profile}部分。
- spring.cloud.config.label:對應配置檔案中的{label}部分。
- spring.cloud.config.uri:對應config-server配置中心的地址。 這裡需特別注意上面在和諧屬性必須配置在bootstrap.properties中,這樣config-server中的配置資訊才能被正確載入。
這裡說明一下spring boot對配置檔案的載入順序,對於本應用jar包之外的配置檔案載入會優先於應用jar包內的配置內容,而通過bootstrap.properties對於config-server的配置,使得該應用會從config-server中獲取一些外部配置資訊,這些資訊的優先順序比本地的內容要高,從而實現了外部化配置。
建立一個RestFul介面,獲取配置中心得配置資訊:
package com.config.client;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class TestController {
@Value("${from}")
private String from;
@RequestMapping("/from")
public String from(){
System.out.println("-----///////");
return this.from;
}
}
啟動config-client,通過http://localhost:7002/from來訪問可以獲取不同環境的內容。