Spring Cloud-Config分布式配置中心
简介
Spring Cloud Config可以为微服务架构中的应用提供集中化的外部配置支持,分为服务端和客户端两部分。
服务端被称为分布式配置中心,它是个独立的应用,可以从配置仓库获取配置信息并提供给客户端使用。
客户端可以通过配置中心来获取配置信息,在启动时加载配置。
Spring Cloud Config配置中心默认采用Git来存储配置信息,所以天然支持配置信息的版本管理,并且可以使用Git客户端来方便地管理和访问配置信息。
Git仓库准备配置信息
本文中我们使用Git仓库来存储Spring Cloud Config配置中心的配置信息,故首先创建Git仓库。
Git仓库目录结构,如下图示:
master分支下的配置信息
config-dev.yml:
config:
info: "config info for dev(master)"
config-test.yml:
config:
info: "config info for test(master)"
config-prod.yml:
config:
info: "config info for prod(master)"
config/config-dev.yml:
config:
info: config info for config dir dev(master)
dev分支下的配置信息
config-dev.yml:
config:
info: "config info for dev(dev)"
config-test.yml:
config:
info: "config info for test(dev)"
config-prod.yml:
config:
info: "config info for prod(dev)"
创建config-server模块
创建config-server作为Spring Cloud Config的配置中心。
pom.xml添加相关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml配置:
server:
port: 8901
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/whwtree/springcloud-config.git
username: test
password: 12345
# 启动时从git获取配置
clone-on-start: false
# 搜索子目录下的配置,子目录对应不同应用的名称
# search-paths: '{application}'
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8001/eureka/
在启动类上添加@EnableConfigServer注解来启用配置中心功能
@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
通过config-server获取配置信息
获取配置文件信息访问uri格式:
# 获取配置信息
/{label}/{application}-{profile}
# 获取配置文件信息
/{label}/{application}-{profile}.yml
占位符说明:
- application:代表应用名称,默认为配置文件中的spring.application.name,如果配置了spring.cloud.config.name,则为该名称;
- label:代表分支名称,对应配置文件中的spring.cloud.config.label;
- profile:代表环境名称,对应配置文件中的spring.cloud.config.profile;
启动eureka-server、config-server服务。
访问master分支上config应用dev环境的配置信息:
请求地址:
http://localhost:8901/master/config-dev
响应如下所示:
{
"name": "master",
"profiles": [
"config-dev"
],
"label": null,
"version": "9e1d4cd726ce8219bbde7f07ab4e591b26ad86b0",
"state": null,
"propertySources": []
}
访问master分支上config应用dev环境的配置文件信息:
请求地址:
http://localhost:8901/master/config-dev.yml
响应内容:
config:
info: config info for dev(master)
请求地址:
http://localhost:8901/master/config-test.yml
响应内容:
config:
info: config info for test(master)
请求地址:
http://localhost:8901/master/config-prod.yml
响应内容:
config:
info: config info for prod(master)
创建config-client模块
创建config-client客户端从config-server获取配置信息。
pom.xml相关依赖:
<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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在bootstrap.yml中进行配置:
server:
port: 9001
spring:
application:
name: config-client
cloud:
config:
# 分支名称
label: master
# 启用配置后缀名称
profile: dev
# 配置文件名称
name: config
# 配置中心地址
uri: http://localhost:8901
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8001/eureka/
management:
endpoints:
web:
exposure:
include: 'refresh'
添加ConfigClientController类用于获取配置
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
获取配置测试
启动eureka-server、config-server、config-client服务
访问客户端configInfo接口,获取master分支下dev环境的配置:
请求地址:http://localhost:9001/configInfo
响应内容:config info for dev(master)
获取子目录下的配置
我们不仅可以把每个项目的配置放在不同的Git仓库存储,也可以在一个Git仓库中存储多个项目的配置,此时就会用到子目录中搜索配置信息。
config-server配置子目录
此处,我们使用application应用名称作为子目录名称,表示从对应项目的子目录中搜索配置。
配置如下:
spring:
cloud:
config:
server:
git:
# 搜索子目录下的配置,子目录对应不同应用的名称
search-paths: '{application}'
注意:application代表应用名称,默认为配置文件中的spring.application.name,如果配置了spring.cloud.config.name,则为该名称;
修改完application.yml配置后,重启config-server服务。访问http://localhost:9001/configInfo地址,此时可发现获取到的是config子目录下的配置。
刷新配置
当Git仓库中的配置信息更改后,我们可以通过SpringBoot Actuator的refresh端点来刷新客户端配置信息,以下更改都在config-client中进行。
pom.xml中新增Actuator依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
bootstrap.yml中开启刷新refresh端点:
management:
endpoints:
web:
exposure:
include: 'refresh'
在ConfigClientController类添加@RefreshScope注解用于刷新配置:
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
修改完后,重启config-client服务。
首先,修改Git仓库config/config-dev.yml内容为:
config:
info: update config info for config dir dev(master)
然后,调用refresh端点刷新配置
在postman中,post请求地址:
http://localhost:9001/actuator/refresh
响应内容:
[
"config.client.version",
"config.info"
]
最后,访问http://localhost:9001/configInfo地址,可以发现配置信息已经刷新:
响应内容:
update config info for config dir dev(master)
配置中心添加安全认证
我们通过整合SpringSecurity来为配置中心添加安全认证。
创建config-security-server模块
在pom.xml中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
application.yml配置:
server:
port: 8905
spring:
application:
name: config-security-server
cloud:
config:
server:
git:
uri: https://gitee.com/whwtree/springcloud-config.git
username: test
password: 12345
# 启动时从git获取配置
clone-on-start: false
security:
user:
name: root
password: 123456
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8001/eureka/
启动config-security-server服务。
修改config-client配置
添加bootstrap-security.yml配置文件,主要是配置了连接配置中心的地址、用户名和密码:
server:
port: 9002
spring:
application:
name: config-client
cloud:
config:
# 分支名称
label: master
# 启用配置后缀名称
profile: dev
# 配置文件名称
name: config
# 配置中心地址
uri: http://localhost:8905
username: root
password: 123456
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8001/eureka/
management:
endpoints:
web:
exposure:
include: 'refresh'
修改完后,使用bootstrap-security.yml配置启动config-client服务。
访问http://localhost:9002/configInfo进行测试,发现可以获取到配置信息。
响应内容:
config info for dev(master)
config-server集群搭建
在微服务架构中,所有服务都是从配置中心获取配置,配置中心一旦宕机,会发生很严重的问题,下面我们搭建一个双节点的配置中心集群来解决此问题。
启动两个config-server分别运行在8902和8903端口上。
config-client中,添加配置文件bootstrap-cluster.yml,主要是添加了从注册中心获取配置中心地址的配置,并去除了配置中心uri配置。
server:
port: 9003
spring:
application:
name: config-client
cloud:
config:
# 分支名称
label: master
# 启用配置后缀名称
profile: dev
# 配置文件名称
name: config
# config集群搭建
discovery:
enabled: true
service-id: config-server
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8001/eureka/
以bootstrap-cluster.yml配置启动config-client服务。
访问http://localhost:9003/configInfo,发现config-client可以获取到配置信息。
分别启动/关闭8902/8903对应的config-server,测试配置中心集群效果。
Git项目源码参考地址:
https://gitee.com/whwtree/springcloud-learning.git