Spring Cloud Config作为分布式系统的配置中心,Config Server默认从git上获取配置文件。当Spring应用启动时,会连接上Config Server,从Config Server获取配置来初始化Spring环境。
一、创建git仓库
1.1 创建远程git仓库
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
项目源码地址: