跳到主要内容

配置中心

问题

为什么微服务需要配置中心?Nacos Config 和 Apollo 有什么区别?

答案

为什么需要配置中心

单体应用通过 application.yml 管理配置即可,但微服务架构面临以下问题:

痛点说明
配置分散几十个服务各自维护配置文件,难以统一管理
环境管理开发/测试/生产配置不同,容易出错
动态更新修改配置需要重启服务
安全管理敏感配置(密钥、密码)散落在各处

配置中心将配置集中管理,支持动态推送版本追溯环境隔离

Nacos Config

Nacos 同时提供注册中心和配置中心:

bootstrap.yml — Nacos 配置中心
spring:
application:
name: order-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
file-extension: yaml # 配置格式
# 共享配置
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true

配置的 dataId 命名规则${spring.application.name}-${spring.profiles.active}.${file-extension}

例如:order-service-prod.yaml

动态刷新配置

动态配置读取
// 方式1:@Value + @RefreshScope
@RestController
@RefreshScope // 配置变更时刷新 Bean
public class ConfigController {

@Value("${order.max-amount:10000}")
private int maxAmount;

@GetMapping("/config")
public int getMaxAmount() {
return maxAmount;
}
}

// 方式2:@ConfigurationProperties(推荐,自动支持刷新)
@ConfigurationProperties(prefix = "order")
public class OrderProperties {
private int maxAmount = 10000;
private boolean enableDiscount = true;
// getter/setter
}
@ConfigurationProperties vs @Value

@ConfigurationProperties 在 Nacos Config 中天然支持动态刷新,无需额外加 @RefreshScope。推荐使用。

Nacos Config vs Apollo

对比Nacos ConfigApollo
出品阿里巴巴携程
定位注册中心 + 配置中心专业配置中心
配置格式properties/yaml/jsonproperties/yaml/json/xml/txt
灰度发布不支持(社区版)支持(按 IP/Label 灰度)
版本管理保留历史版本,支持回滚保留历史版本,支持回滚
权限管理命名空间级别细粒度(应用 + 环境 + 集群)
配置监听长轮询 + 推送长轮询
控制台简洁功能完善
部署单组件4 个组件(复杂)
适用中小型项目 + 已用 Nacos 注册中心大型项目、配置管理要求高

配置中心架构


常见面试问题

Q1: 配置中心的作用?

答案

配置中心将微服务的配置集中管理,核心能力包括:集中管理(一个地方管理所有服务配置)、环境隔离(dev/test/prod 分离)、动态推送(修改配置无需重启服务)、版本追溯(配置变更记录、一键回滚)、安全管理(敏感配置加密、权限控制)。

Q2: Nacos Config 的动态刷新原理?

答案

客户端通过长轮询(Long Polling)监听配置变更。客户端发起请求,如果配置无变化,服务端 hold 住连接(默认 30s),配置变更时立即返回。客户端收到变更后更新本地缓存,同时触发 @RefreshScope Bean 的重建或 @ConfigurationProperties 的属性重新绑定。

Q3: bootstrap.yml 和 application.yml 的区别?

答案

  • bootstrap.yml:Spring Cloud 引入的,在 application.yml 之前加载。用于配置中心地址等启动阶段必须的配置
  • application.yml:Spring Boot 的标准配置文件

从 Spring Cloud 2021.x 开始,需要引入 spring-cloud-starter-bootstrap 才能使用 bootstrap.yml,或者改用 spring.config.import 方式。

Q4: 配置中心的高可用如何保证?

答案

  1. 服务端集群:Nacos/Apollo 部署多节点集群
  2. 客户端缓存:配置中心不可用时从本地缓存文件读取
  3. 数据库:配置持久化到 MySQL 等数据库,避免单点故障
  4. 快照机制:Nacos 客户端会在本地保存配置快照

相关链接