微服务架构设计模式 第五部分:运维与监控篇

配置管理模式

在微服务架构中,配置管理 是运维与监控的基础。随着服务数量的增加,如果每个服务的配置都写死在本地,将导致以下问题:

  • 修改配置需要重新打包 & 部署。
  • 各服务配置不统一,难以集中管理。
  • 不同环境(开发 / 测试 / 生产)切换不方便。

因此,需要采用 外部化配置配置中心 来解决。


1 外部化配置(Externalized Configuration)

核心思想
  • 应用与配置分离:配置不打包到应用内部,而是通过 环境变量、配置文件、命令行参数 等方式加载。
  • 方便在不同环境部署时,复用同一个构建产物。
示例:Spring Boot 外部化配置
  1. application.yml 中定义默认配置:
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db
    username: dev_user
    password: dev_pass
  1. 在生产环境运行时,用命令行覆盖:
java -jar app.jar --spring.datasource.url=jdbc:mysql://prod-db:3306/prod_db
  1. 或者用 环境变量
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)
  1. 📂 项目结构
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

  1. 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  # 指向本地目录

  1. 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 + "%";
    }
}

  1. 本地配置文件(config-repo/)

order-service-dev.yml

order:
  discount: 10

order-service-prod.yml

order:
  discount: 30

  1. 运行步骤
  • 启动 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 配置中心
  1. 引入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
  1. 配置 bootstrap.yml
spring:
  application:
    name: inventory-service
  cloud:
    consul:
      host: localhost
      port: 8500
      config:
        enabled: true
        format: yaml
  1. 在 Consul KV 中存储配置:
config/inventory-service/data

内容:

server:
  port: 8082
spring:
  datasource:
    url: jdbc:mysql://prod-db:3306/inventory_db
  1. 应用启动时自动加载配置。

3 小结

  • 外部化配置:解决应用与配置分离的问题,适合小规模项目。
  • 配置中心:集中式管理,支持动态刷新,适合中大型分布式系统。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐