摘要:是一种集中、统一管理各种应用配置的基础服务组件。
目录
[TOC]
分布式配置中心
配置中心:是一种集中、统一管理各种应用配置的基础服务组件,从而解决因为数量和环境导致的配置信息不一致问题。
-
在分布式服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移 (分割),这样配置就分散了,不仅如此,分散中还包含着冗余。
-
而配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。

配置加载顺序
若 application.yml 和 bootStrap.yml 在同目录下,则bootStrap.yml 会优先被加载。
原理:bootstrap.yml 于应程序上下的引导阶段,由Spring ApplicationContext加载。
- bootstrap.yml:可以理解成系统级别的参数配置,这些参数一般是不会变动的。在Spring ApplicationContext 应用上下文初始化之前加载,用于配置那些需要在这之前就被设置好的属性。
- 如配置中心连接配置信息,如果搭配 spring-cloud-config 使用可以实现动态替换。
- application.yml:用来定义 Spring Boot 应用级别的主要配置文件,包含了应用运行时大部分的配置信息,如数据库连接、服务端口等。
常见的实现工具
比较典型的配置中心实现工具有:
- 推荐:Apollo(阿波罗)、Nacos、Spring Cloud Config
ETCD、Consul、ZooKeeper;百度开源的 Disconf、阿里巴巴提供的 Diamond。
Spring Cloud Config 配置管理
Spring Cloud Config:用来为分布式系统中的(基础设施和微服务应用)提供集中化的外部配置支持,可以集中存储所有应用的配置文件。分为服务端和客户端两部分:
- 服务端(Config Server)也称为分布式配置中心,是一个独立的微服务应用,可以从配置仓库获取配置信息并提供给客户端使用,加密/解密信息等访问接口。对应的组件是:
spring-cloud-config-server。 - 客户端则是微服务架构中的各个微服务应用或基础设施,通过指定的配置中心管理(应用资源与业务相关的)配置内容,并在启动时从配置中心获取和加载配置信息。对应的组件是:
spring-cloud-starter-client。 - Spring Cloud Config 的配置中心默认采用Git来存储配置信息,所以天然就支持配置信息的版本管理,并且可以使用Git客户端来方便地管理和访问配置信息。通常使用不同格式来区分不同应用的不同配置文件。
- 支持安全认证。
- 云计算环境下,习惯上使用YAML配置,而且一般配置文件的位置都放在类路径下的config目录下,配置文件规则:应用名+profile.yml。
1 | |
Spring Cloud提供了注解@EnableConfigServer来启动配置服务。

在Git仓库中准备配置信息
Spring Cloud Config 需要一个存储配置信息的Git仓库。
配置仓库的目录结构:

创建 config-server 模块
在pom.xml中添加相关依赖
1 | |
在application.yml中进行配置
config-server 自己本身作为一个应用的配置,因此不用 bootstrap.yml
1 | |
在启动类上添加@EnableConfigServer注解
来启用 Config Server 功能作为配置中心
1 | |
通过config-server获取配置信息
这里通过config-server来演示下如何获取配置信息。
获取配置文件信息的访问格式
1 | |
占位符相关解释
- application:代表应用名称,默认为配置文件中的spring.application.name,如果配置了
spring.cloud.config.name,则为该名称; - label:代表分支名称,对应配置文件中的spring.cloud.config.label;
- profile:代表环境名称,对应配置文件中的spring.cloud.config.profile。
获取配置信息演示
-
启动eureka-server、config-server服务;
-
访问http://localhost:8901/master/config-dev来获取master分支上dev环境的配置信息;

- 访问http://localhost:8901/master/config-dev.yml来获取master分支上dev环境的配置文件信息,对比上面信息,可以看出配置信息和配置文件信息并不是同一个概念;

- 访问http://localhost:8901/master/config-test.yml来获取master分支上test环境的配置文件信息:

- 访问http://localhost:8901/dev/config-dev.yml来获取dev分支上dev环境的配置文件信息:

config-sever集群搭建
在微服务架构中,所有服务都从配置中心获取配置,配置中心一旦宕机,会发生很严重的问题,下面我们搭建一个双节点的配置中心集群来解决该问题。
- 首先启动两个config-server分别运行在8902和8903端口上;
创建 config-client 模块(微服务客户端)
创建一个config-client模块来从config-server获取配置。
在pom.xml中添加相关依赖
1 | |
在bootstrap.yml中进行配置
1 | |
添加 bootstrap-cluster.yml 配置文件
可集成在 bootstrap.yaml 中
-
主要是添加了从注册中心获取配置中心地址的配置,并去除了配置中心uri的配置:
-
以bootstrap-cluster.yml启动config-client服务,注册中心显示信息如下:

添加ConfigClientController类用于获取配置
1 | |
演示从配置中心获取配置
-
启动config-client服务;
-
访问http://localhost:9001/configInfo,可以获取到dev分支下dev环境的配置;
1 | |
获取子目录下的配置
我们不仅可以把每个项目的配置放在不同的Git仓库存储,也可以在一个Git仓库中存储多个项目的配置,此时就会用到在子目录中搜索配置信息的配置。
- 首先我们需要在config-server中添加相关配置,用于搜索子目录中的配置,这里我们用到了application占位符,表示对于不同的应用,我们从对应应用名称的子目录中搜索配置,比如config子目录中的配置对应config应用;
1 | |
- 访问http://localhost:9001/configInfo进行测试,可以发现获取的是config子目录下的配置信息。
1 | |
刷新配置
当Git仓库中的配置信息更改后,可以通过SpringBoot Actuator的refresh端点来刷新客户端配置信息。
- 重新启动config-client后,调用refresh端点进行配置刷新:

Spring Cloud Bus:消息总线
Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令,本文将对其用法进行详细介绍。
Spring Cloud Bus 简介
通常会使用消息代理来构建一个主题,然后把微服务架构中的所有服务都连接到这个主题上去,当向该主题发送消息时,所有订阅该主题的服务都会收到消息并进行消费。
- 使用 Spring Cloud Bus 可以方便地构建起这套机制,所以 Spring Cloud Bus 又被称为消息总线。
- Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。
- 目前 Spring Cloud Bus 支持两种消息代理:RabbitMQ 和 Kafka,下面以 RabbitMQ 为例来演示下使用Spring Cloud Bus 动态刷新配置的功能。
RabbitMQ的安装
见安装
动态刷新配置
使用 Spring Cloud Bus 动态刷新配置需要配合 Spring Cloud Config 一起使用,使用上一节中的config-server、config-client模块来演示下该功能。
给config-server添加消息总线支持
- 在pom.xml中添加相关依赖:
1 | |
- 添加配置文件application-amqp.yml,主要是添加了RabbitMQ的配置及暴露了刷新配置的Actuator端点;
1 | |
给config-client添加消息总线支持
- 在pom.xml中添加相关依赖:
1 | |
- 添加配置文件bootstrap-amqp1.yml及bootstrap-amqp2.yml用于启动两个不同的config-client,两个配置文件只有端口号不同;
1 | |
动态刷新配置演示
- 我们先启动相关服务,启动eureka-server,以application-amqp.yml为配置启动config-server,以bootstrap-amqp1.yml为配置启动config-client,以bootstrap-amqp2.yml为配置再启动一个config-client,启动后注册中心显示如下:

- 启动所有服务后,我们登录RabbitMQ的控制台可以发现Spring Cloud Bus 创建了一个叫springCloudBus的交换机及三个以 springCloudBus.anonymous开头的队列:


- 我们先修改Git仓库中dev分支下的config-dev.yml配置文件:
1 | |
- 调用注册中心的接口刷新所有配置:http://localhost:8904/actuator/bus-refresh

- 刷新后再分别调用http://localhost:9004/configInfo 和 http://localhost:9005/configInfo 获取配置信息,发现都已经刷新了;
1 | |
- 如果只需要刷新指定实例的配置可以使用以下格式进行刷新:http://localhost:8904/actuator/bus-refresh/{destination} ,我们这里以刷新运行在9004端口上的config-client为例http://localhost:8904/actuator/bus-refresh/config-client:9004。
配合WebHooks使用
WebHooks相当于是一个钩子函数,我们可以配置当向Git仓库push代码时触发这个钩子函数,这里以Gitee为例来介绍下其使用方式,这里当我们向配置仓库push代码时就会自动刷新服务配置了。

Nacos 作为配置中心
见 Nacos
Consul 作为配置中心
见 Consul