一、Spring Cloud Config簡介
Spring Cloud Config為分布式系統中的外部配置提供伺服器和用戶端支援。使用Config Server,您可以在所有環境中管理應用程式的外部屬性。用戶端和伺服器上的概念映射與Spring
Environment
和
PropertySource
抽象相同,是以它們與Spring應用程式非常契合,但可以與任何以任何語言運作的應用程式一起使用。随着應用程式通過從開發人員到測試和生産的部署流程,您可以管理這些環境之間的配置,并确定應用程式具有遷移時需要運作的一切。伺服器存儲後端的預設實作使用git,是以它輕松支援标簽版本的配置環境,以及可以通路用于管理内容的各種工具。很容易添加替代實作,并使用Spring配置将其插入。
Spring Cloud Config具有中心化、版本控制、支援動态更新和語言獨立等特性。其特點是:
- 提供服務端和用戶端支援(Spring Cloud Config Server和Spring Cloud Config Client);
- 集中式管理分布式環境下的應用配置;
- 基于Spring環境,實作了與Spring應用無縫內建;
- 可用于任何語言開發的程式;
- 預設實作基于Git倉庫(也支援SVN),進而可以進行配置的版本管理。
Spring Cloud Config的結構圖如下:

二、建立工程代碼測試
1、建立一個eureka注冊中心(config-eureka-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.example.demo.config</groupId>
<artifactId>config-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example.demo</groupId>
<artifactId>springcloud-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置檔案applicatio.yml
server:
port: 8081
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
fetch-registry: false
register-with-eureka: false
啟動類添加注解@EnableEurekaServer,代碼如下:
package com.example.demo.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class ConfigEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigEurekaServerApplication.class, args);
}
}
2、建立Config Server(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.example.demo.config</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example.demo</groupId>
<artifactId>springcloud-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml配置檔案:
server:
port: 8082
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/MoCunXiaoPing/springcloud/
search-paths: /**
username:
password:
label: master
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka/
配置說明:
- 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倉庫的使用者密碼
注意:如果Git倉庫為公開倉庫,可以不填寫使用者名和密碼,如果是私有倉庫需要填寫。
git伺服器(碼雲)上配置檔案config-client-dev.properties如下:
foo = foo version 2
foo.message = hello spring io
啟動類添加注解@EnableConfigServer開啟配置伺服器,代碼如下:
package com.example.demo.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3、建立Config Client(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.example.demo.config</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example.demo</groupId>
<artifactId>springcloud-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
</project>
bootstrap.properties配置檔案:
server.port=8083
spring.application.name=config-client
spring.cloud.config.profile=dev
spring.cloud.config.label=master
#spring.cloud.config.uri= http://localhost:8082/
eureka.client.serviceUrl.defaultZone: http://localhost:8081/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
配置說明:
- spring.cloud.config.discovery.enabled 是從配置中心讀取檔案。
- spring.cloud.config.discovery.serviceId 配置中心的servieId,即服務名。
- spring.cloud.config.label 指明遠端倉庫的分支
- spring.cloud.config.profile
- dev開發環境配置檔案
- test測試環境
- pro正式環境
注意:因為在springboot是啟動的時候才從配置檔案中讀取配置屬性,配置檔案在遠端配置中心的話,注冊中心的資訊需要放在bootstrap.properties中才能啟動優先讀取,放在application.yml會報該異常沒發現屬性,異常資訊如下:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'foo' in value "${foo}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) ~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
... 17 common frames omitted
啟動類添加注解@EnableEurekaClient,代碼如下:
package com.example.demo.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
建立接口API,TestController.java類,代碼如下:
package com.example.demo.config.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 路徑:com.example.demo.config.controller
* 類名:
* 功能:《用一句描述一下》
* 備注:
* 建立人:typ
* 建立時間:2018/9/14 10:55
* 修改人:
* 修改備注:
* 修改時間:
*/
@RestController
public class TestController {
@Value("${foo}")
String foo;
@GetMapping("/test")
public String test(){
return foo;
}
}
4、啟動工程測試
通路:http://localhost:8081/,浏覽器顯示結果:
通路:http://localhost:8083/test,浏覽器顯示結果:
foo version 2
源碼下載下傳:https://download.csdn.net/download/typ1805/10667167