配置中心 选型 : Apollo Vs. Nacos Vs. spring cloud config

为什么我们需要一个微服务配置中心?

首先,我们可以想象下,如果没有配置中心,我们的项目可能是这样的:不同环境的配置文件都放在项目里面,部署时可以通过启动参数来指定使用哪个环境的配置。

这种方式有两个比较大的缺点:

一是不安全,项目的开发人员可以看到生产环境的各种地址、账号、密码等敏感信息;

二是配置更新需要重启项目才能生效,影响了服务的连续性和效率。配置中心就是为了解决这些问题而存在的。

它能够提供一个集中的地方来管理和存储配置信息,使得配置与代码分离,并且支持动态刷新配置,无需重启应用即可使新的配置生效,从而提高了系统的安全性及灵活性。

配置中心最关键的技术要素

安全性

将配置文件从项目中分离出来,并放置在一个独立的存储位置,是提高安全性的一种常见做法。然而,仅通过这种方式并不能完全解决安全问题。在测试环境和生产环境共用同一个配置中心的情况下,开发人员能够访问到测试环境中的配置,也就意味着他们同样可以获取到生产环境中的敏感信息,如地址、账号、密码等。为了进一步加强安全性,一种有效的策略是为不同的环境设置独立的配置中心。这样一来,即便开发人员拥有测试环境配置中心的访问权限,也无法直接接触到生产环境的配置信息。此外,还可以结合使用加密技术对敏感数据进行保护,以及采用细粒度的权限控制机制,确保只有授权用户才能查看或修改特定配置。

高可用性

高可用性对于配置中心而言至关重要,尤其是在系统出现故障需要紧急调整配置时,如果此时配置管理系统本身不可用,将会导致整个恢复过程受阻。实现配置中心高可用性的关键在于冗余设计。一方面,可以通过部署多个配置服务实例来提供服务端的高可用支持,这些实例间应具备良好的负载均衡能力,即使部分节点失效,剩余节点也能继续对外提供稳定的服务;另一方面,在客户端侧,当主配置服务器发生故障时,应该能自动切换至备用服务器读取配置信息,以保证业务连续性不受影响。同时,为了确保推送配置的可靠性,建议采用异步消息队列机制,使得即使在网络不稳定的情况下,也能可靠地完成配置更新操作。

实时性

实时响应配置变更对于现代应用来说非常重要。理想情况下,一旦配置发生变化,所有相关的客户端都应该能够立即感知并应用新的设置。实现这一点通常有两种方法:第一种方式是让客户端周期性地向配置中心请求最新的配置版本,这种方法简单但效率较低,特别是在配置变化频繁时可能会产生较高的网络开销;另一种更高效的方法是由配置中心主动向已注册的客户端推送变更通知,客户端收到通知后拉取最新配置即可。后者不仅减少了不必要的网络通信,还显著提高了配置更新的速度与准确性。

方便管理

良好的用户体验对于配置中心来说也是必不可少的一环。为此,大多数配置中心都会配备一个直观易用的控制台界面,供管理员执行日常维护任务。根据实际需求的不同,控制台的设计可能存在差异。一种常见的模式是所有环境共享同一套控制台工具,这种方式的好处在于简化了运维流程,降低了学习成本;而另一种模式则是根据不同环境定制专门的控制台入口,这样做的优点在于能够更好地隔离不同环境下的配置管理工作,避免误操作带来的风险。无论采取哪种形式,理想的配置中心控制台都应当具备清晰的功能布局、强大的搜索过滤功能以及完善的审计日志记录等功能,从而帮助管理员更加高效准确地管理海量配置信息。

那怎么选一个好的配置中心

从我们的经验来说。

在功能层面,你需要明确自己应用程序的具体需求,包括支持哪些类型的配置项、主要使用的编程语言以及是否涉及微服务架构等。对于采用微服务架构的企业来说,自动化的服务发现和服务注册能力尤为重要,这将直接影响到系统的灵活性和可扩展性。

系统的稳定性和可靠性,高可用设计是不可忽视的关键因素之一。一个良好的配置中心应该具备故障恢复机制,能够在部分节点出现问题时仍能正常提供服务,从而保证业务连续运行不受影响。

生态系统的成熟度,也是一个重要的考量点。广泛被采用的技术方案通常意味着社区活跃度较高,相关资源丰富,遇到问题时更容易找到解决方案或获得帮助。此外,庞大的用户基数也有助于快速发现潜在的问题,并促使开发者们不断改进产品。

部署的难易程度,也是不可忽略的一环。理想情况下,所选工具应具有较低的学习曲线及安装配置门槛,这样可以节省大量的时间和成本。同时,还应该根据自身实际情况评估所需投入的硬件资源是否合理。

寻找那些拥有良好文档支持、活跃讨论区或者专业客服团队的产品也非常重要。这些“周边”服务可以帮助你在使用过程中更加顺畅地解决问题,提升工作效率。

最后但同样关键的是,考察背后开发团队的实力及其商业模型。一个健康发展的项目往往能够获得足够的资金支持来维持其长期运营与发展,这意味着你所依赖的技术栈在未来几年内都将是安全可靠的。综上所述,通过全面权衡上述各个方面,可以帮助企业做出更为明智的选择。

主流配置中心功能选型表

Server端选型对比表

功能

子功能点

Nacos

Apollo

Spring Cloud Config

备注

发布配置

二阶段发布(编辑草稿->发布)

无

有

有

properties key单行变更

无

有

无

格式校验

有

有

无

实时推送

有

有

无

变更历史

正式历史

有

有

无

灰度历史

有

有

无

变更对比

无

有

无

nacos只展示变更前的内容,apollo支持单key维度变更前后对比,及全量对比

配置对比

跨实例对比

有

有

无

nacos跨实例对比对应apollo的跨环境对比

跨分组对比

有

有

无

nacos跨分组对比对应apollo跨集群对比

跨dataId对比

有

无

无

nacos支持任意配置对比,apollo支持appId下的某个namespace跨环境和集群对比

单行key级别对比

无

有

有

配置克隆

有

无

无

灰度发布

有

有

无

nacos 基于IP+标签(多key可扩展),apollo 基于IP+标签(单key)

监听查询

有

有

无

apollo中展示ip最新配置查询时间,nacos中展示

推送轨迹

配置推送轨迹

有

无

无

apollo在监听查询中展示最新配置获取时间(nacos中可优化),但没有md5

IP推送轨迹

有

无

无

鉴权管理

写权限

有

有

有

apollo对创建配置和发布配置分配不同的权限

读身份

有

有

有

读权限

有

无

有

nacos基于ram支持实例,分组,dataId命名空间维度鉴权,apollo支持配置秘钥,只校验身份,无鉴权

细粒度鉴权

有

有

有

nacos基于ram支持实例,分组,dataId命名空间维度鉴权,apollo支持namespace维度,apollo易用性更高

运维管理

部门管理

无

有

无

应用管理

无

有

无

用户管理

有

有

无

加解密

有

无

无

apollo需要自行加解密

导入导出

有

有

无

多实例管理

无

有

无

控制台和配置服务分离,支持通过env区分多个配置中心实例

运维审计日志

创建用户,创建应用,创建配置,修改配置,发布灰度

无

有

容量保护

集群容量,命名空间容量

无

无

反脆弱

查询配置,发布配置限流

无

无

监控

基础监控及业务监控

无

无

client端功能对比表

功能

子功能

Nacos

Apollo

Spring Cloud Config

查询配置

本地容灾

有

有

无

本地缓存

有

有

无

监听回调

配置整体监听

有

有

单行key级别监听

有

有

注解

Spring Value注解注入key值

有

有

注解监听回调

有

有

对象级别变更回调

有

无

配置注入对象

有

有

发布配置

有

无

无

删除配置

有

无

无

市面主流的配置中心的一些个人主观快速评价

Nacos 是目前推荐的配置中心之一,因其具备了功能齐全、社区活跃度高以及阿里等大公司都在使用的特点。它不仅支持多环境配置管理,还提供了服务发现和动态配置等功能,这使得它在云原生应用构建中显得尤为重要。关于多语言支持方面,虽然之前存在一定的局限性,特别是在Python的支持上不够理想,但最近社区已经在这方面进行了改进,具体情况值得持续关注。

对于Apollo来说,尽管其作为携程开源项目,在分布式配置管理和集中化管理方面做得不错,但是它的架构相对复杂,且对多语言及不同配置格式的支持较为有限。尤其是部署过程中需要依赖Eureka这样的组件,增加了使用的难度。

Spring Cloud Config 主要为Spring生态下的应用提供了一种集中式配置管理方案,它很好地融入到了Spring Cloud体系内,但缺点在于缺乏图形化的配置界面,同时对于非GitHub存储的配置文件管理工具支持不足,这也限制了其适用范围。

综上所述,基于当前情况分析,Nacos确实可以被视为最优选择,尤其是在国内环境中,其强大的功能性与良好的社区支持使其能够满足大部分企业级应用场景的需求。

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

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

相关文章

HarmonyOS(65) ArkUI FrameNode详解

Node 1、Node简介2、FrameNode2.1、创建和删除节点2.2、对FrameNode的增删改2.3、 FramNode的查询功能3、demo源码4、总结5、参考资料1、Node简介 在HarmonyOS(63) ArkUI 自定义占位组件NodeContainer介绍了自定义节点复用的原理(阅读本本篇博文之前,建议先读读这个),在No…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

vue图片之放大、缩小、1:1、刷新、左切换、全屏、右切换、左旋咋、右旋转、x轴翻转、y轴翻转

先上效果&#xff0c;代码在下面 <template><!-- 图片列表 --><div class"image-list"><img:src"imageSrc"v-for"(imageSrc, index) in images":key"index"click"openImage(index)"error"handleI…

【计算机网络】实验12:网际控制报文协议ICMP的应用

实验12 网际控制报文协议ICMP的应用 一、实验目的 验证ping命令和tracert命令的工作原理。 二、实验环境 Cisco Packet Tracer模拟器 三、实验过程 1.构建网络拓扑并进行信息标注&#xff0c;将所需要配置的IP地址写在对应的主机或者路由器旁边&#xff0c;如图1所示。 图…

迭代器模式的理解和实践

引言 在软件开发中&#xff0c;我们经常需要遍历容器对象&#xff08;如数组、列表、集合等&#xff09;中的元素。如果每个容器对象都实现自己的遍历算法&#xff0c;那么代码将会变得冗余且难以维护。为了解决这个问题&#xff0c;迭代器模式应运而生。迭代器模式是一种行为型…

TS2339: Property ‘value‘ does not exist on type ‘MessageBoxData‘.

1、源代码 <template><el-dialog:visible"visible":before-close"handleClose":close-on-click-modal"false"title"邀请码"width"1200px"append-to-bodydestroy-on-close><div class"invite-code-wrap…

ubuntu防火墙(三)——firewalld使用与讲解

本文是Linux下&#xff0c;用ufw实现端口关闭、流量控制(二) firewalld使用方式 firewalld 是一个动态管理防火墙的工具&#xff0c;主要用于 Linux 系统&#xff08;包括 Ubuntu 和 CentOS 等&#xff09;。它提供了一个基于区域&#xff08;zones&#xff09;和服务&#x…

Windows 安装配置 RabbitMQ 详解

博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工程师&#xff0c;掌握C、C#、Java、Python、Android等主流编程语言&#xff0c;同时也熟练掌握mysql、oracle、sqlserver等主流数据库&#xff0c;能够为大家提供全方位的技术支持和交流。 工作五年&#xff0c;具有丰富的…

R语言的数据结构--矩阵

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 矩阵是一个二维数组&#xff0c;矩阵中的元素都具有相…

JAVA基础学习笔记_反射+动态代理

文章目录 反射获取class对象的三种方式获取构造方法获取成员变量获取成员方法反射的作用 动态代理 反射 允许对成员变量\成员方法\构造方法的信息进行编程访问 把类内的信息扒的干干净净,获取解剖 获取从class字节码文件中获取 获取class对象的三种方式 public static void …

微信小程序一键复制功能

wx.setClipboardData(Object object) 设置系统剪贴板的内容。调用成功后&#xff0c;会弹出 toast 提示"内容已复制"&#xff0c;持续 1.5s wx.setClipboardData({data: 你需要复制的内容,success (res) {wx.getClipboardData({success (res) {console.log(res.dat…

【Python网络爬虫 常见问题汇总】

目录 1. 爬取图片出现403解决办法&#xff1a;设置请求头中的Referer字段 2.关于干坏事的问题后续不定期更新 欢迎共同探讨学习进步 1. 爬取图片出现403 问题出自案例9&#xff0c;已解决。 【Python网络爬虫笔记】9- 抓取优美图库高清壁纸 当在爬取图库图片时遇到 403 错误…

Linux: docker: 怎么修改 proc下的文件内容?

文章目录 参考问题方法 1:在宿主机上修改参数方法 2:启动容器时挂载 /proc 为可写方法 3:通过 Kubernetes 调整配置方法 4:构建特权容器参考 https://docs.docker.com/security/for-admins/hardened-desktop/enhanced-container-isolation/features-benefits/#procfs–sys…

分布式 分布式事务 总结

前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言&#xff0c;一次完整的交易需要同时调动两个节…

STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?

主要问题&#xff1a; 1&#xff0c;使用STM32F103C8T6&#xff0c;模拟IIC&#xff0c;SCL和SDA口配置为推挽输出上拉&#xff0c;主要是SDA脚&#xff0c;每次都要输出输入模式重新配置&#xff0c;虽然也能通信&#xff0c;但不稳定&#xff0c;出错率大&#xff1b; 2&…

【工业机器视觉】基于深度学习的水表盘读数识别(3-数据标注与转换)

【工业机器视觉】基于深度学习的仪表盘识读&#xff08;2&#xff09;-CSDN博客 数据标注 标注扩展 Labelme 和 LabelImg 都是用于创建机器学习和计算机视觉项目所需标注数据的工具。它们都允许用户通过图形界面手动标注图像&#xff0c;但各自有其特点和适用场景。 Labelme…

静态路由与交换机配置实验

1.建立网络拓扑 添加2台计算机&#xff0c;标签名为PC0、PC1&#xff1b;添加2台二层交换机2960&#xff0c;标签名为S0、S1&#xff1b;添加2台路由器2811&#xff0c;标签名为R0、R1&#xff1b;交换机划分的VLAN及端口根据如下拓扑图&#xff0c;使用直通线、DCE串口线连接…

【Spark】Spark Join类型及Join实现方式

Spark Join类型 1. Inner Join (内连接) 示例&#xff1a;val result df1.join(df2, df1("id") df2("id"), "inner")执行逻辑&#xff1a;只返回那些在两个表中都有匹配的行。 2. Left Join (左外连接) 示例&#xff1a;val result df1.jo…

socket UDP 环路回显的服务端

基于socket通讯的方式&#xff0c;无论用http或者udp或者自定义的协议&#xff0c;程序结构都是类似的。这个以UDP协议为例简要说明。 #include <stdio.h> // 标准输入输出库 #include <sys/types.h> // 提供了一些数据类型&#xff0c;如ssize_t #include <sy…

Linux:network:添加ip的时候自动添加一个本地路由

文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…