在这里想描述的两个事儿
1:springboot和spring cloud配置动态获取配置信息
2:更新nacos配置,java监听获取更新的配置(A项目的配置文件放在nacos,先要修改配置文件,相当于做了一个开关,从而根据动态监听达到处理对应的业务)
一:springboot和cloud动态更新配置信息
1)spring boot
1、使用 @NacosPropertySource
加载 dataId
为 example
的配置源,并开启自动更新
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
2、通过 Nacos 的 @NacosValue
注解设置属性值
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
3、启动 NacosConfigApplication
,调用 curl http://localhost:8080/config/get
,返回内容是 false
4
、修改后的变量进行再次访问连接,此时状态已返回true
2)spring cloud
1、通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
2、首先通过调用 Nacos Open API 向 Nacos Server 发布配置:dataId 为example.properties
,内容为useLocalCache=true
3、
运行 NacosConfigApplication
,调用 curl http://localhost:8080/config/get
,返回内容是 true
二:写这个动态监听有两种方法(这里推荐使用第一种),
1)得新起一个Bean,extends一下AbstractConfigChangeListener,之后的东西就如下代码,还没来的及做深入的研究,后续待补充
2)这个是参考别人的一个博客,可以看如下连接https://segmentfault.com/a/1190000020723172?utm_source=tag-newest
参数说明:check是配置文件中定义的一个属性,而true则是check的值
/**
* @author Zhang Lei
*/
@Component(value = "nacosConfigListener")
public class NacosConfigListener extends AbstractConfigChangeListener {
private static final Logger logger = LoggerFactory.getLogger(NacosConfigListener.class);
@Resource
private CommonService commonService;
@Override
public void receiveConfigChange(ConfigChangeEvent event) {
ConfigChangeItem check = event.getChangeItem("check");
if (check != null && "true".equalsIgnoreCase(check.getNewValue())) {
System.out.println("这是需要处理的业务");
}
}
}
自己总结了一点还有待完善,有啥需要修改的地方可以指正出来,附nacos Api地址