1. 简介
config(配置)又称为统一配置中心,顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护。
Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Cloud 项目,通过简单的配置即可实现功能。
配置文件是我们再熟悉不过的了,尤其是 Spring Boot 项目,除了引入相应的 maven 包之外,剩下的工作就是完善配置文件了,例如 mysql、redis 、security 相关的配置。除了项目运行的基础配置之外,还有一些配置是与我们业务有关系的,比如说七牛存储、短信相关、邮件相关,或者一些业务上的开关。
对于一些简单的项目来说,我们一般都是直接把相关配置放在单独的配置文件中,以 properties 或者 yml 的格式出现,更省事儿的方式是直接放到 application.properties 或 application.yml 中。但是这样的方式有个明显的问题,那就是,当修改了配置之后,必须重启服务,否则配置无法生效。
目前有一些用的比较多的开源的配置中心,比如携程的 Apollo、蚂蚁金服的 disconf 等,对比 Spring Cloud Config,这些配置中心功能更加强大。有兴趣的可以拿来试一试。
https://www.cnblogs.com/fengzheng/p/11242128.html
流程图
统一配置中心组件流程图
另一流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0fJilxUi-1650548834040)(https://cdn.jsdelivr.net/gh/zewei94yomi/ImageLoader@master/uPic/6yfmk0.jpg)]
第一步:上传文件到GitLab;
第二步:GitLab通过Webhook调用ConfigServer;
第三、四步:ConfigServer拉取配置到本地仓库(缓存一份);
第五步:ConfigServer通过Stream触发各ConfigClient;
第六步:ConfigClient获取配置并更新。
————————————————
版权声明:本文为CSDN博主「wangfei0904306」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangfei0904306/article/details/79420122
注意ConfigServer也可以/需要做集群
2. 使用
依赖关系:configclient --> configserver --> 远端git仓库
0. 远端git仓库
在Github创建一个远程仓库
1. ConfigServer
ConfigServer本身也是一个服务,统一配置中心服务。
创建一个新的springboot项目作为ConfigServer
-
入口类
@SpringBootApplication
@EnableConfigServer
-
依赖
- springboot-web
- consul
- actuator
- config-server
-
配置
server.port=8848 spring.application.name=CONFIGSERVER # consul server 服务注册地址 spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 spring.cloud.consul.discovery.service-name=${spring.application.name} # 远程仓库地址 spring.cloud.config.server.git.uri=https://github.com/zewei94yomi/springcloud_config_tutorial.git # 指定仓库的url spring.cloud.config.server.git.default-label=main # 指定访问的分支 #spring.cloud.config.server.git.username= 私有仓库访问用户名 #spring.cloud.config.server.git.password= 私有仓库访问密码
关于如何拉取文件
2. ConfigClient
创建一个新的springboot项目作为ConfigClient:
- 入口类
- 依赖
- config
- …
- 配置
假如某个client现在有这么一个需求:DemoController中需要根据配置文件中的name
来输出,而不同环境(开发环境和生产环境)中的该值不一样,当把这些不同的配置文件都上传到远端git仓库时,如何让configserver拉取?
@RestController
public class DemoController {
private static final Logger log = LoggerFactory.getLogger(DemoController.class);
@Value("${name}")
private String name;
@GetMapping("/demo")
public String demo() {
log.info("Demo OK!");
return "Demo OK! " + name;
}
}
公共配置文件configclient.properties
server.port=8990
spring.application.name=CONFIGCLIENT
开发环境配置文件configclient-dev.properties
name=zhangsan
生产环境配置文件configclient-pro.properties
name=lisi
把这三个配置文件都上传到github远程仓库
此时可以使用configserver从远端仓库拉取配置文件,注意拉取文件规则:
- label/name-profiles.yml|properties|json
`label 代表去那个分支获取 默认使用master分支
`name 代表读取那个具体的配置文件文件名称
`profile 代表读取配置文件环境
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGQ2OcGX-1650548834041)(https://cdn.jsdelivr.net/gh/zewei94yomi/ImageLoader@master/uPic/image-20200722105313716.png)]
可以注意到支持的文件格式有: properties, json和yml格式,并且文件名中间必须带有"-"!
如果找到了相应的文件,就会将该配置文件与主配置文件合并,成为一个整体的配置文件,并且保存到本地的临时文件夹。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4otovlyN-1650548834041)(https://cdn.jsdelivr.net/gh/zewei94yomi/ImageLoader@master/uPic/w2VGvn.png)]
至此,configserver已经可以独立地去远程配置中心拉取配置,接下来需要让configclient去configserver获取配置。但是config的client并不知道config server的地址,所以还是需要在配置文件中写明config server的地址。
config client的配