在微服务架构中,配置管理一直是个让人头疼的问题。传统做法是把配置写在application.properties或application.yml里,每次修改都要重新打包发布。我经历过凌晨三点被叫起来改配置的日子,这种痛苦促使我开始寻找更好的解决方案。
Nacos配置中心就像个中央控制台,所有服务的配置都集中存放。最让我惊喜的是它的"热更新"能力——修改配置后,服务不用重启就能立即生效。去年我们有个促销活动,流量突然暴涨,需要紧急调整线程池参数。靠着Nacos的热更新,我们5分钟就完成了全集群配置调整,避免了服务雪崩。
推荐使用Spring Initializr(start.spring.io)生成项目骨架。我习惯用Gradle构建,依赖更简洁:
groovy复制dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2022.0.0.0'
}
注意:Spring Cloud Alibaba版本需要与Spring Boot版本匹配。我们用的是Spring Boot 3.1.x,对应2022.0.x版本。版本不匹配会导致各种奇怪的异常。
bootstrap.yml(必须用这个文件名)需要配置几个核心参数:
yaml复制spring:
application:
name: order-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev-env
group: DEFAULT_GROUP
server-addr:我建议用域名而不是IP,方便后期迁移namespace:像我们这样多环境部署时,用namespace隔离配置最安全group:区分不同业务线配置,比如支付业务和订单业务可以用不同group在需要动态刷新的字段上添加@RefreshScope注解:
java复制@RestController
@RefreshScope
public class ConfigController {
@Value("${order.discount-rate:0.9}")
private Double discountRate;
@GetMapping("/price")
public String calculate() {
return "当前折扣率:" + discountRate;
}
}
这个注解的原理很有意思:它创建了一个特殊的代理对象,当Nacos配置变更时,Spring会销毁这个bean并重新初始化,相当于给这个Controller做了个"局部重启"。
有些场景需要更精确的控制,可以用ConfigService直接监听变更:
java复制@Autowired
private ConfigurableApplicationContext context;
@PostConstruct
public void init() {
ConfigService configService = NacosFactory.createConfigService("127.0.0.1:8848");
configService.addListener("order-service", "DEFAULT_GROUP", new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
// 只刷新特定配置
context.publishEvent(new EnvironmentChangeEvent(Collections.singleton("special.config")));
}
// ...省略其他方法
});
}
我们在Nacos上实践出一套配置管理规范:
nacos.history表实现配置回滚当配置项超过500条时,建议:
nacos.config.share共享配置properties复制# 调整长轮询超时为5秒
spring.cloud.nacos.config.long-poll-timeout=5000
curl http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=order-service是否能获取配置Refresh keys changed: [xxx]日志/actuator/env端点确认实际生效配置我们发现长时间运行的@RefreshScope bean可能引起内存泄漏。解决方案:
Environment直接获取通过Nacos的beta配置功能,我们可以实现配置的灰度发布:
java复制// 在启动参数中添加灰度标识
-Dnacos.client.tracker=gray_version_1
这个功能在我们做数据库迁移时特别有用,可以逐步切换数据源配置而不影响全部流量。