Java - 利用Nacos做一个动态开关配置功能

news/2024/4/28 0:31:41/文章来源:https://blog.csdn.net/Zong_0915/article/details/128054343

Java - 利用Nacos做一个动态开关配置功能

  • 前言
  • 一. Nacos配置类编写
  • 二. 测试
  • 三. 展望

前言

我公司里有一个Config配置功能(我相信这是很普遍的一个功能)。简单来说就是:

  • 将相关的键值对放到这个Config配置系统里面。
  • 代码里通过这个Config配置系统的相关API,根据对应的Key拿到配置的值。在进行逻辑操作。

那么这个有啥好处呢?

  1. 我们将我们的代码发布到生产环境,往往是需要一定的流程的。可能耗时比较长。而Config配置系统的发布则非常简单。页面上点一下即可。
  2. 假如我们有一个场景:一个新老接口的替换。那么我们可以在代码里面加一个“开关”,如果为T,走新接口,如果为F,则走老接口。那么当生产上新接口出现问题的时候,我们就可以通过改变Config配置系统中的开关值为F。这样就可以在不发布代码的情况下,动态地改变程序地运行逻辑。
  3. Config配置系统除了可以用作开关的功能以外。还有个重要的功能就如其名,配置系统,我们可以通过这个系统动态地设置相关配置。
  4. 开关同样支持分环境、分Group等操作。

自己最近也在复习微服务这块的知识。自然而然地用到了Nacos。那么Nacos不就是一个天生的配置系统吗?因此准备在其基础上稍微写个工具类,达到模拟Config配置系统的功能。

一. Nacos配置类编写

我们知道Nacos的加载需要几个属性:

  • server-addr:服务地址。
  • namespace:命名空间。
  • group:组的名称。

如图:
在这里插入图片描述

前提:你的application.yml或者bootstrap.yml文件里面有对应的配置。

1.我们先写一个配置类,自定义我们的名称ZKNacosProperties

@Data
@Component
@ConfigurationProperties(prefix = "kz.nacos")
public class ZKNacosProperties {private String fileName;private Long timeout;
}

对应的application.properties文件

kz.nacos.file-name=kz-service-config.properties
kz.nacos.timeout=3000

2.NacosConfig配置类:

@Configuration
public class NacosConfig {@Value("${spring.cloud.nacos.discovery.server-addr}")private String serverAddr;@Value("${spring.cloud.nacos.config.namespace}")private String namespace;@Value("${spring.application.name}")private String group;@Autowiredprivate ThreadPoolExecutor executor;@Autowiredprivate ZKNacosProperties zkNacosProperties;@Bean@RefreshScopepublic Map<String, String> zConfig() {HashMap<String, String> config = new HashMap<>();Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);properties.put(PropertyKeyConst.NAMESPACE, namespace);ConfigService configService;try {configService = NacosFactory.createConfigService(properties);addListener(configService, config);String content = configService.getConfig(zkNacosProperties.getFileName(), group, zkNacosProperties.getTimeout());updateCache(content, config);} catch (Exception e) {e.printStackTrace();}return config;}/*** Nacos在项目启动的时候,就会将配置进行读取,并起了一个线程 LongPollingRunnable* 用于感应Nacos端的配置变换* 这里用我们自定义的线程池做替换** @param configService*/private void addListener(ConfigService configService, Map<String, String> config) {try {if (configService != null) {configService.addListener(zkNacosProperties.getFileName(), group, new Listener() {@Overridepublic Executor getExecutor() {return executor;}@Overridepublic void receiveConfigInfo(String s) {// 更新我们的本地配置updateCache(s, config);}});}} catch (NacosException e) {e.printStackTrace();}}private void updateCache(String content, Map<String, String> config) {if (StringUtils.isBlank(content)) {return;}String key, value;// 拿到的content是一个完整的内容,我们一般是一行一个配置。这里按照行来分割String[] configs = content.split("\n");for (String c : configs) {String[] keyValue = c.split("=");key = keyValue[0];value = StringUtils.isNotBlank(keyValue[1]) ? keyValue[1] : "";config.put(key, value);}}
}

这里的自定义线程你可以去掉,也可以自己定义一个:

@Configuration
public class ThreadConfig {@Beanpublic ThreadPoolExecutor threadPoolExecutor() {return new ThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,new LinkedBlockingDeque<>(100),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}
}

3.自定义一个Config工具类:ZConfigUtil,用来访问配置。

@Component
public class ZConfigUtil {@Autowiredprivate Map<String, String> zConfig;public String getValue(String key) {String res = "";if (StringUtils.isBlank(key)) {return res;}res = zConfig.get(key);return res;}
}

二. 测试

Nacos中的配置文件内容:(记得保证你的命名空间、组都和你配置一致)
在这里插入图片描述

我的测试代码:

@GetMapping("/test")
@IgnoreCertification
public CommonReturnType getUser(@RequestParam("key") String key) {String value = zConfigUtill.getValue(key);return CommonReturnType.creat(value);
}

访问路径:localhost:8003/user/test?key=test ,如图:
在这里插入图片描述

如果我们在Nacos上添加一条配置然后保存:
在这里插入图片描述

可以看到监听器监听到了对应的变更事件:
在这里插入图片描述
所以我代码里面会对\n进行分割:
在这里插入图片描述

三. 展望

其实这个功能,Nacos本身已经支持了,或许还有别的方式可以直接获取相关的配置。只不过我这里自己又写了一个。核心的代码无非就是这段:

Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
properties.put(PropertyKeyConst.NAMESPACE, namespace);
ConfigService configService;
try {configService = NacosFactory.createConfigService(properties);addListener(configService, config);String content = configService.getConfig(zkNacosProperties.getFileName(), group, zkNacosProperties.getTimeout());updateCache(content, config);
} catch (Exception e) {e.printStackTrace();
}

一般项目启动之后,Nacos的配置地址、相关的命名空间都是固定好的。实际开发过程中,文件名称、Key的值往往是可以改变的。无非就是将上面的代码改造一下而已。

剩余的就是看对NacosConfig上的内容如何做处理了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_37237.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++中预处理语句 include、define、if】

1.预处理阶段 预处理阶段&#xff0c;在实际发生编译之前就根据对应的预处理语句进行操作&#xff0c;等到预处理阶段完成之后才进行编译阶段 。 2.预处理语句 预处理语句主要有include、define、if 和 program。利用 # 进行标记 2.1 include语句 include语句就是将所包含的…

【点云处理】点云法向量估计及其加速(4)

上篇文章【点云处理】点云法向量估计及其加速(3)介绍了如何使用pcl提供的gpu版本法向量计算接口对点云发向量计算进行加速。不足之处在于点云k近邻查找依然比较耗时&#xff0c;成为影响整体计算性能的瓶颈。这篇文章就如何优化点云K近邻查找效率进行实验。上一篇文章的示例代码…

想要精通算法和SQL的成长之路 - 无重叠区间

想要精通算法和SQL的成长之路 - 无重叠区间前言一. 无重叠区间前言 想要精通算法和SQL的成长之路 - 系列导航 一. 无重叠区间 原题链接 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互…

谷粒学苑_第十天

第十天 视频删除 后端 相关sdk在阿里云视频点播文档的服务端SDK–>Java SDK–>媒资管理–>删除视频 复制前面的InitObject到utils里 删除的方法 DeleteMapping("{id}")public R removeAliyunVideo(PathVariable String id){try{DefaultAcsClient defau…

1000套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作【建议收藏】

一、1000套HTML期末学生结课大作业作品(HTMLCSSJS) 这8年来做了1000多套(HTMLCSSJS)网页设计的学生期末大作业&#xff0c;都是给学生定制的都符合学校或者学生考试期末作业的水平&#xff0c;都是divcss框架原创代码写的&#xff0c;有的有js&#xff0c;有的视频音乐flash的…

Mongodb操作基础 分片

Mongodb分片 MongoDB分片是MongoDB支持的另一种集群形式&#xff0c;它可以满足MongoDB数据量呈爆发式增长的需求。当MongoDB存储海量的数据时&#xff0c;一台机器可能无法满足数据存储的需求&#xff0c;也可能无法提供可接受的读写吞吐量&#xff0c;这时&#xff0c;我们就…

【算法】2022第五届“传智杯”全国大学生计算机大赛(练习赛)

【参考&#xff1a;第五届“传智杯”全国大学生计算机大赛&#xff08;练习赛&#xff09; - 洛谷 | 计算机科学教育新生态】 练习赛满分程序&#xff08;多语言&#xff09;&#xff1a;https://www.luogu.com.cn/paste/fi60s4yu CPU一秒大概运行 10810^8108 次&#xff0c;…

ASEMI肖特基二极管MBR40200PT参数,MBR40200PT规格

编辑-Z ASEMI肖特基二极管MBR40200PT参数&#xff1a; 型号&#xff1a;MBR40200PT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#xff0…

imx6ull pro BSP 工具链

BSP&#xff0c;Board Support Package&#xff0c;指板级支持包&#xff0c;是构建嵌入式操作系统所 需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链 (Toolchain)。 每种开发板的 BSP 都不一样&#xff0c;并且这些源码都非常庞大。我们把这些源码都 放在…

自动化运维CICD

目录 概述 为什么持续集成和发布可以提高效率 如何实现 1、在linux服务器安装部署代码仓库 2、安装jenkins 使用shell脚本实现CICD 使用pipeline实现CICD 使用Blue Ocean实现CICD 概述 持续集成&#xff08;Continuous Integration&#xff0c;CI)和持续发布&#xff0…

二、进程管理(四)经典同步互斥问题

目录 4.1生产者-消费者问题 4.1.1单类生产者-单类消费者问题 4.1.2多类生产者-多类消费者问题 4.1.3吸烟者问题 4.2读者-写者问题 4.3哲学家进餐问题 分析进程同步和互斥问题的三步&#xff1a; 关系分析&#xff1a;分析问题中的同步&#xff08;前驱关系&#xff09;、…

【网络】tcpdump、Wireshark 案例超详细介绍

文章目录网络分层应用层找到服务器的 IP查接口、对象的耗时删除指定网站的Cookie表示层、会话层tcpdump、wireshard传输层telnet: 路径可达性测试nc: 路径可达性测试netstat&#xff1a;查看当前连接状态iftop&#xff1a;查看当前连接的传输速率netstat -s: 查看丢包和乱序的统…

数据结构(5)树形结构——二叉搜索树(JAVA代码实现)

5.1.概述 二叉搜索树&#xff0c;也叫二叉查找树、二叉排序树&#xff0c;顾名思义&#xff0c;这种二叉树是专门用来进行数据查找的二叉树。二叉搜索树的查找其实就是二分查找。 二叉搜索树的定义&#xff1a; 二叉搜索树可以为空如果二叉搜索树不为空&#xff0c;那么每个…

Visual C++ 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决

Visual C 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决 Microsoft Visual C&#xff08;简称Visual C、MSVC、VS或VC&#xff09;2010是微软公司的免费C开发工具&#xff0c;具有集成开发环境&#xff0c;可提供编辑C语言&#xff0c;C以及C/CLI等编程…

Java项目:JSP手机商城管理系统包含前台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色…

大数据_什么是数据中台?

目录 一、数据中台的定义 二、数据中台必备的是个核心能力 三、数据中台VS业务中台 四、数据中台VS数据仓库 五、数据中台VS现有信息架构 六、数据中台的业务价值与技术价值 一、数据中台的定义 数据中台是一套可持续“让企业的数据用起来”的机制&#xff0c;是一种战略…

[附源码]计算机毕业设计JAVA人力资源管理系统论文2022

[附源码]计算机毕业设计JAVA人力资源管理系统论文2022 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

第8章 综合案例—构建DVD租赁商店数据仓库

目录 章节概要 案例背景介绍 数据仓库的架构模型 数据仓库的架构模型 数据库sakila的下载和安装 数据库sakila简介 数据库sakila中 数据表之间的关系 数据表简介 用于储存电影基本信息及相关介绍的数据&#xff0c;该数据表各个字段的含义如表。 用于储存定义电影id所…

Kafka生产者之分区

一、分区好处 &#xff08;1&#xff09;便于合理使用存储资源&#xff0c;每个Partition在一个Broker上存储&#xff0c;可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务&#xff0c;可以实现负载均衡的效果&#xff1b; &#xff08;2&…

惊喜:2023前瞻版Java面试指南,不止八股文

前言&#xff1a; 2022年马上就要过去了&#xff0c;即将要到来的就是2023年的金三银四面试季&#xff0c;随着政策的放宽&#xff0c;经济的逐步复苏&#xff0c;岗位的需求也会越来越大&#xff0c;所以趁这段时间进行知识储备将会是最好的时间段&#xff0c;永远要做快人一…