一文吃透 Spring Cloud Config:从搭建到自动刷新、加密解密全流程

在微服务架构快速普及的当下,随着服务数量不断增多、部署环境愈发复杂,配置分散管理、维护繁琐、动态更新困难以及敏感信息泄露等问题也日益突出,严重影响开发效率和系统安全性。Spring Cloud Config 作为 Spring Cloud 生态体系中一款经典且成熟的分布式配置中心组件,专门针对上述痛点设计,能够实现配置的集中化管理、环境隔离、动态刷新以及敏感信息加密存储,为微服务架构的稳定运行提供有力支撑。

这篇博客将以实操为核心,带你从零到一全面掌握 Spring Cloud Config 的核心用法,涵盖 Config Server 与 Config Client 的完整搭建流程、手动与自动刷新配置的实现方式、Spring Cloud Bus 集群广播刷新的配置方法,以及对称与非对称两种加密解密方案,所有操作步骤详细可落地,新手也能轻松跟随上手。


一、为什么需要 Spring Cloud Config?

在传统的微服务开发模式中,每个微服务应用都会单独维护自己的配置文件,其中包含数据库连接信息、Redis 配置、消息队列参数以及第三方接口密钥等关键内容。这种分散式配置管理方式在实际应用中会暴露出诸多问题,具体如下:

  1. 维护成本高:一旦需要修改配置(如切换数据库地址、调整第三方接口参数),就必须重新打包、部署对应的微服务,不仅操作繁琐,还会影响服务的正常运行,尤其在服务数量较多时,维护成本会呈指数级增长。

  2. 版本不一致:同一个应用的多个实例需要使用相同的配置版本,但手动逐一部署时,很容易出现配置遗漏、版本错乱的情况,进而导致服务运行异常,排查起来十分困难。

  3. 安全风险高:数据库密码、API 密钥等敏感配置往往以明文形式存储在配置文件中,若配置文件被提交到公开的代码仓库,很容易造成敏感信息泄露,给系统带来安全隐患。

  4. 环境切换麻烦:开发、测试、生产等不同环境的配置存在差异,分散管理时,需要为每个环境单独维护一套配置文件,切换环境时还要手动修改配置,操作繁琐且容易出错。

Spring Cloud Config 作为分布式配置管理的解决方案,其核心价值就是解决上述问题,具体优势如下:

  • 集中化配置管理:将所有微服务的配置统一存储在配置中心,无需单独维护每个服务的配置文件,修改配置时只需在配置中心操作一次,即可同步到所有相关服务。

  • 支持 Git/SVN/ 本地存储,天然带版本控制:默认集成 Git 作为配置存储后端,可利用 Git 的版本控制功能,对配置文件的修改进行追溯、回滚,同时支持多分支管理,轻松实现不同环境的配置隔离。

  • 配置动态刷新,不重启服务:支持配置的动态更新,修改配置后无需重启微服务,即可使新配置生效,大大提升了系统的灵活性和响应速度,减少服务 downtime。

  • 敏感配置加密存储:提供内置的加密解密功能,可对数据库密码、密钥等敏感信息进行加密处理,避免明文泄露,保障系统安全。

  • 多环境、多分支灵活切换:通过 Git 分支或配置参数,可轻松实现开发、测试、生产等不同环境的配置切换,无需手动修改服务配置。


二、核心概念

要熟练使用 Spring Cloud Config,首先需要掌握其三个核心组件的作用,三者协同工作,实现分布式配置的全流程管理:

  1. Config Server(配置服务端):作为整个配置中心的核心,Config Server 本质上是一个标准的 Spring Boot 应用,主要负责从 Git、SVN 或本地文件系统等后端存储中拉取配置信息,然后通过 REST API 接口将配置提供给 Config Client 调用。

  2. Config Client(配置客户端):集成在各个微服务应用中,是微服务与 Config Server 交互的桥梁。Config Client 启动时会主动连接 Config Server,根据自身的服务名、环境参数等,拉取对应的配置信息并注入到应用中,供业务逻辑使用。

  3. Git 后端(配置存储):Spring Cloud Config 默认使用 Git 作为配置存储介质,这是因为 Git 具备完善的版本控制、分支管理功能,能够方便地实现配置的追溯、回滚和多环境隔离。同时,也支持 SVN、本地文件系统等其他存储方式,可根据实际需求灵活选择。


三、搭建 Config Server(配置服务端)

Config Server 的搭建流程简单易懂,本质是创建一个 Spring Boot 应用,通过引入相关依赖、添加注解和配置,即可快速实现配置服务端的功能,具体步骤如下:

1. 新建 Spring Boot 项目

在 IDEA 或其他开发工具中,创建一个空的 Maven 模块,命名为 config\-server(模块名可自定义,但建议遵循微服务命名规范,便于后续管理)。

2. 引入核心依赖

在项目的 pom.xml 文件中,引入 Spring Cloud Config Server 的核心依赖和 Spring Boot Web 依赖,其中 Web 依赖用于提供 HTTP 接口,供客户端调用:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. 启动类开启 Config Server

在项目的启动类上添加 @EnableConfigServer 注解,该注解用于开启 Config Server 的功能,告知 Spring 容器这是一个配置服务端应用:

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

4. application.yml 配置

创建 application.yml 配置文件,配置服务端口、应用名称以及 Git 后端存储的相关信息,其中 Git 地址需替换为自己的仓库地址,具体配置说明如下:

server:
  port: 7071  # Config Server 的服务端口,可自定义,建议使用固定端口便于客户端连接
spring:
  application:
    name: config-server  # 应用名称,客户端将通过该名称识别配置服务端
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxx/config-repo  # 你的Git仓库地址,替换为实际仓库路径
          default-label: master  # Git 仓库的默认分支,通常为 master 或 main
          search-paths: config  # 配置文件所在的根目录,若配置文件直接放在仓库根目录,可省略该配置

5. Git 仓库准备

在上述配置指定的 Git 仓库中,创建 config 目录(与配置中的 search-paths 对应),并在该目录下新建两个配置文件,分别对应开发环境和生产环境:

  • config\-server\-dev\.yml:开发环境的配置文件

  • config\-server\-prod\.yml:生产环境的配置文件

以开发环境配置文件为例,添加简单的测试配置,用于后续验证服务端是否正常工作,示例配置如下:

data:
  env: config-dev  # 环境标识,用于区分不同环境的配置
  user:
    username: config-dev  # 测试用户名
    password: config-dev  # 测试密码

6. 访问规则与测试

Config Server 提供了固定的访问规则,客户端可通过这些规则获取不同环境、不同服务的配置信息,常用访问规则如下:

  • /\{application\}/\{profile\}:application 为服务名,profile 为环境标识(如 dev、prod)

  • /\{application\}\-\{profile\}\.yml:直接获取指定服务、指定环境的 yml 格式配置

  • /\{label\}/\{application\}\-\{profile\}\.yml:label 为 Git 分支名,可指定分支获取配置

启动 Config Server 应用后,可通过以下测试地址访问配置,若能正常返回配置内容,说明配置服务端搭建成功:

注意:若访问时出现“URL拼写可能存在错误,请检查”的报错,需排查服务端口是否正确、Git 仓库配置是否无误,以及服务是否正常启动。


四、搭建 Config Client(配置客户端)

Config Client 是微服务应用获取配置的载体,集成在各个微服务中,负责连接 Config Server 并拉取对应的配置信息,注入到应用中供业务使用,搭建流程如下:

1. 引入依赖

在微服务项目(此处以 product-service 为例)的 pom.xml 文件中,引入 Config Client 核心依赖和 Bootstrap 依赖。其中 Bootstrap 依赖用于加载启动时所需的外部配置,确保客户端能优先连接 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-bootstrap</artifactId>
</dependency>

2. bootstrap.yml 配置(高优先级)

bootstrap\.yml 配置文件的加载优先级高于application\.yml,专门用于配置客户端连接 Config Server 的相关信息,确保应用启动时能优先获取配置中心的配置,具体配置如下:

spring:
  profiles:
    active: dev  # 指定当前环境,对应 Git 仓库中的配置文件后缀
  application:
    name: product-service  # 客户端服务名,需与 Git 仓库中的配置文件名前缀一致
  cloud:
    config:
      uri: http://127.0.0.1:7071  # Config Server 的地址,与服务端配置的端口一致

3. 读取配置测试

创建一个测试控制器,通过 @Value 注解注入从 Config Server 拉取的配置信息,并提供接口用于测试配置是否获取成功:

@RestController
@RequestMapping("/config")
public class ConfigController {
    @Value("${data.env}")
    private String env;  // 注入配置中的环境标识

    @GetMapping("/getEnv")
    public String getEnv() {
        return "env: " + env;  // 返回获取到的环境配置
    }
}

启动客户端应用后,访问接口:http://localhost:9090/config/getEnv(9090 为客户端服务端口),若能正常返回“env: product-service-dev”,说明客户端已成功从 Config Server 拉取配置。


五、配置自动刷新(手动 + WebHook)

Spring Cloud Config 默认采用“启动时加载配置”的机制,这就导致一个问题:当 Git 仓库中的配置文件被修改后,客户端应用不会自动加载新配置,必须重启服务才能生效。为解决这个问题,Config 提供了动态刷新机制,支持手动触发和自动触发两种方式。

1. 引入 Actuator

配置动态刷新需要借助 Spring Boot Actuator 组件,该组件提供了丰富的监控和管理功能,其中 /actuator/refresh 端点可用于触发配置刷新,因此需要在客户端引入 Actuator 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. 开启刷新作用域 @RefreshScope

在需要动态刷新配置的类(如控制器、配置类)上添加 @RefreshScope 注解,该注解用于标记当前类支持配置刷新,确保修改后的配置能被重新注入:

@RefreshScope
@RestController
@RequestMapping("/config")
public class ConfigController { ... }

3. 暴露端点

在客户端的 application.yml 配置文件中,开启 Actuator 的 refresh 端点,使其能够被外部访问,同时可根据需求暴露 health、info 等其他端点:

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info  # 暴露指定端点,* 表示暴露所有端点(除 shutdown 外)

4. 手动刷新

修改 Git 仓库中的对应配置文件(如 product-service-dev.yml)后,通过 POST 请求调用客户端的 refresh 端点,即可触发配置刷新,无需重启服务:

调用成功后,再次访问客户端的测试接口,即可看到修改后的配置已生效,实现了配置的动态刷新。

5. WebHook 自动触发(免手动)

手动调用 refresh 端点虽然能实现配置刷新,但每次修改配置都需要手动操作,不够便捷。我们可以通过 Gitee、GitHub 提供的 WebHook 功能,实现配置修改后自动触发刷新:在 Gitee/GitHub 仓库的设置中配置 WebHook,指定触发地址为客户端的 refresh 端点,当 Git 仓库有代码 push 操作(即配置修改后),会自动发送 POST 请求到该端点,触发配置刷新。

注意:本地测试时,由于客户端服务运行在本地,无法被外网访问,可使用 cpolar/ngrok 等内网穿透工具,将本地服务暴露到外网,确保 WebHook 能正常调用端点。


六、Spring Cloud Bus 广播刷新(集群必备)

手动刷新和 WebHook 自动刷新仅适用于单服务实例的场景,当微服务部署为集群(多个实例)时,只刷新其中一个实例的配置,其他实例的配置仍然是旧的,需要逐一调用每个实例的 refresh 端点,操作十分繁琐。

Spring Cloud Bus 作为 Spring Cloud 生态中的消息通信组件,能够解决集群环境下的配置同步问题。它基于消息队列(RabbitMQ、Kafka 等)实现广播机制,只需触发一次刷新,即可将配置变更同步到所有集群实例,大大提升配置刷新效率。本文以 RabbitMQ 为例,讲解 Bus 广播刷新的实现方式。

1. 引入依赖

在 Config Server 和所有 Config Client 项目中,引入 Spring Cloud Bus 与 RabbitMQ 集成的依赖,确保组件能够正常通信:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2. 配置 RabbitMQ

在 Config Server 和所有 Config Client 的配置文件中,添加 RabbitMQ 的连接配置,确保 Bus 能够通过 RabbitMQ 发送广播消息:

spring:
  rabbitmq:
    host: xxx  # RabbitMQ 服务地址,本地测试可填写 127.0.0.1
    port: 5672  # RabbitMQ 默认端口
    username: xxx  # RabbitMQ 用户名
    password: xxx  # RabbitMQ 密码

3. 广播刷新接口

配置完成后,启动 Config Server、RabbitMQ 以及所有客户端实例,修改 Git 仓库中的配置文件,然后通过 POST 请求调用任意一台客户端的 /actuator/busrefresh 端点:

Bus 会通过 RabbitMQ 发送广播消息,所有客户端实例接收到消息后,会自动从 Config Server 拉取最新配置,实现所有实例的配置同步更新。

此时,WebHook 的触发地址可修改为该 busrefresh 端点,实现配置修改后,自动触发集群所有实例的配置刷新,真正实现全自动全局刷新。


七、配置加密解密(敏感信息必看)

在微服务开发中,配置文件中往往包含数据库密码、API 密钥、令牌等敏感信息,若以明文形式存储在 Git 仓库中,会存在严重的安全隐患。Spring Cloud Config 提供了内置的加密解密功能,支持对称加密和非对称加密两种方式,可根据实际安全需求选择使用。

1. 对称加密(简单常用)

对称加密是指加密密钥和解密密钥相同的加密方式,配置简单、加密解密效率高,适合大多数场景,具体实现步骤如下:

  1. 配置加密密钥:在 Config Server 的 bootstrap.yml 配置文件中,添加加密密钥(可自定义,建议使用复杂字符串,确保安全性):
encrypt:
  key: bite666  # 对称加密密钥,客户端解密时会使用相同的密钥
  1. 引入 bootstrap 依赖:若 Config Server 版本在 3.0.0 以上,bootstrap.yml 文件不会自动加载,需引入 spring-cloud-starter-bootstrap 依赖,确保加密密钥能正常生效。

  2. 加密接口(POST):启动 Config Server 后,通过 POST 请求调用加密接口,传入需要加密的敏感信息(如数据库密码),即可获取加密后的字符串:

  3. http://localhost:7071/encrypt

  4. 解密接口:通过 POST 请求调用解密接口,传入加密后的字符串,即可还原为原始敏感信息,用于验证加密是否正确:

  5. http://localhost:7071/decrypt

配置文件使用:将加密后的字符串添加到 Git 仓库的配置文件中,并在字符串前加上 \{cipher\} 标识,告知 Config Server 该内容需要解密,示例如下:

data:
  password: '{cipher}加密后的字符串&#39;  # 单引号不可省略,避免解析错误

2. 非对称加密(更安全 RSA)

非对称加密是指加密密钥和解密密钥不同的加密方式,加密密钥(公钥)可公开,解密密钥(私钥)需保密,安全性高于对称加密,适合对敏感信息安全性要求较高的场景,具体实现步骤如下:

  1. keytool 生成密钥库:使用 JDK 自带的 keytool 工具生成 RSA 密钥对,密钥对会存储在 keystore 文件中,打开 cmd 命令行,输入以下命令(可根据需求修改路径和密码):
keytool -genkeypair -keystore D:/config-server.keystore -alias config-server -keyalg RSA -keypass config -storepass config

命令说明:-genkeypair 表示生成密钥对,-keystore 指定密钥库存储路径,-alias 指定密钥别名,-keyalg 指定加密算法为 RSA,-keypass 和 -storepass 分别为密钥密码和密钥库密码。

  1. Config Server 配置:将生成的 keystore 文件复制到 Config Server 项目的 resources 目录下,然后在 bootstrap.yml 中添加非对称加密配置,同时注释掉对称加密的密钥配置:
#encrypt:
# key: bite666  # 注释对称加密密钥
encrypt:
  key-store:
    location: config-server.keystore  # keystore 文件存储路径
    alias: config-server  # 密钥别名,与生成密钥时的 alias 一致
    password: config  # 密钥库密码,与生成密钥时的 storepass 一致
    secret: config  # 密钥密码,与生成密钥时的 keypass 一致
  1. 加密 / 解密用法同对称加密,客户端无感使用:启动 Config Server 后,可通过 encrypt 和 decrypt 接口进行加密解密操作,Git 配置文件中同样需要添加 \{cipher\} 标识,客户端无需额外配置,即可自动解密获取原始敏感信息。

八、总结

Spring Cloud Config 作为微服务架构中配置管理的标准解决方案,凭借其集中化管理、版本控制、动态刷新、敏感信息加密等核心能力,有效解决了传统配置管理的诸多痛点,为微服务的稳定运行提供了保障。

其核心能力总结如下:

  • ✅ 集中管理多环境配置:将所有微服务配置统一存储,简化配置维护流程,避免配置分散导致的管理混乱。

  • ✅ Git 版本控制,可回滚:借助 Git 的版本管理功能,实现配置修改的追溯和回滚,降低配置错误带来的风险。

  • ✅ 动态刷新,不重启服务:支持手动和自动两种刷新方式,修改配置后无需重启服务,提升系统灵活性和可用性。

  • ✅ Bus 广播,集群一键刷新:结合 Spring Cloud Bus 和消息队列,实现集群环境下的配置同步,适配大规模微服务部署。

  • ✅ 对称 / 非对称加密,保护敏感信息:提供两种加密方式,可根据安全需求选择,避免敏感信息明文泄露。

总体而言,Spring Cloud Config 简单稳定、易上手,无需复杂的配置即可实现分布式配置管理,非常适合中小型微服务架构使用。对于大型微服务架构,可结合 Spring Cloud Config 与 Nacos、Apollo 等组件,进一步提升配置管理的灵活性和扩展性。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐