參考資料:
http://cloud.spring.io/spring-cloud-static/Camden.SR7/#_spring_cloud_config
Spring Cloud Config為分散式系統中的外部配置提供服務端和客戶端的支援。使用Config Server,你可以在所有環境中管理應用程式的外部屬性。
客戶端和服務端上的概念和與Spring Environment和PropertySource相同,因此非常適合Spring應用程式,也可以與任何語言執行的應用程式一起使用。
當應用程式從開發到測試轉移到部署管道時,你可以管理這些環境之間的配置,以確保應用程式擁有遷移時所需的所有內容。伺服器儲存後端的預設實現使用git,因此它可以輕鬆支援配置環境的標記版本,並且可以通過各種工具來訪問內容。
特點:
Spring Cloud Config Server features:
對於外部配置項(如name-value對或相同功能的YAML內容),提供了基於資源的HTTP介面;
加密和解密屬性值(對稱或不對稱);
使用@EnableConfigServer註解可以很容易將此伺服器嵌入到Spring Boot應用程式中。
Config Client features(for Spring applications):
繫結到配置伺服器,並使用遠端屬性資源來初始化Spring環境;
加密和解密屬性值(對稱和非對稱)。
快速入門:
啟動服務:
$ cd spring-cloud-config-server
$ ../mvnw spring-boot:run
伺服器是一個Spring Boot應用程式,你可以從你的IDE執行它(main類是ConfigServerApplication
).然後試著啟動一個客戶端:
$ curl localhost:8888/foo/development {"name":"foo","label":"master","propertySources":[ {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}}, {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}} ]}
查詢一個屬性資源的預設策略是克隆一個git倉庫(at spring.cloud.config.server.git.uri
) ,使用它去初始化一個 mini SpringApplication
. 這個mini-application的Environment
用來列舉屬性資源,並通過JSON節點發布它們。
HTTP服務具有以下形式的資源:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
“applications”是SpringApplication
的spring.config.name
(一般來說application是一個常規的Spring Boot應用),"profile"是一個active的profile(或者是逗號分隔的屬性列表),label是一個可選的git標籤(預設為"master").
Spring Cloud Config Server從git倉庫(必須提供)為遠端客戶端提取配置:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
要在應用程式中使用這些功能,只需將其構建為一個依賴於 spring-cloud-config-client的Spring Boot應用程式。新增依賴最方便的方法是通過Spring Boot啟動器org.springframework.cloud:spring-cloud-starter-config
. 對於Maven使用者還有一個父pom和BOM(spring-cloud-starter-parent
),對於Gradle和Spring CLI使用者有一個Spring IO版本管理檔案。例如Maven的配置:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- repositories also needed for snapshots and milestones -->
然後建立一個標準的Spring Boot應用程式,就像這個簡單的HTTP伺服器:
@SpringBootApplication @RestController public class Application { @RequestMapping("/") public String home() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
執行時,它將從埠8888上的預設本地配置伺服器(如果它正在執行)中選取外部配置。要修改啟動行為,可以使用bootstrap.properties(類似於application.properties,但是是一個應用上下文啟動的配置檔案)更改配置伺服器的位置,例如:
spring.cloud.config.uri: http://myconfigserver.com
引用屬性將作為高優先順序屬性源顯示在 /env 端點中,例如:
$ curl localhost:8080/env { "profiles":[], "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"}, "servletContextInitParams":{}, "systemProperties":{...}, ... }
(名為“ConfigService:<遠端儲存庫的URL>/<檔名>”的屬性源包含了具有值"bar"的屬性"foo"並且是最高優先順序的)
note:屬性源名稱中的URL是git倉庫地址而不是配置伺服器的URL。