配置中心 Spring Cloud Config
当我们的后台服务逐渐增多,各个服务的配置也越来越多,随之而来的就是一个配置管理问题,各自管各自的开发时没什么问题,到了线上之后管理就会很头疼,到了要大规模更新就更麻烦了。这时候Spring Cloud Config的作用就体现出来了,它是一个统一管理配置的组件。它支持配置统一放在内存中(即本地),也支持放在远程Git仓库中,也支持放在关系型数据库中。在spring cloud config 组件中,分两个角色,一是Config Server,二是Config Client。Config Server用于管理配置并暴露Http API接口,Config Client通过暴露的接口来读取配置文件。
本章依然使用前面讲解其他组件所建的工程,github地址。
Config Server从本地读取配置文件
这种方式是本地仓库模式。本地仓库指将所有的配置文件统一写在Config Server工程目录下。现搭建一个Config Server和Config Client,Config Server采用本地仓库模式。
- 创建一个Module工程,工程名取为config-server。在pom文件中添加Config Server的起步依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 在启动类加上@EnableConfigServer注解,开启Config Server的功能。@EnableEurekaClient开启EurekaClient的功能。
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
- 在配置文件中做相关的配置,其中主要是通过spring.profiles.active=native来配置从本地读取配置,读取路径为classpath下的shared目录。
server:
port: 8090
spring:
cloud:
config:
server:
native:
search-locations: classpath:/shared
profiles:
active: native
application:
name: config-server
- 在resources目录下建一个shared文件夹,在其中新建一个eureka-client-dev.yml文件,用于模拟eureka-client工程dev(开发环境)的配置文件。
eureka-client-dev.yml
name: dzy #这里仅仅添加一个变量
- 在eureka-client工程的pom文件中添加Config的启动依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 新建配置文件bootstrap.yml,在其中添加配置如下
spring:
application:
name: eureka-client
cloud:
config:
fail-fast: true #如果没有读取成功,则执行快速失败
profile: dev # 读取的是dev文件
discovery:
enabled: true
serviceId: config-server # config-server的服务实例名称
注意
:
这里用的必须是bootstrap.yml,而不是application.yml。bootstrap相对于application具有优先的执行顺序。其中配置文件中变量{spring.application.name}和变量{spring.profiles.active},两者以“-”相连,构成了向config server读取的配置文件名。本列中为eureka-client-dev.yml。
- 在eureka-client中添加一个controller来获取config server中的配置,代码如下
@RestController
public class ConfigController {
@Value("${name}")
private String name;
@GetMapping("/name")
public String config() {
return "I am " + name;
}
}
- 测试
其中eureka-server、eureka-client、config-server。访问eureka-client的“/name”的映射接口。可以看到从配置中心中读取到变量name的值。
Config Server从远程Git仓库读取配置文件
这种模式 Config Server不从本地的仓库读取,而是从Git仓库读取配置。
- 修改config-server的配置,把本地改为Git仓库地址。
server:
port: 8090
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/dzydzydzy/spring-cloud.git #git仓库地址
search-paths: eureka-client #为搜索远程仓库的文件夹地址
username: #git仓库登录用户名
password: #git仓库登录密码
label: master # git仓库的分支名
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
-
在对应git仓库地址中建立配置文件
image.png -
测试
其中eureka-server、eureka-client、config-server。访问eureka-client的“/name”的映射接口。可以看到从配置中心中读取到变量name的值。
构建高可用的Config Server
只需要把Config Server和Config Client向Eureka Server注册,且将Config Server多实例集群部署。
使用Spring Cloud Bus刷新配置
以上的方式当仓库中配置更改时,需要重新启动config client才能实现配置的更改。Spring Cloud Bus的一个功能让这个过程变的简单,当远程git仓库的配置更改后,只需要向某一个微服务实例发送一个post请求,通过消息组件通知其他微服务实例重新拉取配置文件。如图,当远程Git仓库的配置更改后,通过发送“/bus/refresh”Post请求给某一个微服务实例,通过消息组件,通知其他微服务实例更新配置。
image.png
- 只需要改造Config Client,本列中改造eureka-client,现在组件用RabbitMQ。首先需要在pom中引用RabbitMQ实现的Spring Cloud Bus的起步依赖。在此之前需要在本地安装RabbitMQ服务器。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 在配置文件中添加RabbitMQ的相关配置。
spring:
rabbitmq:
host: #rabbitmq服务器ip地址
port: #rabbitmq服务器端口
username: #rabbitmq服务器用户名
password: #rabbitmq服务器密码
management:
security:
enabled: false #通过消息总线更改配置,需要经过安全验证,这里为了方便先屏蔽安全验证
- 需要在更新的配置类上加@RefreshScope注解,这样才会在不重启服务的情况下更新配置
@RestController
@RefreshScope
public class ConfigController {
@Value("${name}")
private String name;
@GetMapping("/name")
public String config() {
return "I am " + name;
}
}
- 测试
其中eureka-server、eureka-client、config-server。访问eureka-client的“/name”的映射接口。可以看到从配置中心中读取到变量name的值。此时改变git仓库变量的值,通过postman发送刷新配置请求http://localhost:8763/bus/refresh。再次访问“/name”的映射接口,可以发现没有重启也能访问到改变后的变量。
注意
“bus/refresh"API接口可以指定服务,使用"destination"参数,例如"/bus/refresh?destination=eureka-client:**",即刷新服务名为eureka-client的所有服务实例。
总结
本章学习了为什么要使用Spring Cloud Config,以及Config Server在本地和GitHub上读取配置的两者方式,最后介绍了通过Spring Cloud Bus在不启动服务实例时获取最新的配置。在下一章一起学习服务链路追踪——Spring Cloud Sleuth