一、简介
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。
在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
二、构建Config Server
创建一个spring-boot项目,取名为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>cn.tao</groupId> <artifactId>configserver</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>configserver</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.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> <spring-cloud.version>Finchley.RC1</spring-cloud.version> </properties> <dependencies> <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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</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>
在程序的入口Application类加上 @EnableConfigServer注解 开启配置服务器的功能,代码如下:
@SpringBootApplication @EnableConfigServer public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
application.properties配置以下:
spring.application.name=config-server server.port=8888 #服务注册中心 eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ #服务的git仓库地址 spring.cloud.config.server.git.uri=https://gitee.com/xiaoliu66007/eureka_server_client.git /*替换成自己的git地址*/ #配置文件所在的目录 spring.cloud.config.server.git.searchPaths=/**/SpringCloudConfig /*替换成自己的git地址下的文件夹*/
#配置文件所在的分支
spring.cloud.config.label=master
spring.cloud.config.server.git.username=******* /*替换成git账号*/
spring.cloud.config.server.git.password=******* /*替换成git密码*/
注意事项:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
为了方便测试,我是在码云上自己上传了 config-client-dev.properties和config-client-prod.properties文件,
我的地址:
spring.cloud.config.server.git.uri = https://gitee.com/xiaoliu66007/eureka_server_client.git
spring.cloud.config.server.git.searchPaths=/**/SpringCloudConfig
如下图
----------------------------------------------------------------------------注意事项完毕------------------------------------------------------------------------------------------------
config-client-dev.properties内容如下
name=devEnv age=11 version=dev
启动程序:访问http://localhost:8888/config-client/dev,其中的config-client和dev 参照下面的“http请求地址和资源文件映射:”
效果如下:
证明配置服务中心可以从远程程序获取配置信息。
接上面的注意事项,http请求地址和资源文件映射如下:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
三、构建一个config client
重新创建一个springboot项目,取名为config-client,其pom文件:
<?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>cn.tao</groupId> <artifactId>configclient</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>configclient</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.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> <spring-cloud.version>Finchley.RC1</spring-cloud.version> </properties> <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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</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:
server.port=8881
spring.application.name=config-client
#开启配置服务发现
spring.cloud.config.discovery.enabled=true
#配置服务实例名称
spring.cloud.config.discovery.service-id=config-server
spring.cloud.config.label=master
#我目前上传的文件,可选值有[dev,prod]
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8888/
- spring.cloud.config.label 指明远程仓库的分支
-
spring.cloud.config.profile
- dev开发环境配置文件
- test测试环境
- pro正式环境
-
spring.cloud.config.uri= http://localhost:8888/ 指明配置服务中心的网址。
程序的入口类,如下:
/** http://localhost:8881/test可以访问到配置中心config-server,通过配置中心访问到远程git地址下的"config-client-dev.properties"(详见bootstrap.properties配置) 再config-server的Application类注释里,说到,若有"a-b.properties",访问起来是localhost:8888/a/b 而"localhost:8888/a/b"的 a 值对应bootstrap.properties里的spring.application.name(即"config-client") 所以bootstrap.properties文件指定读取的文件为: “【spring.application.name】- 【spring.cloud.config.profile】.properties” 即config-client-dev.properties */ @SpringBootApplication @RestController public class ConfigcenterClientApplication { @Value("${name}") String name; @Value("${age}") String age; @RequestMapping(value = "/test") public String test(){ return "我的名字是:"+name+",年龄是"+age; }public static void main(String[] args) { SpringApplication.run(ConfigcenterClientApplication.class, args); } }
访问 http://localhost:8881/test结果如下
我的名字是:devEnv,年龄是11
这就说明,config-client从config-server获取了name和age的属性,而config-server是从git仓库读取的,如图
本文源码下载:
https://github.com/forezp/SpringCloudLearning/tree/master/chapter6