1、nacos是啥就不赘述了,由于我司项目框架还非常老旧(SSM),随着业务线的扩展和版本迭代,传统的properties配置文件管理方式已经有些无法忍受了。第一个问题是没有定义好配置文件的管理规范,第二就是改个配置文件仍然无法避免要重启服务的痛点。所以决定从这两个问题下手,来优化一下项目中properties配置文件的管理!我发现拿spring整合nacos资料好少啊,老技术都不配用它吗?^_^ 而且官方文档也只是简单的demo,实际整合过程中会遇到很多问题。
1、咻~ 打开官方文档的传送门 GO
2、安装好服务有条件的可以配置下mysql,在nacos安装目录下的conf目录下有个application.properties,同目录下有建表脚本schema.sql
3、其实不配置数据库也可以运行,哈哈,如果只是学习,也可以先不配置哈
4、当然是启动服务啦:
1、添加jar包的依赖:
com.alibaba.nacos
nacos-spring-context
0.3.6
笔者的spring版本是4.2.8哈,仅供参考。然后这里说下两种配置方式,XML配置和java代码注解配置方式。
2、推荐使用注解配置的方式,一是因为这是当下主流,是springboot推荐的做法,二是因为XML有点问题,我没搞定,哈哈哈~
这里使用namespace来做环境的区分,group.id用的是项目名,用来区分配置文件所属项目,然后data.id是按照官方推荐的方式命名,按功能分出来几个文件。这么优化后,项目中只需要分不同环境配置如下这个文件即可。每个propeties文件建议本地还是配置一份,线上使用nacos记得配置数据库持久化。
nacos.server-addr=127.0.0.1:8848
nacos.namespace=dev
nacos.group.id=LIENI-APP-WEB-HR
nacos.remote.data.id=com.lieni.hr.remote.properties
nacos.param.data.id=com.lieni.hr.param.properties
nacos.ext.data.id=com.lieni.hr.ext.properties
下面是java代码的配置,@PropertySource指定下nacos相关配置,注解里面才能用“${}”引用变量,多个配置文件就配置多个@NacosProertySource就行。这里需要注意一个问题,如果你要在controller里面使用nacos的注解来加载配置,需要让springmvc容器扫描到如下这个配置类哦~ 否则就不好使,顺便提下另一个问题,如果有配置监听器去加载spring配置文件,也就是有两个容器,也会遇到同样的问题,如果是那样,即使你的子容器也扫描到这个类,会出现@NacosValue不能自动刷新配置值的问题。建议直接去掉监听器只保留springmvc子容器,也就是DispatcherServlet。
【推荐】
@Configuration
@PropertySource("classpath:properties/nacos.properties")
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "${nacos.server-addr}", namespace = "${nacos.namespace}"))
@NacosPropertySource(dataId = "${nacos.remote.data.id}", groupId = "${nacos.group.id}", autoRefreshed = true, first = true)
@NacosPropertySource(dataId = "${nacos.param.data.id}", groupId = "${nacos.group.id}", autoRefreshed = true, first = true)
@NacosPropertySource(dataId = "${nacos.ext.data.id}", groupId = "${nacos.group.id}", autoRefreshed = true, first = true)
public class NacosConfiguration {
}
3、XML配置方式也简单分享下,这里遇到个问题,就是XML配置中使用${}读取nacos的配置失败,别的XML配置文件又没问题;如下这几个值写死是可以正常运行的,有知道问题的同学还请指导一下哈
【不推荐】
4、如果你的spring配置文件里properties文件解析配置如下就要注意了:
需要升级properties解析的配置成如下这种比较新的一种方式,没有仔细去研究区别,但是用上面那种老的方式,@NacosValue注解加载不到远程的配置!有兴趣的同学可以研究下再来分享哈
5、使用@NacosValue注解读取配置文件啦
@Controller
@RequestMapping("test")
public class AccountController extends BaseController {
@NacosValue(value = "${nacos.test:not found}", autoRefreshed = true)
private String value;
@NacosValue(value = "${nacos.test2:not found}", autoRefreshed = true)
private String value2;
@NacosValue(value = "${basic-api-auth.remote.url:not found url}", autoRefreshed = true)
private String value3;
@Value("${interviewer.welcome.message}")
private String message;
@Autowired
private IAccountService accountService;
@RequestMapping("hi")
@ResponseBody
public String test() {
return "Hi, I'm test, I'm OK. nacos.test=" + value;
}
@RequestMapping("v3/hi")
@ResponseBody
public String hiV3() {
return message;
}
@RequestMapping("2")
@ResponseBody
public String test2() {
return value2;
}
看效果截图:
6、最后贴上nacos后台的配置截图验证一下,哦对了,注意下nacos的管理后台地址是 127.0.0.1:8848/nacos ,nacos服务这里直接装的最新的2.0版本。
1、折腾半天,就为了把一项新技术引到老项目里面,这种操作真的费劲;中途我换springboot去配置nacos,非常顺利,新框架搭配新技术才是正道啊!
2、同时也总结下主要的一些坑吧,整合nacos需要整理清除它与spring容器的关系,而且要注意同时要兼容本地的@Value注解读取本地的properties配置文件。
3、先到这吧,希望能将nacos早日引入到项目中并上线投入使用,实现真正的配置文件!