spring整合nacos作为配置中心

一、前言

1、nacos是啥就不赘述了,由于我司项目框架还非常老旧(SSM),随着业务线的扩展和版本迭代,传统的properties配置文件管理方式已经有些无法忍受了。第一个问题是没有定义好配置文件的管理规范,第二就是改个配置文件仍然无法避免要重启服务的痛点。所以决定从这两个问题下手,来优化一下项目中properties配置文件的管理!我发现拿spring整合nacos资料好少啊,老技术都不配用它吗?^_^  而且官方文档也只是简单的demo,实际整合过程中会遇到很多问题。

二、安装nacos服务

1、咻~ 打开官方文档的传送门 GO

2、安装好服务有条件的可以配置下mysql,在nacos安装目录下的conf目录下有个application.properties,同目录下有建表脚本schema.sql 

3、其实不配置数据库也可以运行,哈哈,如果只是学习,也可以先不配置哈

4、当然是启动服务啦:

Linux/Unix/Mac

Windows

  • 单机模式    cmd startup.cmd -m standalone

三、spring项目中添加相应配置

1、添加jar包的依赖:

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-spring-context</artifactId>
    <version>0.3.6</version>
</dependency>

笔者的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配置文件又没问题;如下这几个值写死是可以正常运行的,有知道问题的同学还请指导一下哈

【不推荐】

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:nacos="http://nacos.io/schema/nacos"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://nacos.io/schema/nacos http://nacos.io/schema/nacos.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--nacos配置,这里是使用配置文件的方式,这只是其中的一种方式-->

    <!--开启注解-->
    <nacos:annotation-driven/>
    <!--指定nacos配置地址-->
    <nacos:global-properties server-addr="127.0.0.1:8848" namespace="dev"/>

    <!--指定dataId,group-id, 是否是自动刷新-->
    <nacos:property-source data-id="com.lieni.hr.remote.properties" group-id="LIENI-APP-WEB-HR" auto-refreshed="true"/>
    <nacos:property-source data-id="com.lieni.hr.param.properties" group-id="LIENI-APP-WEB-HR" auto-refreshed="true"/>
    <nacos:property-source data-id="com.lieni.hr.ext.properties" group-id="LIENI-APP-WEB-HR" auto-refreshed="true"/>

</beans>

4、如果你的spring配置文件里properties文件解析配置如下就要注意了:

	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="locations" value="classpath:properties/*.properties" />
		<property name="fileEncoding" value="UTF-8" />
	</bean>

 需要升级properties解析的配置成如下这种比较新的一种方式,没有仔细去研究区别,但是用上面那种老的方式,@NacosValue注解加载不到远程的配置!有兴趣的同学可以研究下再来分享哈

<context:property-placeholder location="classpath:properties/*.properties" file-encoding="UTF-8"/>

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早日引入到项目中并上线投入使用,实现真正的配置文件!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值