SpringCloud Config 為服務端和用戶端提供了分布式系統的外部化配置支援。配置伺服器為各應用的所有環境提供了一個中心化的外部配置。它實作了對服務端和用戶端對Spring Environment 和PropertySource抽象的映射,是以它除了适用于Spring建構的應用程式,也可以在任何其他語言運作的應用程式中使用。作為一個應用可以通過部署管道來進行測試或者投入生産,我們可以分别為這些環境建立配置,并且在需要遷移環境的時候擷取對應環境的配置來運作。
配置伺服器預設采用git來存儲配置資訊,這樣就有助于對環境進行版本管理,并且可以通過git用戶端工具老友善的管理和通路配置内容。當然它也提供本地化檔案系統的存儲方式,下面從這兩方面記錄如何使用分布式配置來存儲為服務應用多環境的配置内容。
入正題,配置中心肯定是分用戶端和服務端的,我們先說服務端
建立一個新的SpringBoot 工程config_server 需要兩個依賴
web
config server
pom檔案
<?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.chunying</groupId>
<artifactId>serv</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>configserv</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.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>Camden.SR6</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-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>
</project>
首先要表明這是一個config server
主類加注解@EnableConfigServer
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ServApplication {
public static void main(String[] args) {
SpringApplication.run(ServApplication.class, args);
}
}
application.properties
server.port=8767
spring.application.name=config_server
#git 管理配置
spring.cloud.config.server.git.uri=http://[email protected]/bitbucket/scm/~chunying.wang/cloudconfig.git
spring.cloud.config.server.git.search-paths=
spring.cloud.config.server.git.username=your username
spring.cloud.config.server.git.password=your password
spring.cloud.config.label=master
端口8767,服務名稱config_server
重點來了 有關git倉庫的配置 我用的git倉庫是個人的bitbucket,這裡的git 路徑什麼的根據不同的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密碼
spring.cloud.config.lable=通路的分支
到這裡,通過git 使用SpringCloud Config就實作了配置中心的管理
(ps:這裡補充一下本地存儲配置的方式,我們隻需要設定屬性spring.profiles.active=native , Config server 會預設從應用的src/main/resource 目錄下檢索配置檔案,也可以通過spring.cloud.config.server.native.searchLocation=file:F:/prc屬性來制定配置檔案的位置。但是我還是推薦使用git 倉庫的方式,是以這種我并沒有測試)
為了驗證上面的配置,我們需要在倉庫加一個配置檔案進行測試
配置檔案名稱demo-dev.properties (ps:不要在意這麼爛的名字,亂起的)
設定屬性test = test version 1 ,送出到git倉庫
這裡說一下properties檔案的命名規則。
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
這是url與配置檔案的映射關系。
我們上面的配置檔案會映射
{application}-{profile}.properties
啟動項目 當然 這裡可能遇到各種錯誤 什麼倉庫找不到什麼的雲雲 自己多試一下吧 我就是。肯定會試出正确的
通路 http://localhost:8767/demo-dev/test
傳回結果
其實好像應該傳回的是json 我也不清楚為什麼傳回的是xml,還在研究。。但是結果是對的 有之前設定的值
服務端就這樣成功了 下面說微服務端如何擷取擷取配置
建立一個SpringBoot 工程 config_client 需要兩個依賴
web
config client
建立bootstrap.proprties 這裡要注意 必須是bootstrap.properties,config 部分的内容才能呗正确加載。因為config的相關配置會先于application.properties,而bootstrap.properties的加載也是先于application.properties的
spring.application.name=demo
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:8767/
server.port=8768
端口8768
spring.application.name= 服務名字 ,這裡要注意這個名字,要和我們配置中心的properties檔案的{application}名字一緻,否則就找不到了
spring.cloud.config.profile=這裡提到過 根據上面的映射關系找到這個值
spring.cloud.config.lable=通路分支
spring.cloud.config.uri= 配置中心的位址
我們寫一個測試類 測試我們讀取到的内容
package com.chunying.configclient.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author chunying
*/
@RestController
public class DemoController {
@Value("${test}")
private String test;
@RequestMapping(value = "/test")
public String getHehe() {
return this.test;
}
}
啟動工程 當然這裡也會出現很多未知名的錯誤 多試試 就好了
通路 http://localhost:8768/test
傳回 test version 1
說明取到了我們配置檔案中的配置