在分布式系统中,配置管理是一个关键的挑战。随着系统规模的扩大,传统的配置管理方法(如在每个应用中硬编码配置)变得不再适用。Spring Cloud Config 提供了一种集中化和外部化的配置管理解决方案,允许将配置文件存储在远程仓库(例如 Git、SVN)中,并从多个应用和环境中访问它们。
Spring Cloud Config 的关键特性包括:
Spring Cloud Config 服务器充当配置管理服务,为客户端应用提供配置属性。以下是搭建 Config 服务器的步骤:
创建一个新的 Spring Boot 应用,并添加以下依赖:
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 仓库中,创建一个新的配置文件,命名为 application.yml,或者创建环境特定的文件,如 application-dev.yml、application-prod.yml。
示例配置 (application.yml):
server:
port: 8080
message:
greeting: "Hello, World!"
现在,让创建一个 Spring Boot 客户端应用,它从 Config 服务器检索其配置。
创建另一个 Spring Boot 应用,并添加以下依赖:
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!