Spring Cloud Config作為分布式系統的配置中心,Config Server預設從git上擷取配置檔案。當Spring應用啟動時,會連接配接上Config Server,從Config Server擷取配置來初始化Spring環境。
一、建立git倉庫
1.1 建立遠端git倉庫
Git建立公開倉庫
Config Server配置資源庫
1.2 建立本地git倉庫
$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"
在倉庫中加如下格式的檔案。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
以上端點可以直接通路資源庫的配置檔案
比如我上面通路的就是第一種方式,省略的label,也就是master分支。
application -》 Config Client的spring.application.name,要唯一指定,預設是application;
profile -》Config Client的spring.profiles.active = config1,config2 ,或者spring.cloud.config.profile= config1,config2
label -》Config Server的spring.cloud.config.label,預設是master分支,也可以是Tag分支名,commit id;多個以逗号分隔;
注意:一定要commit,要不然Config Server啟動時,會報如下錯:
原因是沒有預設的master分支。
二、建立Config Server
啟動類:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
application.properties:
spring.application.name=config-server
#預設是8080端口,為避免沖突,我們自定義一個
server.port=8889
#公開的遠端git倉庫
#spring.cloud.config.server.git.uri=https://github.com/bawcwchen/config/
#本地倉庫
spring.cloud.config.server.git.uri=file:///D:/back/localgit
#按項目搜尋配置檔案
spring.cloud.config.server.git.searchPaths=app1,app2
spring.cloud.config.label=master
#spring.cloud.config.server.git.username=your username
#spring.cloud.config.server.git.password=your password
注意,如果spring.cloud.config.server.git.uri用的是windows系統的本地倉庫,以file:///開頭。
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.cj</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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.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>
</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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</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>
三、 Config Client
Config Client其實就是我們的分布式系統用戶端應用。
啟動類:
@SpringBootApplication
@RestController
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
/**
* config server連接配接的遠端資源庫和本地application.properties都提供
* 優先取config server上配置app1-config1.properties
* 若沒有,則取application.properties配置
*/
@Value("${username}")
private String username;
/**
* config server沒有提供該配置,取application.properties
*/
@Value("${year}")
private Integer year;
/**
* 取config server上配置app1-config2.properties,注意這裡是資源庫上另外一個配置檔案
*/
@Value("${address}")
private String address;
/**
* 從application.properties, application.yml, application-*.properties取全局配置。
*/
@Value("${greeting}")
private String greeting;
@RequestMapping(value = "/hello")
public String hello() {
return username + ":" + year + ":" + address + ":" + greeting;
}
}
PS:
git資源庫上以application開頭的配置檔案,會被所有Config Client共享,自動擷取該配置檔案。如下:
Config Client啟動時,可能報錯,因為從git倉庫擷取配置時,網絡性能不好,多試幾次就好了。
application.properties:
server.port=8881
username = 張三
year = 18
#spring cloud配置,最好放到bootstrap.properties裡,要不然有問題,
#比如:這裡spring.cloud.config.uri不生效,還是去連接配接的預設的8888端口
#spring.cloud.config.label=master
#spring.cloud.config.profile= config1,config2
#spring.cloud.config.uri= http://localhost:8889/
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.forezp</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.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>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>Dalston.RC1</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>
bootstrap.properties:
這個檔案是用戶端應用啟動的引導檔案,裡面的内容最好單獨出來,不要放到application.properties裡去,要不然會有一些莫名其妙的問題。
#這個配置項不要像純springboot應用那樣放到application.properties裡,
#要不然啟動時,如果application.properties沒有配置項,會報找不到config server上的配置項
spring.application.name= app1
spring.cloud.config.label=master
#以下2種方式指定配置檔案都行
#spring.cloud.config.profile= config1,config2
spring.profiles.active = config1,config2 //擷取多配置檔案
spring.cloud.config.uri= http://localhost:8889/
當用戶端啟動時,它的正常啟動日志如下這樣:
2018-05-27 16:26:37.343 INFO 156880 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8889/
2018-05-27 16:26:37.740 INFO 156880 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=app1, profiles=[config1, config2], label=master, version=4531e6fdf74c00fa9f122b8fe00bf437816dd786, state=null
2018-05-27 16:26:37.740 INFO 156880 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource [name='configService', propertySources=[MapPropertySource [name='configClient'], MapPropertySource [name='file:///D:/back/localgit/app1/app1-config2.properties'], MapPropertySource [name='file:///D:/back/localgit/app1/app1-config1.properties']]]
當用戶端啟動時,會連接配接到Config Server,Server的輸出日志如下:
如果連接配接的是Git遠端倉庫,它會在本地的${user.home}\AppData\Local\Temp下倉庫本地倉庫。
PS:不用git倉庫,直接從本地檔案系統取配置。也可以從svn上取配置沒試過。
Config Server配置修改如下:
spring.profiles.active=native
spring.cloud.config.server.native.searchLocations = file:///D:/back/localgit/app1,file:///D:/back/localgit/app2
Config Client配置修改如下:
#spring.cloud.config.label=master
因為不是git倉庫,是以不用指定label了。
spring.cloud.config.server.native.searchLocations 也可以指定到[classpath:/, classpath:/config] 下。
通路位址:
http://localhost:8881/hello
項目源碼位址:
https://github.com/bawcwchen/config-demo.git