【微服务架构组件之注册中心】注册中心选型-我只选nacos

news2025/1/11 21:08:33

注册中心的产生是基于用来解耦服务提供者(Provider)与消费者(Consumer)的关系,分布式设计架构下,众多的服务提供者的数量并不是动态不变的,在传统的静态LB的方案中,无法很好感知这种变化;

在分布式架构中,除了要考虑服务提供者与消费者的关系,还要考虑如何一系列更复杂的问题:

  1. 服务提供者注册后,如何被及时发现;
  2. 服务宕机后,如何及时下线;
  3. 服务调用异常时,如何进行有效规避雪崩问题的出现;
  4. 在大流量、大压力的情况下,如何进行有效的水平扩展;
  5. 注册中心如何实现自身的高可用;

 

目前,业界根据不同的需求和企业,主流的注册中心有eureka、consul、nacos、zookeeper。

eureka是

序号比较项Eureka zookeeper Nacos Consul
1集群结构平级 主从支持平级和主从主从
2集群角色主人Leader、follower observerleader、follower、candidateserver-leader、server以及client
3是否可以及时知道服务状态变化不能及时知道会及时知道不能及时知道不能及时知道
4一致性协议(CAP)注重可用性(AP)注重一致性(CP)支持CP和AP-如何实现注重一致性(CP)
5雪崩保护没有没有
6社区是否活跃Eureka2.0不再维护了持续维护持续维护持续维护
7管理端有现成的eureka管理端没有现成的管理端有现成的管理端有现成的管理端
8负载均衡策略使用ribbon实现一般可以直接采用RPC的负载均衡权重/metadata/SelectorFabio
9权限控制使用ACL实现节点权限控制RBAC-用户、角色、权限ACL
10Spring Cloud集成支持支持支持支持
11健康检查Client BeatKeep AliveTCP/HTTP/MYSQL/Client BeatTCP/HTTP/gRPC/Cmd
12自动注销实例支持支持支持不支持
13访问协议HTTPTCPHTTP/DNSHTTP/DNS
14是否可用作配置中心
15多数据中心不支持不支持不支持支持
16跨注册中心同步不支持不支持支持支持
17Dubbo集成不支持支持支持不支持
18K8S集成支持支持支持支持

注册中心选型

Eureka2已经不维护了,不建议继续使用,nacos既可以做配置中心,还可以做注册中心,属于比较好的选择。Consul目前的主要发展方向放在了Service Mesh。至于zookeeper作为服务发现有一个巨大的缺陷:

作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了,因为对于Service发现服务来说就算是返回了包含不实的信息的结果也比什么都不返回要好。所以当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。

但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

所以说,作为注册中心,可用性的要求要高于一致性!

在 CAP 模型中,Zookeeper整体遵循一致性(CP)原则,即在任何时候对 Zookeeper 的访问请求能得到一致的数据结果,但是当机器下线或者宕机时,不能保证服务可用性。

另外一个重要影响选型的就是健康检查的速度和方式

健康检查

Zookeeper和Eureka都实现了一种TTL的机制,就是如果客户端在一定时间内没有向注册中心发送心跳,则会将这个客户端摘除。Eureka做的更好的一点在于它允许在注册服务的时候,自定义检查自身状态的健康检查方法。这在服务实例能够保持心跳上报的场景下,是一种比较好的体验,在Dubbo和SpringCloud这两大体系内,也被培养成用户心智上的默认行为。Nacos也支持这种TTL机制,不过这与ConfigServer在阿里巴巴内部的机制又有一些区别。Nacos目前支持临时实例使用心跳上报方式维持活性,发送心跳的周期默认是5秒,Nacos服务端会在15秒没收到心跳后将实例设置为不健康,在30秒没收到心跳时将这个临时实例摘除。

有一些服务无法上报心跳,但是可以提供一个检测接口,由外部去探测。这样的服务也是广泛存在的,而且以我们的经验,这些服务对服务发现和负载均衡的需求同样强烈。服务端健康检查最常见的方式是TCP端口探测和HTTP接口返回码探测,这两种探测方式因为其协议的通用性可以支持绝大多数的健康检查场景。在其他一些特殊的场景中,可能还需要执行特殊的接口才能判断服务是否可用。例如部署了数据库的主备,数据库的主备可能会在某些情况下切换,需要通过服务名对外提供访问,保证当前访问的库是主库。此时的健康检查接口,可能就是一个检查数据库是否是主库的MYSQL命令了。

客户端健康检查和服务端健康检查有一些不同的关注点。客户端健康检查主要关注客户端上报心跳的方式、服务端摘除不健康客户端的机制。而服务端健康检查,则关注探测客户端的方式、灵敏度及设置客户端健康状态的机制。从实现复杂性来说,服务端探测肯定是要更加复杂的,因为需要服务端根据注册服务配置的健康检查方式,去执行相应的接口,判断相应的返回结果,并做好重试机制和线程池的管理。这与客户端探测,只需要等待心跳,然后刷新TTL是不一样的。同时服务端健康检查无法摘除不健康实例,这意味着只要注册过的服务实例,如果不调用接口主动注销,这些服务实例都需要去维持健康检查的探测任务,而客户端则可以随时摘除不健康实例,减轻服务端的压力。

Nacos既支持客户端的健康检查,也支持服务端的健康检查,同一个服务可以切换健康检查模式。我们认为这种健康检查方式的多样性非常重要,这样可以支持各种类型的服务,让这些服务都可以使用到Nacos的负载均衡能力。Nacos下一步要做的是实现健康检查方式的用户扩展机制,不管是服务端探测还是客户端探测。这样可以支持用户传入一条业务语义的请求,然后由Nacos去执行,做到健康检查的定制。

容量

据说,Nacos在内部淘汰Zookeeper和Eureka的过程中,容量是一个非常重要的因素。

Zookeeper的容量,从存储节点数来说,可以达到百万级别。不过如上面所说,这并不代表容量的全部,当大量的实例上下线时,Zookeeper的表现并不稳定,同时在推送机制上的缺陷,会引起客户端的资源占用上升,从而性能急剧下降。

Eureka在服务实例规模在5000左右的时候,就已经出现服务不可用的问题,甚至在压测的过程中,如果并发的线程数过高,就会造成Eureka crash。不过如果服务规模在1000上下,几乎目前所有的注册中心都可以满足。毕竟我们看到Eureka作为SpringCloud的注册中心,在国内也没有看到很广泛的对于容量或者性能的问题报告。

Nacos在开源版本中,服务实例注册的支撑量约为100万,服务的数量可以达到10万以上。在实际的部署环境中,这个数字还会因为机器、网络的配置与JVM参数的不同,可能会有所差别。图9展示了Nacos在使用1.0.0版本进行压力测试后的结果总结,针对容量、并发、扩展性和延时等进行了测试和统计。

完整的测试报告可以参考Nacos官网:
Nacos service discovery performance test report

参考文献:

主流微服务注册中心浅析和对比 - 知乎

微服务注册中心技术选型:5种主流注册中心,哪个最香?_程序员阿宇的博客-CSDN博客

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

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

相关文章

[附源码]java毕业设计网上宠物商店

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

进度条——不仅仅是语言层面上的小程序

文章目录\r和\n进度条完整代码\r和\n 在老式键盘上,回车键是这样的形状 但是该键的功能它不仅仅是回车,而是回车换行! 这里需要明白两个概念: 回车:光标移动到当前行的行首 换行:光标移动到当前位置的…

跟艾文学编程《Python基础》Anaconda 安装

作者:艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。 邮箱:1121025745qq.com 博客:https://edu.csdn.net/lecturer/894?spm1003.2001.3001.4144 内容&am…

原生AJAX

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 1、AJAX 简介 AJAX 全称为Asynchronous Javascript And XML,就是异步的JS 和 XML. 通过AJAX可以在浏览器中向服务器…

Vue3留言墙项目——主体部分静态、mock

文章目录主体头部主体关键部分小卡片组件创建mock数据以及使用主体头部 主体部分显示的内容,根据头部点击的是留言墙还是照片墙的按钮,显示不同的内容。 将照片墙和留言墙要渲染的数据抽取到一个js中,在导入的Main.vue(主体页面&…

[go]汇编ASM简介

文章目录汇编(ASM)寄存器帧指针FP常见指令函数示例生成汇编Go汇编代码主要用于优化和与底层系统交互,并不会像其它的经典汇编代码那样独立运行。汇编(ASM) Go ASM是一种被Go编译器使用的特殊形式的汇编语言(伪汇编),它基于Plan9输…

记录一次Powerjob踩的坑(Failed to deserialize message)

一. 问题描述: 在本地开发环境, server端和worker都运行正常. 但是发布到SIT环境(容器)的时候, 服务端却监测不到worker(worker可以找到服务端) 二. 问题表现: 1.服务端看不到Worker信息 2. 服务端日志信息 : Failed to deserialize message from [akka://oms111.111.111…

ECMAScript modules规范示例详解

引言 很多编程语言都有模块这一概念,JavaScript 也不例外,但在 ECMAScript 2015 规范发布之前,JavaScript 没有语言层面的模块语法。模块实际上是一种代码重用机制,要实现代码重用,将不同的功能划分到不同的文件中是必…

pycharm安装并加载编译器,设置背景图片,手把手详细操作

pycharm安装并加载编译器,设置背景图片,手把手详细操作 pycharm社区版(免费)下载官网 双击安装包,选择安装路径 勾选这两个,其实全不勾也没事 下一步默认就行,点install 安装完成后&#xf…

mimikatz抓取密码实战

必须下载最新版本 Releases gentilkiwi/mimikatz GitHubhttps://github.com/gentilkiwi/mimikatz/releases 有32和64之分,systeminfo查看自己版本 首先我们用后门得到权限,在用getsystem提权,因为mimikatz要system权限,getuid…

Python基础-1-环境搭建(初体验)

一:开发环境 Linux-5.15.0(Ubuntu22.04) 二:安装Python3 1、安装:sudo apt-get install python3 2、版本查询: python3 --version python3进入python解释器也可查询对应版本,按CtrlD或执行…

力扣(LeetCode)20. 有效的括号(C++)

栈模拟 一次遍历字符串 sss , 遇到左括号则入栈,遇到右括号则匹配栈顶。如果右括号匹配成功 , 栈顶元素弹栈 , 匹配不成功 , 则 returnfalsereturn\ \ falsereturn false 。 提示 : 当遍历完所有字符,记…

【计算机网络】扩展以太网方法总结

注:最后有面试挑战,看看自己掌握了吗 文章目录物理层扩展以太网链路层扩展以太网网桥网桥分类透明网桥源路由网桥多接口网桥----以太网交换机直通式交换机存储转发式交换机冲突域与广播域🍃博主昵称:一拳必胜客 🌸博主…

LinkedList详解

介绍 众所周知ArrayList底层数据结构是数组,但是数组有个缺点,虽然查询快,但是增删改会慢因为数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移,导致开销会很大。所以LinkedList应…

Linux系统下交叉编译工具的安装实现

大家好,今天主要和大家聊一聊,如何使用Linux系统下的交叉编译工具链的方法。 目录 第一:交叉编译工具链基本简介 ​第二:交叉编译工具安装方法 ​第三:安装相关库 ​第四:交叉编译工具验证 第一:交叉编译工具链基…

0100 蓝桥杯真题03

import java.util.Scanner; /* * 题目描述 * 如下图所示,3 x 3 的格子中填写了一些整数。 --*---- |10* 1|52| --****-- |20|30* 1| *******-- | 1| 2| 3| ------ *我们沿着图中的星号线剪开&#xf…

【Redis-04】Redis两种持久化方式(RDB和AOF)

Redis是基于内存的数据结构服务器,保存了大量的键值对数据,所以持久化到磁盘是非常必要的,Redis提供了两种持久化的方式,分别是RDB和AOF。下面我们看下这两种持久化方式的具体实现原理。 1.RDB持久化 首先,RDB持久化方…

Mysql基础

Mysql基础1. 数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL2. Mysql的安装2.1 MySQL数据模型3. SQL概述3.1 SQL简介3.2 通用语法3.3 SQL分类4. DDL:操作数据库4.1 数据库的显示讲解4.2 查询4.3 创建数据库4.4 删除数据库4.5 使用数据库4.6 小结5…

linux Qt编译自己的动态库(.so),详细全流程

本篇记录Qt编译动态库全流程 1. 建立工程 首先,打开Qt,新建C Library 工程 点击choose之后,输入项目名称为Example,一直下一步即可 生成的项目里边有三个文件,分别是example.h, Example_global.h, example.cpp exam…

数据结构之:递归思想

(一)递归概念 将复杂问题 递推分解为最简问题 然后将结果回归的过程 Windows - Linux Linux Linux is not Unix 使用方法: 自己调用自己(二)斐波那契数列 兔子问题 有一对大兔子 每个月繁衍 一对小兔子(一…