核心问题:
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-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】
参考文档: