Nacos配置与踩坑总结

核心问题:

1.不同域名,走不同配置

2.开关、配置、JSON三种配置类型

解决方案

设计思路:

1.分三大类:

业务配置、域名配置、域名自定义配置

业务配置:用于配置所有业务中的配置信息

针对业务情况,分为三类业务配置:开关配置、基础配置、数据配置(黑/白名单) 每种配置都为单独的nacos

针对大促情况:将三类配置各自再两个环境配置,共三个环境配置,方便在不同配置环境中自由切换

域名配置:用于配置域名走哪个配置环境,实现出现问题快速将某域名切换到不同环境

域名自定义配置:用于对某单个对于的某项配置,单独配置,比如某域名的某个功能需要暂时降级,但其他的配置环境又在占用中,则需要对这个域名的这个降级开关进行开启。(暂时不实现)

Nacos配置:

通过nacos的nameSpace区分生产和测试环境

生产环境nameSapce:1

测试环境nameSpace:2

统一的Group ID:G

业务配置(business):

正常环境(normal):

开关配置:Data ID:open

基础配置:Data ID:base

数据配置:Dara ID:data

限流环境(abnormal):

开关配置:Data ID:open

基础配置:Data ID:base

数据配置:Dara ID:data

备用环境(spare):

开关配置:Data ID:open

基础配置:Data ID:base

数据配置:Dara ID:data

域名路由配置(domainRoute):

nacos配置:Data ID:route

域名自定义配置(domainCustom):

nacos配置:Data ID:custom

Nacos配置使用时遇到的一些问题总结:

参考文档:

Nacos Spring 快速开始

nacos-spring-boot配置中心使用手册 - 简书

1.多DataId配置

我们采用的是@NacosPropertySource方式配置单个DataId,但此时多DataId如何配置?

可以采用@NacosPropertySources注解中配置多个@NacosPropertySource的方式,来实现多个DataId配置

如下方式:

@NacosPropertySources(

        {

                //业务-正常环境
               @NacosPropertySource(dataId = "base", groupId = "G", autoRefreshed = true),
               //域名路由
               @NacosPropertySource(dataId = "route", groupId = "G", autoRefreshed = true),
               //域名自定义环境
               @NacosPropertySource(dataId = "custom", groupId = "G", autoRefreshed = true),
       })

2.如何区分生产和测试环境

1.Nacos的nameSpace一般推荐用于区分线上/线下环境

2.在项目中,配置两个Nacos的Config类,其中nameSpace代表不同的环境

3.在测试和生产的利用@Profile注解区分测试/生产环境,启动对应的Nacos配置类

3.多DataId、相同key属性,如何取值(遇到的核心问题)

问题描述:

1.我们常用@NacosValue的方式获取Nacos中的值

⚠️但有个问题!@NacosValue不能区分DataId,也就是说,当用@NacosValue方式获取的key属性只能在所有接入的多DataId中是唯一的属性名,不然会造成取值错误

2.但在我们目前的需求中,业务配置有三组环境(正常、限流、备用),每组环境的key属性都一致,只是值不同

所以如果仍用@NacosValue方式取获取是行不通的

问题解决:

1.所以Nacos提供了@NacosConfigurationProperties注解,是不是很熟悉?对的,和@ConfigurationProperties是一样的道理。定义并接收指定配置中的属性值

2.@NacosConfigurationProperties支持GroupId、DataId、autoRefreshed、prefix等属性配置

使用方式如下:

@NacosConfigurationProperties(prefix = "abnormal.base", dataId = "base", groupId = "G", autoRefreshed = true)

然后在类中,定义和Nacos配置的key一样的属性名,就可以了!

⚠️这种方式支持String,Int等基本类型,像List,Map,Object等特殊类型,是不支持的!需要用string接收,然后在对应set方法中重新处理一下

Nacos配置使用时遇到的一些问题总结

1.多DataId配置

我们采用的是@NacosValue方式配置单个DataId,但此时多DataId如何配置?

可以采用@NacosPropertySources注解中配置多个@NacosPropertySource的方式,来实现多个DataId配置

如下方式:

@NacosPropertySources(

       {

               //业务-正常环境
               @NacosPropertySource(dataId = "base", groupId = "G", autoRefreshed = true),
               //域名路由
               @NacosPropertySource(dataId = "route", groupId = "G", autoRefreshed = true),
               //域名自定义环境
               @NacosPropertySource(dataId = "custom", groupId = "G", autoRefreshed = true),
       })

2.如何区分生产和测试环境

1.Nacos的nameSpace一般推荐用于区分线上/线下环境

2.在项目中,配置两个Nacos的Config类,其中nameSpace代表不同的环境

3.在测试和生产的利用@Profile注解区分测试/生产环境,启动对应的Nacos配置类

3.多DataId、相同key属性,如何取值(遇到的核心问题)

问题描述:

1.我们常用@NacosValue的方式获取Nacos中的值

⚠️但有个问题!@NacosValue不能区分DataId,也就是说,当用@NacosValue方式获取的key属性只能在所有接入的多DataId中是唯一的属性名,不然会造成取值错误

2.但在我们目前的需求中,业务配置有三组环境(正常、限流、备用),每组环境的key属性都一致,只是值不同

所以如果仍用@NacosValue方式取获取是行不通的

问题解决:

1.所以Nacos提供了@NacosConfigurationProperties注解,是不是很熟悉?对的,和@ConfigurationProperties是一样的道理。定义并接收指定配置中的属性值

2.@NacosConfigurationProperties支持GroupId、DataId、autoRefreshed、prefix等属性配置

使用方式如下:

@NacosConfigurationProperties(prefix = "abnormal.base", dataId = "base", groupId = "G", autoRefreshed = true)

然后在类中,定义和Nacos配置的key一样的属性名,就可以了!

⚠️这种方式支持String,Int等基本类型,像List,Map,Object等特殊类型,是不支持的!需要用string接收,然后在对应set方法中重新处理一下

4.如果在域名配置的dataId中,配置了多个相同的域名,哪个会生效?

问题:如上图,在三个环境的参数中,都配置了"p54"这样的一个域名,那最终哪个会生效呢?

答案是:【spareOpen】

原因:
为什么?我们这边域名配置中,使用的是@NacosValue来自动更新的,在看了nacos源码后,我们即可发现,nacos是顺序读取我们在dataId中配置的参数,然后依次更新的,

com.alibaba.nacos.spring.context.annotation.config.NacosValueAnnotationBeanPostProcessor#onApplicationEvent

所以最后生效的,就是最后更新的 【spareOpen】

参考文档:

NacosValue 注解 - 偶尔发呆 - 博客园

Nacos Spring 快速开始

nacos-spring-boot配置中心使用手册 - 简书

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值