481 字
约 1 分钟
20
Nacos 如何动态加载 Bean?
Nacos 如何动态加载 Bean?
在实际项目中,我们有时候希望:
不重启服务,只修改 Nacos 配置,就能切换 Spring 中 Bean 的实现。
例如系统告警支持两种方式:
- 短信告警
- 邮件告警
我们希望在 Nacos 中修改配置,就能动态切换告警方式。
一、基本思路
假设定义一个统一的告警接口,然后提供两个实现:
SmsAlarmHelper
负责短信告警。
MailAlarmHelper
负责邮件告警。
Spring 在创建 Bean 时,根据 Nacos 中的配置决定使用哪个实现。
例如:
alarm.type=sms
使用短信告警。
修改为:
alarm.type=mail
则切换成邮件告警。
二、关键是 @RefreshScope
普通 Bean 创建之后,会一直存在于 Spring 容器中。
即使 Nacos 配置发生变化,原来的 Bean 也不会自动重新创建。
这时候就需要 Spring Cloud 提供的:
@RefreshScope
它的作用可以简单理解为:
当配置中心发生变化时,让相关 Bean 重新加载最新配置。
所以整个过程就是:
Nacos 配置修改 → 服务监听到配置变化 → RefreshScope 刷新 → Bean 重新创建 → 使用新的实现类。
三、最终效果
一开始 Nacos 配置为:
alarm.type=sms
系统使用短信告警。
然后直接在 Nacos 后台改成:
alarm.type=mail
不需要重新启动项目。
再次调用业务时,Spring 容器中的实现已经切换成邮件告警。
这就是利用 Nacos + RefreshScope 实现动态加载 Bean。
四、总结
Nacos 本身负责的是动态配置。
真正负责 Bean 刷新的,是 Spring Cloud 的 @RefreshScope。
所以记住一句话:
Nacos 负责通知配置变了,RefreshScope 负责让 Bean 使用新的配置重新加载。
评论
0 条
还没有评论,先写一条吧。