加一个适配层,更好的使用 Nacos 配置中心 | 文末有完整代码
Nacos 为我们提供了非常好用的配置中心的功能,并且自带了一个控制台,但是每次更新配置时,需要对整个配置项的值进行修改,非常不方便。
如何更方便、优雅、安全的使用 Nacos 配置中心,就显得非常重要,本篇文章我将为大家介绍一种通过插件适配的方式,像操作 K-V 键值对那样更加简单的使用配置中心。
现有页面的问题
我们来看一下 Nacos 现有的配置管理页面可能存在什么问题,例如我有如下图所示的一个配置项:
如果让用户直接在 nacos 中管理这些配置,用户将会非常头疼,原因如下:
1.对于非技术人员,诸如 jdbc.url 这种系统相关的配置项,他们不需要关心,也不应该由他们来管理这些配置项,直接暴露给他们的话,将会非常危险
2.有些配置项无法仅从 key 的命名中判断出它的意思,因为他们并没有做到那么好的自解释,例如上述配置中的 time.diff 就很具有疑惑性
3.配置的修改应该做到最小化,如果将所有的配置项全部暴露,可能会存在用户在修改时不小心将其中某一个配置项删除的情况,这将会带来灾难性的后果
4.根据权限划分的不同,配置项应该进行数据权限的隔离,不同的人应该只能看到自己所能修改的配置项,而不是看到所有配置项
一种更友好的页面
假设我们有一种如下图所示更友好的操作页面,那么操作将变得更容易些:
通过将一整个配置项的内容,拆分成一个个更小的配置项,再为每个配置项加上一个说明信息,在这样的页面上操作是不是比直接在 Nacos 的控制台上操作更方便、友好和安全呢?
设计思路
为了要实现这样的功能,我们可以在原来配置中心的基础上做一个适配层,以插件的形式对外提供配置项的查询和修改服务。
主要的架构如下图所示:
整个流程分为三个部分:
1.Nacos 客户端长轮询服务端的配置信息
2.适配层从 Nacos 客户端处获取到完整的配置信息后拆分成一个个更小的配置项
3.从适配层中对某一个配置项进行更新,然后将所有的小配置项再组装成完整的配置项通过 Nacos 客户端将内容更新到服务端
上图中的 Config Unit 就是我们需要关心的最小配置单元,通过这个配置单元,我们就可以为每个配置项指定诸如 “说明” 这样的属性。
配置单元需要有哪些属性
我们可以自由设计配置单元中的属性,根据业务场景我们可以为配置单元设计以下属性:
- desc:这个属性主要是用来对配置项进行描述说明
- type:标识配置项的值类型,可以用一个枚举来定义
- readOnly:标识该配置项是否是只读,如果是只读则不允许修改
- grade:指定配置项的危险等级,主要是为了做数据权限隔离
通过这些属性就可以将 Nacos 中完整的配置项拆分成小的配置单元,可以将配置单元理解为配置项的元数据,这些元数据可以保存在数据库中或者是配置文件甚至也可以保存在 Nacos 中,只要保证每个配置项都能对应一个配置单元即可。
插件需要有哪些能力
适配层其实只需要提供配置项的查询和更新的功能即可,查询分为查询列表和单个配置项。具体的接口定义如下图所示:
查看几种效果
下面我们来查看下效果,具体的实现过程不在这里进行详细的描述,文末有完整实现代码。
获取配置列表
查询 grade 小于等于 5 的所有配置项:
查询 grade 小于等于 2 的所有配置项:
这里的 grade 一方面可以用来进行数据权限的隔离,也可以给前端作为「危险」等级展示的依据,grade 值越大的表示该配置项越危险,修改时需要格外注意。
查询单个配置项
根据 key 查询单个配置项:
当我们系统中需要获取某个配置项的值时,就可以调用该接口。
更新配置项
更新一个不存在的配置项:
更新一个配置项,但是权限不够,提交的 grade 低于该配置项的 grade:
更新某个配置项,但是该配置项为只读:
更新某个配置项,但是指定了一个错误的值类型:
正确更新某个配置项:
查看Nacos中的值
通过适配层更新完配置信息后,我们来检查下 Nacos 中的配置项是否发生了改变,如下图所示:
可以发现,Nacos 服务端中该配置项的值已经更新。
实际环境中使用
要在实际环境中使用该插件,需要解决以下几个问题:
1、配置单元
首先我们需要为 Nacos 中的每个配置项对应一个配置单元,为他们指定各种属性,然后将配置单元持久化到数据库或者配置文件中,方便插件进行获取配置单元的列表。
2、权限隔离
需要对所有的配置单元进行分类,即为他们维护好 grade,并在你们的系统中根据权限模型进行数据权限隔离,例如:
普通用户的角色可以查看并修改 grade <= 2 的配置项;
管理员角色可以查看并修改 grade<= 5 的配置项;
超级管理员角色可以查看并修改所有的配置项。
但是如果通过 grade 明文传输的话,被别人抓取到报文后,很可能伪造请求,所以最好的是结合系统的权限模块进行数据权限的整合。
完整代码
目前我已经实现了该插件的功能,如果需要完整的代码,可以在公众号内回复「配置中心插件」获取,不需要的直接忽略这段就好。
逅弈逐码,专注于原创分享,用通俗易懂的图文描述源码及原理
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
从国企到互联网,一个六年程序员的「得」与「失」
程序员,六年,四段工作经历,这也许是一份会被很多 HR 刷掉的简历。 从学生时代至今,我经历了两次大的方向转型和一次大的技术转型:从偏理论推导的数学科学到重工程实践的计算机学科,从「安稳固化」的国企到「活跃求变」的互联网;从「人人为我」的客户端到「我为人人」的服务端技术转型。 回看自己的经历,在方向选择上,我是后知后觉的。在 PC 时代即将谢幕时入场,完美地错过移动互联网时代的红利期/窗口期;技术选型上,我是「愚钝」的。一头扎进学习曲线最为漫长的 C++,又投入 Windows 封闭生态环境的怀抱,转型服务端之初「逆趋势」地被选择了「世界上最好的语言」(PHP)。 然而从硬币的另一面来说,我是幸运的。丰富的经历自不必多说,在这个过程中,我也初步丰富和完善了知识结构。虽不健壮,却也雁过留痕。 年岁渐长,我愈发感受到总结的必要性和重要性。这篇文章远谈不上什么感悟或是经验分享,只是想把曾经那些曾令我兴奋的、失落的、沮丧的故事说一说,也算是回看自己略显「折腾」的几年中那些「得」与「失」。 瞒着父母,我从国企辞职 作为一个从农村走出来的孩子,211 院校硕士毕业,在国企实习后顺利转正,是一件让...
- 下一篇
从零开始社区之路,手把手教你开源自己的Python包
要融入社区,第一步当然是要撰写一个自己的包。整个过程主要分为五步: 项目创建 搭建虚拟运行环境 编写项目代码 编写安装脚本 上传PyPi GIT 创建项目 创建项目,确定项目名称,description, license等: 项目地址:https://github.com/shikanon/BaiduMapAPI 搭建虚拟环境 我们在搭建自己的库的时候,是希望有一个干净的项目环境的,这时候virtualenv就很有用了,采用 virtualev 搭建虚拟环境,可以方便为后面生成私有项目的 requirement.txt 依赖包文件。 创建虚拟环境 virtualev venv 启用 virtualev : source venv/Script/activate 构建项目代码 简单,快速构建框架原型和骨架,记得包之间需要 __init__.py 文件,后面在编写setup.py也会很有用。 项目结构: 构建好架构后,可以开始编写单元测试代码,pytest是个简单易用的库,可以帮助我们快速完成单元测试构建。 构建安装脚本,编写 setup.py 文件 完成代码构建和测试就可以开始进入构建安...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题