微服务配置中心——以Nacos为例
一、引言
在微服务架构中,配置管理至关重要。随着服务数量的增加,分散的配置文件难以维护且容易出错。配置中心通过集中管理和动态更新配置信息,解决了这些问题,并在多环境(如开发、测试、生产)和大规模系统中提供了环境隔离的能力。它确保了各服务实例使用正确的配置,并能实时响应变更。
二、常见的配置中心中间件
1. Apollo
- 开发者:由携程开发并开源。
- 功能特性:
- 强大的配置管理:支持多环境(如开发、测试、生产)和多集群的配置发布与管理。
- 动态配置更新:能够实时推送配置变更到应用,无需重启服务。
- 历史版本管理:提供配置的历史版本回滚功能,便于问题排查和恢复。
- 权限控制:支持细粒度的权限管理,确保不同用户对配置的访问和修改权限。
- 适用场景:适用于对配置管理有较高要求的企业级应用。
2. Nacos
- 开发者:由阿里巴巴开发并开源。
- 功能特性:
- 服务注册与发现:不仅是一个配置中心,还支持服务的注册与发现。
- 配置管理:支持动态配置更新和多环境隔离(通过命名空间和分组)。
- 高可用性:支持集群部署,确保配置中心本身的稳定性和可靠性。
- 简单易用:与Spring Cloud Alibaba等框架无缝集成,易于上手和使用。
- 适用场景:适合需要一体化解决方案的微服务架构,尤其在已经选择了Nacos作为服务注册中心的情况下。
尽管Apollo在配置管理方面功能强大且提供了丰富的特性,但由于我们已经在项目中选择了Nacos作为服务注册中心,为了保持技术栈的一致性和简化维护成本,我们也选择Nacos作为配置中心。这种选择不仅能减少引入额外工具带来的复杂性,还能充分利用Nacos提供的统一管理界面和无缝集成的优势,确保整个微服务架构的高效运行。
三、如何启动 Nacos 配置管理
1. 配置 bootstrap.yml 文件
bootstrap.yml 是 Spring Cloud 应用启动时优先加载的配置文件,可用于从配置中心拉取远程配置。以下是 bootstrap.yml 中关于nacos配置中心的关键配置:
spring:
profiles:
active: dev
application:
name: service-name # 微服务名:标识具体的微服务
cloud:
nacos:
server-addr: ${NACOS_SERVER_ADDR:localhost:8848} # Nacos 配置中心地址
config:
file-extension: yaml # 扩展名:指定配置文件格式(如 .yml 或 .properties)
namespace: dev-namespace-id # 命名空间:用于环境隔离(如开发、测试、生产)
group: DEFAULT_GROUP # 分组:用于逻辑隔离
关键字段说明
-
微服务名(
spring.application.name)
标识当前微服务的名称,与 Nacos 中的配置文件命名保持一致。 -
微服务环境名(
${spring.application.name}-${profile})
标识当前微服务的环境名称,与 Nacos 中的环境配置文件命名保持一致。 -
扩展名(
file-extension)
指定配置文件的格式,支持.yaml和.properties。 -
额外配置(
namespace和group)namespace:实现环境隔离,例如开发环境使用dev-namespace-id,生产环境使用prod-namespace-id。group:实现逻辑分组,默认为DEFAULT_GROUP,也可以根据业务需求自定义分组。
2. 使用共享配置
在实际项目中,某些配置可能需要在多个微服务之间共享(如数据库连接信息、第三方API密钥等)。Nacos 支持通过共享配置的方式实现这一点。
配置方式
在 bootstrap.yml 中添加 shared-configs 字段,指定共享配置的名称和分组:
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common-config.yaml # 共享配置文件名
group: SHARED_GROUP # 共享配置所属分组
refresh: true # 是否支持动态刷新
3. 创建远程配置文件
在 Nacos 控制台中创建对应的配置文件,命名规则如下:
- 微服务专属配置文件:
${spring.application.name}.${file-extension},例如service-name.yaml。 - 环境专属配置文件:
${spring.application.name}-${profile}.${file-extension},例如service-name-dev.yaml。 - 共享配置文件:
common-config.yaml。
示例配置
假设我们有一个微服务名为 user-service,以下是其对应的配置文件内容:
-
user-service.yaml(全局通用配置)app: name: User Service -
user-service-dev.yaml(开发环境配置)spring: datasource: url: jdbc:mysql://localhost:3306/user_dev username: root password: root -
common-config.yaml(共享配置)third-party: api-key: abc123
四、如何启动 Nacos 热更新
为了实现配置的动态刷新,可以在代码中使用以下方式读取配置:
方式一:使用 @Value 注解
@RestController
@RefreshScope // 支持动态刷新
public class ConfigController {
@Value("${app.name}")
private String appName;
@GetMapping("/appName")
public String getAppName() {
return appName;
}
}
方式二:绑定 Bean
@Component
@ConfigurationProperties(prefix = "spring.datasource")
@RefreshScope // 支持动态刷新
public class DataSourceProperties {
private String url;
private String username;
private String password;
// Getters and Setters
}
五、配置文件加载顺序
按如下顺序加载:
Bootstrap 配置:(本地配置)
-
bootstrap.yaml
-
bootstrap-{profile}.yaml(如果有)
Application 配置 :(本地配置)
-
application.yaml
-
application-{profile}.yaml(如果有)
nacos配置:
-
扩展配置文件(如果有)
-
共享配置文件(如果有)
-
{spring.application.name}.yaml
-
{spring.application.name}-{profile}.yaml (如果有)
需要注意的是,实际的加载细节可能会因Spring框架版本、Nacos客户端版本以及具体配置而有所不同。

浙公网安备 33010602011771号