前言
在分布式系统中,存在着多个服务,服务之间的调用也比较频繁,为了方便管理服务的配置信息,需要建立一个分布式的配置中心来统一管理,springcloud中就存在这样的组件,它就是spring cloud config。
spring cloud config支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。一般来说,分布式系统的配置信息都是集中放在git仓库中进行管理, 通过加入spring cloud config组件,我们可以建立一个config server的服务来实现对远程配置文件的维护管理,然后各个微服务在通过config server来获取配置信息,这时的微服务就相当于config的客户端。
为了方便展示效果,本文中的两个例子就命名为config server 和config client。
创建config server
老规矩,先创建一个父工程,名称是config,然后新建一个module工程config server,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>com.yeya</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.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.RELEASE</spring-cloud.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>
</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>
</project>
在入口Application类加上@EnableConfigServer注解,表明开启配置服务器的功能
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
在配置文件application.yml中配置如下信息:
#服务名称
spring:
application:
name:config-server
cloud:
config:
server:
git:
uri: https://github.com/Taoxj/sc_properties/ #git远程仓库的地址
search-paths: /** #仓库配置文件的路径,这里默认全部都可以访问
username: #git账户的用户名
password: #git账户的密码
label: master #配置仓库的分支
#端口
server:
port: 1211
git仓库的地址是笔者在GitHub上建立的公开仓库https://github.com/Taoxj/sc_properties,因为是公开仓库,所以不用设置账户名和密码,大家可以直接访问。
在远程仓库的config文件夹下有两个文件,分别是config-client -dev.properties 、config-client -test.properties ,两个配置文件中内容为:
age = 18
user = yeya
test-name = yeya-test
启动工程,在浏览器打开http://localhost:1113/label/dev,可以看到网页显示结果为:
说明我们成功访问到了远程配置信息,访问的信息是config-client -dev.properties中的内容。
配置服务中心http请求地址和资源文件映射如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
我们可以在浏览器中访问http://localhost:1211/label/test,这时访问到的就是config-client -test.properties的信息了。
创建config client工程
创建子工程,名称为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>com.yeya</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.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.RELEASE</spring-cloud.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-test</artifactId>
<scope>test</scope>
</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>
</project>
在配置文件bootstrap.yml配置好如下信息:
server:
port: 1113
spring:
application:
name: config-client
cloud:
config:
label: master
profile: dev
uri: http://localhost:1112/
label:远程分支
profile:dev 指开发环境配置文件,若为test则为测试环境,pro为生产环境,这里我们读取开发环境配置文件中的信息
uri:配置服务中心的地址
配置成功后,在启动类中加入一个接口来访问配置dev文件中的user属性信息
@SpringBootApplication
@RestController
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
@Value("${user}")
String user;
@RequestMapping("/user")
public String home() {
return "user:" + user;
}
}
启动工程, 在浏览器输入http://localhost:1112/user,可以看到成功输出字符串
yeya
证明config-client可以通过config-server来访问远程仓库的配置信息,项目的架构图如下:
注意bootstrap.yml与application.yml执行顺序
最后,在这里要说明以下,config-client的配置文件名记得要改成bootstrap.yml,笔者之前不知道这个问题,就照着application.yml上配置信息,然后发现config-client总是启动失败,报如下的信息:
log提示我们的错误是因为 “${user}” 注入失败,说明代码没有从Git地址上获取到这个key的信息,楼主尝试过很多种方法,包括了重建git仓库,或者是配置信息加入用户名和密码等等,这些方法试过之后都没有解决问题,后来上网查了一下,才知道原来spring cloud的配置文件存在优先级的加载顺序的。
根据网上的资料,bootstrap.yml的优先级高于application.yml,
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等。
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载,所以,启动config-client项目的时候,为了取得配置信息,需要一些提早或引导的配置,所以,一般在config组件中是把配置信息放在bootstrap.yml中,系统会默认优先加载其中的信息,这样就可以保证要获取的key注入成功。
本文源码地址:https://github.com/Taoxj/SpringCloudDemo/tree/master/config