AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
上一节给大家介绍了nacos客户端(也就是我们的业务微服务)在启动的时候,怎样实现配置从nacos配置中心加载。本节为大家介绍一下当配置发生变更的时候,如何动态的通知并刷新服务的配置数据。 > 本文档之前已经为大家介绍过apollo、Spring Cloud config,其实nacos的客户端代码实现方法,并没有和之前的二者有很大的差异。所以本节内容就不做过多的细节说明,可以参考《apollo实例配置热更新》和《config 客户端配置刷新》进行学习。 ## 一、若干已经讲过的问题(回顾): * 哪些配置可以刷新,那些配置不能刷新?参考《apollo实例配置热更新》和《config 客户端配置刷新》进行学习 * 支持使用哪些Spring 注解来实现配置的动态刷新?`@Value`和`@ConfigurationProperties` * 是不是我们讲过的所有配置管理中心平台下,`@Value`和`@ConfigurationProperties`都需要配合`@RefreshScope`注解才能实现动态刷新?大体上是的,但有例外。 | 配置管理平台 | Value | ConfigurationProperties | | --- | --- | --- | | nacos | 需要结合RefreshScope才能生效 | 需要结合RefreshScope才能生效 | | apollo | 不需要结合RefreshScope就能生效(例外) | 需要结合RefreshScope才能生效 | | spring cloud config | 需要结合RefreshScope才能生效 | 需要结合RefreshScope才能生效 | 下面两个例子都可以将nacos配置"user.init.password"键对应的值热更新到password和defaultPwd对象上。这两个注解需要结合`@RefreshScope`注解使用才能使配置动态更新生效。 ~~~ @RefreshScope //这里需要加上RefreshScope注解 @ConfigurationProperties(prefix = "user.init") public class User{ private String password; } ~~~ 下文中会针对这种@Value注解的方法为例进行讲解。 ~~~ @RefreshScope //这里需要加上RefreshScope注解 public class Xxxxx{ @Value("${user.init.password}") private String defaultPwd; } ~~~ ## 二、使微服务客户端具备配置刷新能力 ### 2.1. 业务回顾 我们在《第一个微服务》调用章节,就介绍了aservice-rbac下面的服务:为用户重置密码的接口服务“/sysuser/pwd/reset”,前面的章节我们多次用到。其中红色的部分:从数据库的sys\_config表里面加载param\_key="user.init.password"对应的param\_value(也就是用户的默认密码)。 ![](https://img.kancloud.cn/c2/88/c2880cb8eeae62e49570f3c5822f8548_1250x457.png) 现在我们有了nacos服务配置中心,这个sys\_config数据库表我们就完全可以放弃了。我们把配置写在nacos配置中心里面,进行集中管理。 ### 2.2.nacos发布配置 添加一个配置:user.init.password=12345678 ![](https://img.kancloud.cn/cf/30/cf300d5e8d0aa5e683ff4b248100268c_650x518.png) ### 2.3.修改代码实现配置动态刷新 在需要进行配置刷新的类上使用`@RefreshScope`,user.init.password对应的配置对象defaultPwd的值就**具备了刷新的能力**。 ~~~ @Service @RefreshScope public class SysuserService { @Value("${user.init.password}") private String defaultPwd; public void pwdreset(Integer userId){ if(userId == null){ throw new CustomException(CustomExceptionType.USER_INPUT_ERROR, "重置密码必须带主键"); }else{ SysUser sysUser = sysUserMapper.selectByPrimaryKey(userId); //String defaultPwd = dbLoadSysConfig.getConfigItem("user.init.password"); sysUser.setPassword(passwordEncoder.encode(defaultPwd)); sysUserMapper.updateByPrimaryKeySelective(sysUser); smsService.send(sysUser.getPhone(),"您好,管理员已经将您的密码重置为" + defaultPwd); } } } ~~~ ## 三、配置动态刷新测试 使用postman向“/sysuser/pwd/reset”接口发送请求 ![](https://img.kancloud.cn/12/11/1211d4a0d637c2a588aa3d67c33d3a10_1091x247.png) 端点如图所示 ![](https://img.kancloud.cn/5f/ce/5fce6b5023812bc0354cabbc37a551b6_1264x468.png) 去nacos配置中心修改`user.init.password`的值为Abcd1234,再次通过postman发送请求 ![](https://img.kancloud.cn/3e/81/3e815871ae000563342815a669de6066_1175x489.png) 在以上的过程中,我们没有重启服务,就实现了配置在nacos中修改之后,服务自动更新配置所对应的对象的数据。