在做java spring项目中,基本上用到的配置中心都是nacos,很方便的管理配置信息。在做配置管理的过程中,我们希望的是在配置修改的时候,java应用就能读取到最新的配置,而不需要重启应用使配置生效。
怎样才能做到不重启应用就能使nacos中的配置发布后生效呢,下面介绍两种方法,这两种方式都是通过java代码来配置读取最新信息的。
假设nacos配置如下,我们通过配置动态获取test.name值。
通过@RefreshScope注解的方式
@RestController@RequestMapping("/")@RefreshScope // 添加这个注解后,请求/testRefreshScope接口就可以动态获取name信息了public class TestController { // 对应nacos配置里面的值 @Value("${test.name}") private String name; @PostMapping("/testRefreshScope") public void testRefreshScope() { System.out.println("name=" + name); }}
第一种方式实现了动态读取配置,但是如果是在多个类中使用的话,就需要写好多@RefreshScope注解,然后定义好多@Value注解的成员变量,非常的不方便,下面介绍第二种方式。
通过@ConfigurationProperties注解的方式
先定义一个类,这个类的成员变量和nacos配置里面对应
@Component // 加入到容器管理@Data@ConfigurationProperties(prefix = "test") // 这个注解就是自动刷新配置的,prefix对应的是nacos里面的test,如果test下面多层,那么可以通过test.xx.xx这种方式来处理public class TestConfig { private String name; // 这个对应配置test下面的name // 如果nacos有其他属性就继续定义成员变量 // private String xxxx;}
上面的TestConfig类,通过@Component加入到spring容器管理中了,那么其他地方需要使用的话,就可以通过@Resource或者@Autowired注入了,后面访问就和正常的类访问属性一样了。
@RestController@RequestMapping("/")public class TestController { @Resource private TestConfig testConfig; @PostMapping("/testConfigurationProperties") public void testConfigurationProperties() { // testConfig.getName() 每次都能获取到nacos最新的配置了 System.out.println("name=" + testConfig.getName()); }}
至此,两种方式介绍完毕,个人认为,如果配置较少,调用地方也比较少,使用第一种比较方便,少写一个类。如果配置信息比较多,使用的地方也多,那么将配置写入一个类中,然后调用类里面的属性,那么第二种就比较合适,大家可以根据自身情况来选择。