Spring Cloud Config 可以为微服务架构中的应用提供集中化的外部配置支持,它分为服务端和客户端两个部分,本文将对其用法进行详细介绍。
Spring Cloud Config 分为服务端和客户端两个部分。服务端被称为分布式配置中心,它是个独立的应用,可以从配置仓库获取配置信息并提供给客户端使用。客户端可以通过配置中心来获取配置信息,在启动时加载配置。Spring Cloud Config 的配置中心默认采用Git来存储配置信息,所以天然就支持配置信息的版本管理,并且可以使用Git客户端来方便地管理和访问配置信息。
由于Spring Cloud Config 需要一个存储配置信息的Git仓库,这里我们先在Git仓库中添加好配置文件再演示其功能,Git仓库地址为: gitee.com/macrozheng/… 。
config: info: "config info for dev(master)" 复制代码
config: info: "config info for test(master)" 复制代码
config: info: "config info for prod(master)" 复制代码
config: info: "config info for dev(dev)" 复制代码
config: info: "config info for test(dev)" 复制代码
config: info: "config info for prod(dev)" 复制代码
这里我们创建一个config-server模块来演示Spring Cloud Config 作为配置中心的功能。
<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> 复制代码
server: port: 8901 spring: application: name: config-server cloud: config: server: git: #配置存储配置信息的Git仓库 uri: https://gitee.com/macrozheng/springcloud-config.git username: macro password: 123456 clone-on-start: true #开启启动时直接从git获取配置 eureka: client: service-url: defaultZone: http://localhost:8001/eureka/ 复制代码
@EnableConfigServer @EnableDiscoveryClient @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } } 复制代码
这里我们通过config-server来演示下如何获取配置信息。
# 获取配置信息 /{label}/{application}-{profile} # 获取配置文件信息 /{label}/{application}-{profile}.yml 复制代码
启动eureka-server、config-server服务;
访问 http://localhost:8901/master/config-dev 来获取master分支上dev环境的配置信息;
我们创建一个config-client模块来从config-server获取配置。
<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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 复制代码
server: port: 9001 spring: application: name: config-client cloud: config: #Config客户端配置 profile: dev #启用配置后缀名称 label: dev #分支名称 uri: http://localhost:8901 #配置中心地址 name: config #配置文件名称 eureka: client: service-url: defaultZone: http://localhost:8001/eureka/ 复制代码
/** * Created by macro on 2019/9/11. */ @RestController public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() { return configInfo; } } 复制代码
启动config-client服务;
访问 http://localhost:9001/configInfo ,可以获取到dev分支下dev环境的配置;
config info for dev(dev) 复制代码
我们不仅可以把每个项目的配置放在不同的Git仓库存储,也可以在一个Git仓库中存储多个项目的配置,此时就会用到在子目录中搜索配置信息的配置。
spring: cloud: config: server: git: search-paths: '{application}' 复制代码
config info for config dir dev(dev) 复制代码
当Git仓库中的配置信息更改后,我们可以通过SpringBoot Actuator的refresh端点来刷新客户端配置信息,以下更改都需要在config-client中进行。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 复制代码
management: endpoints: web: exposure: include: 'refresh' 复制代码
/** * Created by macro on 2019/9/11. */ @RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() { return configInfo; } } 复制代码
update config info for config dir dev(dev) 复制代码
我们可以通过整合SpringSecurity来为配置中心添加安全认证。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 复制代码
server: port: 8905 spring: application: name: config-security-server cloud: config: server: git: uri: https://gitee.com/macrozheng/springcloud-config.git username: macro password: 123456 clone-on-start: true #开启启动时直接从git获取配置 security: #配置用户名和密码 user: name: macro password: 123456 复制代码
server: port: 9002 spring: application: name: config-client cloud: config: profile: dev #启用配置后缀名称 label: dev #分支名称 uri: http://localhost:8905 #配置中心地址 name: config #配置文件名称 username: macro password: 123456 复制代码
使用bootstrap-security.yml启动config-client服务;
访问 http://localhost:9002/configInfo 进行测试,发现可以获取到配置信息。
config info for dev(dev) 复制代码
在微服务架构中,所有服务都从配置中心获取配置,配置中心一旦宕机,会发生很严重的问题,下面我们搭建一个双节点的配置中心集群来解决该问题。
启动两个config-server分别运行在8902和8903端口上;
添加config-client的配置文件bootstrap-cluster.yml,主要是添加了从注册中心获取配置中心地址的配置并去除了配置中心uri的配置:
spring: cloud: config: profile: dev #启用环境名称 label: dev #分支名称 name: config #配置文件名称 discovery: enabled: true service-id: config-server eureka: client: service-url: defaultZone: http://localhost:8001/eureka/ 复制代码
config info for config dir dev(dev) 复制代码
springcloud-learning ├── eureka-server -- eureka注册中心 ├── config-server -- 配置中心服务 ├── config-security-server -- 带安全认证的配置中心服务 └── config-client -- 获取配置的客户端服务 复制代码