Spring Cloud Config 分布式配置管理

在分布式系统中,配置管理是一个关键的挑战。随着系统规模的扩大,传统的配置管理方法(如在每个应用中硬编码配置)变得不再适用。Spring Cloud Config 提供了一种集中化和外部化的配置管理解决方案,允许将配置文件存储在远程仓库(例如 Git、SVN)中,并从多个应用和环境中访问它们。

关键特性

Spring Cloud Config 的关键特性包括:

  • 集中化的配置管理
  • 动态属性更改,无需重新部署应用
  • 支持多种后端仓库(Git、SVN、本地文件系统)
  • 敏感属性的加密和解密

搭建 Spring Cloud Config 服务器

Spring Cloud Config 服务器充当配置管理服务,为客户端应用提供配置属性。以下是搭建 Config 服务器的步骤:

创建一个新的 Spring Boot 应用,并添加以下依赖:

  • Spring Cloud Config Server
  • Spring Boot DevTools
  • Spring Web

Maven 配置 (pom.xml):

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

在主应用类中,使用 @EnableConfigServer 注解启用配置服务器。

package com.example.configserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }

在 application.yml 文件中,配置 Config 服务器将使用的 Git 仓库。

server: port: 8888 spring: cloud: config: server: git: uri: https://github.com/your-username/config-repo clone-on-start: true

在这里,将 https://github.com/your-username/config-repo 替换为自己的 Git 仓库 URL,其中包含配置文件。

在 Git 仓库中创建配置文件

在 Git 仓库中,创建一个新的配置文件,命名为 application.yml,或者创建环境特定的文件,如 application-dev.yml、application-prod.yml。

示例配置 (application.yml):

server: port: 8080 message: greeting: "Hello, World!"

搭建 Spring Cloud Config 客户端

现在,让创建一个 Spring Boot 客户端应用,它从 Config 服务器检索其配置。

创建另一个 Spring Boot 应用,并添加以下依赖:

  • Spring Cloud Config Client
  • Spring Boot DevTools
  • Spring Web

Maven 配置 (pom.xml):

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

在 bootstrap.yml 文件中,配置 Config 客户端指向 Config 服务器。

spring: application: name: demo-service cloud: config: uri: http://localhost:8888

创建一个简单的 REST 控制器,以演示从 Config 服务器访问属性。

package com.example.configclient; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MessageController { @Value("${message.greeting}") private String greetingMessage; @GetMapping("/greeting") public String getGreetingMessage() { return greetingMessage; } }

运行演示

启动 Config 服务器:运行 ConfigServerApplication 类。

启动 Config 客户端:运行客户端应用。

一旦两个应用都在运行,可以通过客户端应用访问配置属性。

访问配置属性:

打开浏览器,导航到 http://localhost:8080/greeting。

预期输出:

Hello, World!

动态配置更新

Spring Cloud Config 的一个强大特性是能够在不重启应用的情况下动态更新配置。让看看这是如何工作的。

更改 application.yml 文件中的 message.greeting 属性为:

message: greeting: "Hello, Spring Cloud Config!"

提交并推送更改到 Git 仓库。

使用 Spring Boot Actuator 的 /actuator/refresh 端点,在不重启应用的情况下刷新配置属性。

启用 Actuator:

在客户端应用中添加以下依赖和配置。

Maven 依赖:

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

application.yml:

management: endpoints: web: exposure: include: refresh

触发刷新:

发送 POST 请求到 http://localhost:8080/actuator/refresh。

重新检查问候消息:

刷新 http://localhost:8080/greeting 端点。应该看到:

Hello, Spring Cloud Config!
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485