1. 程式人生 > >SpringCloud配置中心Config

SpringCloud配置中心Config

1.Spring Cloud Config 介紹

提供了一種在分散式系統中外部化配置伺服器和客戶端的支
持。配置伺服器有一箇中心位置,管理所有環境下的應用的外部屬性。客戶端和服
務器對映到相同Spring Eventment 和 PropertySrouce抽象的概念,所以非常適合
Spring應用,但也可以在任何語言開發的任何應用中使用。在一個應用從開發、測
試到生產的過程中,你可以分別地管理開發、測試、生產環境的配置,並且在遷移
的時候獲取相應的配置來執行。
Config Server 儲存後端預設使用git儲存配置資訊,因此可以很容易支援標記配置
環境的版本,同時可以使用一個使用廣泛的工具管理配置內容。當然新增其他方式
的儲存實現也是很容易的。

參考:
http://cloud.spring.io/spring-cloud-static/Brixton.SR5/#_spring_cloud_config
核心程式碼:
org.springframework.cloud.config.server.environment.NativeEnvir
onmentRepository ,留意其中的 findOne 方法。

準備工作
為了更貼近生產,我們首先配置Host
127.0.0.1 config-server

microservice-config-client-dev.properties
microservice-config-client.properties

其中在: microservice-config-client-dev.properties 檔案中新增如下內容:

profile=dev

伺服器端程式碼示例

建立一個Maven專案,在pom.xml檔案中新增如下內容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="ht tp://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m aven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <artifactId>microservice-config-server</artifactId> <packaging>jar</packaging> <parent> <groupId>com.itmuch.cloud</groupId> <artifactId>spring-cloud-microservice-study</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> </project>
  • 啟動類:
/**
* 通過@EnableConfigServer註解啟用配置服務.
* 說明:
* 在application.yml中有個git.uri的配置,目前配置的是https://github.c
om/eacdy/spring-cloud-study/
* 獲取git上的資源資訊遵循如下規則:
* /{application}/{profile}[/{label}]
* /{application}-{profile}.yml
* /{label}/{application}-{profile}.yml
* /{application}-{profile}.properties
* /{label}/{application}-{profile}.properties
*
* 例如本例:可使用以下路徑來訪問microservice-config-client-dev.prope
rties:
* http://localhost:8040/microservice-config-client-dev.properti
es
* http://localhost:8040/microservice-config-client/dev
* ...
* @author eacdy
*/
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConfigServerApplication.class, args);
	}
}
  • 配置檔案:application.yml
server:
	port: 8040
spring:
	application:
		name: microservice-config-server
cloud:
	config:
		server:
		 git:
			uri: https://github.com/eacdy/spring-cloud-study/
			# 配置git倉庫的地址
			search-paths: config-repo
			# git倉庫地址下的相對地址,可以配置多個,用,分割。
			username:
			# git倉庫的賬號
			password:
			# git倉庫的密碼

這樣,一個Config Server就完成了。

在這裡插入圖片描述

例如本例:可使用以下路徑來訪問 microservice-config-clientdev.
properties :
http://localhost:8040/microservice-config-client-dev.properties
http://localhost:8040/microservice-config-client/dev
按照上文,我們成功搭建了Config Server,並測試能夠正常獲取到git倉庫中的配置
資訊。那麼對於一個微服務應用,如何才能獲取配置資訊呢?

配置服務客戶端示例

新建一個Maven專案,在pom.xml中新增如下內容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
tp://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m
aven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
	<artifactId>microservice-config-client</artifactId>
	<packaging>jar</packaging>
<parent>
	<groupId>com.itmuch.cloud</groupId>
	<artifactId>spring-cloud-microservice-study</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</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-actuator</artifactId>
	</dependency>
</dependencies>
</project>
  • 編寫啟動類:
@SpringBootApplication
public class ConfigClientApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConfigClientApplication.class, args);
	}
}
  • 編寫測試Controller
/**
* 這邊的@RefreshScope註解不能少,否則即使呼叫/refresh,配置也不會重新整理
* @author eacdy
*/
@RestController
@RefreshScope
public class ConfigClientController {
	@Value("${profile}")
	private String profile;
	@GetMapping("/hello")
	public String hello() {
		return this.profile;
	}
}
  • 配置檔案:application.yml
server:
	port: 8041

配置檔案bootstrap.yml(為什麼要使用bootstrap.yml而不直接放在
application.yml中的原因見注意點)

spring:
	application:
		name: microservice-config-client # 對應microservice-config-server所獲取的配置檔案的{application}
cloud:
	config:
		uri: http://config-server:8040/
		profile: dev # 指定profile,對應microservice-config-server所獲取的配置檔案中的{profile}
		label: master # 指定git倉庫的分支,對應microservice-config-server所獲取的配置檔案的{label}

啟動,並訪問:
http://localhost:8041/hello ,我們會發現此時可以顯示git倉庫中配置檔案的內容:

dev

配置內容的熱載入
如果不重啟應用,能夠做到配置的重新整理嗎?答案顯然是可以的。
我們將microservice-config-client-dev.properties中值改為

profile=abcd

並提交到git倉庫。
然後使用命令(本文使用的是curl,Linux和Windows都有curl工具,當然也可以借
助其他工具,例如Postman等):
curl -X POST http://localhost:8041/refresh

然後再次訪問http://localhost:8041/hello ,將會看到: abcd ,說明配置已經刷
新。