spring cloud config 简介
spring cloud config为分布式系统外部化配置提供了服务器端和客户端支持,包括Config Server和Config Client两部分,这两部分都实现了对Spring Environment和PropertySource抽象的映射,因此spring cloud config非常适合Spring应用。
Config Server是一个可横向扩展、集中式的配置服务器,用于集中管理应用程序各个环境下的配置,默认使用Git存储配置内容,可实现对配置的版本控制和内容审计。
Config Client是Config Server的客户端,用于操作存储在Config Server中的配置属性,所有的微服务都指向Config Server,各个微服务在启动时,会请求Config Server以获取所需的配置属性,然后缓存这些属性以提高性能。
我们将配置文件放入git或者svn等服务中,通过一个Config Server服务来获取git中的配置数据,而我们需要使用的到配置文件的Config Client系统可以通过Config Server来获取对应的配置。
下面我们通过一个示例来演示一下config是如何被各个微服务系统获取到的。
1.向git中上传示例配置文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/taotao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
文件名分别为:
microservice-dev.properties
microservice-production.properties
microservice-test.properties
内容分别为:
profile=default-1.0
profile=production-1.0
profile=test-1.0
添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 使用bus总线的方式通知所有的微服务配置文件需要刷新 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
2.2 编写ConfigApplication
@EnableDiscoveryClient
@EnableConfigServer //开启配置服务
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
2.3 编写yml配置文件
server:
port: 6688 #服务端口
spring:
application:
name: microservice-config-server #指定服务名
cloud:
config:
server:
git: #配置git仓库地址
uri: 具体的配置文件的git地址
#username:
#password:
rabbitmq: #RabbitMQ相关的配置
host: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
defaultZone: http://cloud:cloud@127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ipAddress: 127.0.0.1
management:
security:
enabled: false #是否开启actuator安全认证
可使用Config Server的端点获取配置文件的内容。
这是我们启动该服务,访问该配置文件,访问路径示例如下(以该配置为例):
127.0.0.1:6688/microservice-dev.properties
访问路径的写法也有多种方式:
/{application}/{profile}/[label]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中{label}是指分支,默认是master。
已上端点都可以映射到{application}-{profile}.properties这个配置文件,{application}表示微服务名称,{profile}表示
对应的Git仓库分支,默认是master。
3. Config Client的搭建
3.1 添加依赖
<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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
3.2 添加yml配置文件
eureka:
client:
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
defaultZone: http://cloud:cloud@127.0.0.1:6868/eureka/
spring:
cloud:
config:
name: microservice #对应的配置服务中的应用名称
profile: dev #对应配置服务中的{profile}
label: master #对应的分支
discovery:
enabled: true #启用发现服务功能
service-id: microservice-config-server #指定服务名称
spring:
application:
name: itcasst-microservice-config-server #指定服务名
cloud:
config:
server:
git: #配置git仓库地址
uri: http://172.16.55.138:10080/itcast-config-server.git
#username: xxx
#password: ooo
rabbitmq: #RabbitMQ相关的配置
host: 127.0.0.1
port: 5672
username: guest
password: guest
注意,这里的yml配置文件是:bootstrap.yml,它和application.yml文件一样,会被spring boot加载,但是bootstrap.yml会优先加载。
3.3 在application.yml文件中添加配置
management:
security:
enabled: false #是否开启actuator安全认证
这个时候,我么通过@Value的方式,就可以获取到对应的配置了。
@RefreshScope
@Component//加入到Spring容器
public class JdbcConfigBean {
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.driverClassName}")
private String driverClassName;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
@Override
public String toString() {
return "JdbcConfigBean [url=" + url + ", username=" + username
+ ", password=" + password + ", driverClassName="
+ driverClassName + "]";
}
}
再次测试,我们发现当我们修改了git中的配置文件的内容之后,client系统中读取到的属性也是修改之后的了。
到此为止,其架构变成如下:
Config Server 的Git仓库配置
使用spring.cloud.config.server.git.uri指定了一个Git仓库,事实上,该属性非常灵活。
1.占位符支持
Config Server{application}/{profile}/[label]
yml配置文件
server:
port:8080
spring:
application:
name: microservice-config-server #指定服务名
cloud:
config:
server:
git: #配置git仓库地址
uri: http://172.16.55.138:10080/itcast-config-server.git
username: xxx
password: ooo
2.模式匹配
模式匹配指的是带有通配符的{application}/{profile}名称的列表,如果{application}/{profile}不匹配任何模式,将会使用
spring.cloud.config.server.git.uri指定URI。
yml配置文件
spring:
cloud:
config:
server:
git: #配置git仓库地址
uri: http://172.16.55.138:10080/itcast-config-server.git
re[os:
simple:https://github.com/simple/config-repo
special:
pattern:special*/dev*,*special*/dev*
uri:https://github.com/special/config-repo
local:
pattern:local*
uri:file:/home/configsvc/config-repo
- 3.搜索模式
把配置文件放在Git仓库自目录中,此时可使用search-path指定,同样支持占位符。
spring:
cloud:
config:
server:
git: #配置git仓库地址
uri: http://git.oschina.net/itmuch/itcast-config-server.git
search-paths:foo,bar*
- 这样,Config Server就会在Git仓库根目录,foo子目录下,所有以bar开始的子目录中查找配置文件。
- 4.启动时加载配置文件
- 默认情况下,在配置被首次请求时,Config Server才会clone Git仓库,也可以启动时clone Git
spring:
cloud:
config:
server:
git: #配置git仓库地址
uri: http://172.16.55.138:10080/zhangzhijun/itcast-config-server.git
repos:
team-a:
pattern:microservice-*
clone-on-start:true
uri:http://home/configsvc/config-repo