多环境配置混乱?外部化配置 + Config Server,彻底搞定微服务配置难题
·
微服务架构设计模式 第五部分:运维与监控篇
配置管理模式
在微服务架构中,配置管理 是运维与监控的基础。随着服务数量的增加,如果每个服务的配置都写死在本地,将导致以下问题:
- 修改配置需要重新打包 & 部署。
- 各服务配置不统一,难以集中管理。
- 不同环境(开发 / 测试 / 生产)切换不方便。
因此,需要采用 外部化配置 与 配置中心 来解决。
1 外部化配置(Externalized Configuration)
核心思想
- 应用与配置分离:配置不打包到应用内部,而是通过 环境变量、配置文件、命令行参数 等方式加载。
- 方便在不同环境部署时,复用同一个构建产物。
示例:Spring Boot 外部化配置
application.yml中定义默认配置:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pass
- 在生产环境运行时,用命令行覆盖:
java -jar app.jar --spring.datasource.url=jdbc:mysql://prod-db:3306/prod_db
- 或者用 环境变量:
export SPRING_DATASOURCE_URL=jdbc:mysql://prod-db:3306/prod_db
java -jar app.jar
➡️ 这种方式让同一个 app.jar 可以适配不同环境,避免重复构建。
2 配置中心(Configuration Center)
核心思想
- 将配置存放到一个 集中式配置服务(如 Spring Cloud Config、Consul、Nacos)。
- 微服务在启动时或运行时,从配置中心拉取配置。
- 支持 动态刷新(无需重启即可更新配置)。
示例 :Spring Cloud Config(Boot 3.2.x)
- 📂 项目结构
spring-cloud-config-demo/
├── config-server/ # 配置中心服务端
│ ├── src/main/java/...
│ └── src/main/resources/application.yml
│
├── config-client/ # 配置客户端(order-service)
│ ├── src/main/java/...
│ ├── src/main/resources/application.yml
│ └── src/main/resources/bootstrap.yml
│
└── config-repo/ # 本地配置文件目录(替代 Git)
├── order-service-dev.yml
├── order-service-prod.yml
└── order-service-test.yml
- Config Server
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
application.yml
server:
port: 8888
spring:
cloud:
config:
server:
native:
search-locations: file:../config-repo # 指向本地目录
- Config Client(order-service)
pom.xml
<dependencies>
<!-- Config Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 必须添加,才能加载 bootstrap.yml -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Actuator for refresh -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
bootstrap.yml
spring:
application:
name: order-service
cloud:
config:
uri: http://localhost:8888
profile: prod
label: main
application.yml
server:
port: 8081 # 端口,避免和 Config Server 冲突
management:
endpoints:
web:
exposure:
include: refresh
OrderController.java
@RefreshScope
@RestController
public class OrderController {
@Value("${order.discount:0}")
private int discount;
@GetMapping("/order/discount")
public String getDiscount() {
return "Current discount: " + discount + "%";
}
}
- 本地配置文件(config-repo/)
order-service-dev.yml
order:
discount: 10
order-service-prod.yml
order:
discount: 30
- 运行步骤
-
启动
config-server,监听8888端口。
验证:访问http://localhost:8888/order-service/prod可以看到配置 JSON。
-
启动
order-service。
访问:http://localhost:8081/order/discount输出:
Current discount: 30% -
修改
config-repo/order-service-prod.yml:order: discount: 50 -
.刷新配置:
curl -X POST http://localhost:8081/actuator/refresh -
再次访问:
Current discount: 50%
示例 2:Consul 配置中心
- 引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
- 配置
bootstrap.yml:
spring:
application:
name: inventory-service
cloud:
consul:
host: localhost
port: 8500
config:
enabled: true
format: yaml
- 在 Consul KV 中存储配置:
config/inventory-service/data
内容:
server:
port: 8082
spring:
datasource:
url: jdbc:mysql://prod-db:3306/inventory_db
- 应用启动时自动加载配置。
3 小结
- 外部化配置:解决应用与配置分离的问题,适合小规模项目。
- 配置中心:集中式管理,支持动态刷新,适合中大型分布式系统。
更多推荐



所有评论(0)