微服务注册中心之Zookeeper,Eureka,Nacos,Consul,Kubernetes区别

news2025/1/18 11:07:30

文章目录

  • 1 微服务注册中心
    • 1.1 注册中心概念
      • 1.1.1 为什么需要注册中心
      • 1.1.2 如何实现一个注册中心
      • 1.1.3 如何解决负载均衡的问题
    • 1.2 注册中心如何选型
      • 1.2.1 Zookeeper
      • 1.2.2 Eureka
      • 1.2.3 Nacos
      • 1.2.4 Consul
      • 1.2.5 Kubernetes

1 微服务注册中心

微服务的注册中心目前主流的有以下五种:ZookeeperEurekaConsulNacosKubernetes

1.1 注册中心概念

1.1.1 为什么需要注册中心

随着单体应用拆分,首当面临的第一份挑战就是服务实例的数量较多,并且服务自身对外暴露的访问地址也具有动态性。可能因为服务扩容、服务的失败和更新等因素,导致服务实例的运行时状态经常变化,如下图:
在这里插入图片描述
商品详情需要调用营销、订单、库存三个服务,存在问题有:

  • 营销、订单、库存这三个服务的地址都可能动态的发生改变,单存只使用配置的形式需要频繁的变更,如果是写到配置文件里面还需要重启系统,这对生产来说太不友好了;
  • 服务是集群部署的形式调用方负载均衡如何去实现;

解决第一个问题办法就是加一个中间,这个中间层就是我们的注册中心。
解决第二问题就是关于负载均衡的实现,这个需要结合中间层来实现。

1.1.2 如何实现一个注册中心

对于如何实现注册中心这个问题,首先将服务之间是如何交互的模型抽象出来,我们结合实际的案例来说明这个问题,以商品服务为例:

  • 当我们搜索商品的时候商品服务就是提供者;
  • 当我们查询商品详情的时候即服务的提供者又是服务的消费者,消费是订单、库存等服务;

由此我们需要引入的三个角色就是:中间层(注册中心)、生产者、消费者,如下图:
在这里插入图片描述

整体的执行流程如下:

  • 在服务启动时,服务提供者通过内部的注册中心客户端应用自动将自身服务注册到注册中心,包含主机地址、服务名称等等信息;
  • 在服务启动或者发生变更的时候,服务消费者的注册中心客户端程序则可以从注册中心中获取那些已经注册的服务实例信息或者移除已下线的服务;

上图还多一个设计缓存本地路由,缓存本地路由是为了提高服务路由的效率和容错性,服务消费者可以配备缓存机制以加速服务路由。更重要的是,当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。
在整个执行的过程中,其中有点有一点是比较难的,就是服务消费者如何及时知道服务的生产者如何及时变更的,这个问题也是经典的生产者消费者的问题,解决的方式有两种:

  • 发布-订阅模式:服务消费者能够实时监控服务更新状态,通常采用监听器以及回调机制,经典的案例就是Zookeeper
    在这里插入图片描述
  • 主动拉取策略:服务的消费者定期调用注册中心提供的服务获取接口获取最新的服务列表并更新本地缓存,经典案例就是 Eureka
    在这里插入图片描述

对于如何选择这两种方式,其实还有一个数据一致性问题可以聊聊,比如选择定时器肯定就抛弃了强一致性,最后要求的是最终一致,这里就不深入展开了,另外你可能还会说服务的移除等等这些功能都没介绍,在我看来那只是一个附加功能,注册中心重点还是在于服务注册和发现,其他都是锦上添花罢了。
在这里插入图片描述

1.1.3 如何解决负载均衡的问题

负载均衡的实现有两种方式:

  • 服务端的负载均衡;
  • 客户端的负载均衡;

对于实现的方案来说本质上是差不多的,只是说承接的载体不一样,一个是服务端,一个客户端,如下图:
在这里插入图片描述
服务端的负载均衡,给服务提供者更强的流量控制权,但是无法满足不同的消费者希望使用不同负载均衡策略的需求。
客户端的负载均衡则提供了这种灵活性,并对用户扩展提供更加友好的支持。但是客户端负载均衡策略如果配置不当,可能会导致服务提供者出现热点,或者压根就拿不到任何服务提供者。
服务端负载均衡典型的代表就是 Nginx,客户端负载均衡典型代表是Ribbon,每种方式都有经典的代表,我们都是可以深入学习的。

常见的负载均衡器的算法的实现,常见的算法有以下六种:

  • 轮询法
    将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
  • 随机法
    通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多;其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
  • 哈希算法
    哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
  • 加权轮询法
    不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请求,而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
  • 加权随机法
    与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
  • 最小连接数法
    最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。

1.2 注册中心如何选型

现在注册中心的选择也是五花八门,现阶段比较流行有以下几种:
在这里插入图片描述

在介绍这个之前大家有些需要了解的知识有CAPPaxosRaft 算法这里我就不进行过多介绍了。开始介绍以上5种实现注册中心的方式。

1.2.1 Zookeeper

这个说起来有点意思的是官方并没有说他是一个注册中心,但是国内 Dubbo 场景下很多都是使用Zookeeper来完成了注册中心的功能。
点击了解zookeeper深入理解其原理

1.2.2 Eureka

点击了解SpringCloud之Eureka原理

1.2.3 Nacos

点击了解Nacos原理

1.2.4 Consul

ConsulHashiCorp 公司推出的开源工具,Consul Go 语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。

Consul的特点:

  • 服务发现(Service Discovery
    Consul 提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
  • 健康检查(Health Checking
    ConsulClient可以提供任意数量的健康检查,既可以与给定的服务相关联(webserver是否返回200 OK),也可以与本地节点相关联(内存利用率是否低于90%)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
  • Key/Value存储
    应用程序可以根据自己的需要使用Consul提供的Key/Value存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
  • 安全服务通信
    Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
  • 多数据中心
    Consul支持开箱即用的多数据中心,这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域
    在这里插入图片描述

Consul 支持多数据中心,在上图中有两个DataCenter,他们通过Internet互联,同时请注意为了提高通信效率,只有Server节点才加入跨数据中心的通信。

在单个数据中心中,Consul分为ClientServer两种节点(所有的节点也被称为Agent),Server节点保存数据,Client负责健康检查及转发数据请求到ServerServer节点有一个Leader和多个FollowerLeader节点会将数据同步到 FollowerServer 的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader

集群内的Consul节点通过gossip协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。单个数据中心的流言协议同时使用TCPUDP通信,并且都使用8301端口。跨数据中心的流言协议也同时使用TCPUDP通信,端口使用8302。
集群内数据的读写请求既可以直接发到Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点,在允许数据延时的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。

Consul其实也可以在应用内进行注册,后续采用Spring Cloud全家桶这套做负载

我们这里聊聊关于Consul的应用外的注册:
在这里插入图片描述

上图主要多出来两个组件,分别是RegistratorConsul Template,接下来我们介绍下这两个组件如何结合可以实现在应用发进行服务发现和注册。

  • Registrator:一个开源的第三方服务管理器项目,它通过监听服务部署的 Docker 实例是否存活,来负责服务提供者的注册和销毁。
  • Consul Template:定时从注册中心服务端获取最新的服务提供者节点列表并刷新 LB 配置(比如 Nginxupstream),这样服务消费者就通过访问 Nginx 就可以获取最新的服务提供者信息,达到动态调节负载均衡的目的。

整体架构图可能是这样
在这里插入图片描述
我们用 Registrator 来监控每个Server的状态。当有新的Server启动的时候,Registrator会把它注册到Consul这个注册中心上。

由于Consul Template已经订阅了该注册中心上的服务消息,此时Consul注册中心会将新的Server信息推送给Consul TemplateConsul Template则会去修改nginx.conf的配置文件,然后让Nginx重新载入配置以达到自动修改负载均衡的目的。

1.2.5 Kubernetes

Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。

Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产环境运行工作负载15年的经验,并吸收了来自于社区的最佳想法和实践。
Kubernetes经过这几年的快速发展,形成了一个大的生态环境,Google在2014年将Kubernetes作为开源项目。

Kubernetes的关键特性包括:

  • 自动化装箱:在不牺牲可用性的条件下,基于容器对资源的要求和约束自动部署容器。同时,为了提高利用率和节省更多资源,将关键和最佳工作量结合在一起。
  • 自愈能力:当容器失败时,会对容器进行重启;当所部署的Node节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器;直到容器正常运行时,才会对外提供服务。
  • 水平扩容:通过简单的命令、用户界面或基于CPU的使用情况,能够对应用进行扩容和缩容。
  • 服务发现和负载均衡:开发者不需要使用额外的服务发现机制,就能够基于Kubernetes进行服务发现和负载均衡。
  • 自动发布和回滚Kubernetes能够程序化的发布应用和相关的配置。如果发布有问题,Kubernetes将能够回归发生的变更。
  • 保密和配置管理:在不需要重新构建镜像的情况下,可以部署和更新保密和应用配置。
  • 存储编排:自动挂接存储系统,这些存储系统可以来自于本地、公共云提供商(例如:GCP和AWS)、网络存储(例如:NFS、iSCSI、Gluster、Ceph、Cinder和Floker等)。
    图片

Kubernetes属于主从分布式架构,主要由Master NodeWorker Node组成,以及包括客户端命令行工具Kubectl和其它附加项。

Master Node:作为控制节点,对集群进行调度管理,Master主要由三部分构成:

  • Api Server 相当于 K8S 的网关,所有的指令请求都必须经过 Api Server;
  • Kubernetes 调度器,使用调度算法,把请求资源调度到某个 Node 节点;
  • Controller 控制器,维护 K8S 资源对象(CRUD:添加、删除、更新、修改);
  • ETCD 存储资源对象(可以服务注册、发现等等);

在这里插入图片描述

Worker Node:作为真正的工作节点,运行业务应用的容器;Worker Node主要包含五部分:

  • Docker 是运行容器的基础环境,容器引擎;
  • Kuberlet 执行在 Node 节点上的资源操作,Scheduler 把请求交给Api ,然后 Api Sever 再把信息指令数据存储在 ETCD 里,于是 Kuberlet 会扫描 ETCD 并获取指令请求,然后去执行;
  • Kube-proxy是代理服务,起到负载均衡作用;
  • Fluentd 采集日志;
  • PodKubernetes 管理的基本单元(最小单元),Pod 内部是容器。Kubernetes 不直接管理容器,而是管理 Pod

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

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

相关文章

spring注册bean方式总结

从前天开始气温飞升,三十七八度,这谁受得了,看看代码降降温~ 文章目录 什么是注册beanAutowired、Resource及Inject等Component及Service等Configuration及Beanspring.factories文件Import和ImportSelector使用Import及ImportBeanDefinition…

vue3项目国际化,你还不了解吗?

vue3使用的国际化库为:i18n 安装方式: npm install vue-i18nnext安装完成后在src文件夹下新建lang文件夹 在lang文件夹下新建需要语言转换的文件夹,这里以中文zh和英文en举例,在这两个文件夹下新建需要转换的语言 在zh的index.…

掌握ZBrush的19个建模技巧,让你的雕刻作品更逼真

ZBrush 是一个数字雕刻和绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业,按照世界领先的特效工作室和全世界范围内的游戏设计者的需要,以一种精密的结合方式开发成功的,它提供了极其优秀的功能和特色&#xff0c…

精简70%、内存不到1G,可以装在显卡上的Win11来了

Win11 经历了一两年的更新,现在有了许多 Win10 没有的功能特性。 但其中某些用不上的功能也让 Win11 显得臃肿甚至卡顿及各种谜之 Bug 。 对于配置较低或者有「洁癖」的用户来说,可能还在死守官方精简 Win10 LTSC 长期服务版。 Win11 LTSC 尚未发布&am…

Policy Gradient策略梯度算法详解

1. 基本思想 Policy Gradient策略梯度(PG),是一种基于策略的强化学习算法,不少帖子会讲到从基于值的算法(Q-learning/DQN/Saras)到基于策略的算法难以理解,我的理解是两者是完全两套思路&#…

S32K144低功耗休眠与唤醒实践总结

在做车载项目时,模块在常供电时需要维系随时可以被唤醒工作的状态,并且静态电流需要在3mA以内,当然在JTT1163标准中要求的是5mA以内。 目标明确了,在模块休眠时需要关闭一切不必要的资源消耗,只保留模块被唤醒的部分功…

K8S中master节点部署Pod处于Pending状态

查询一下pod信息: kubectl get pods -n kubernetes-dashboard根据name查看详细信息: kubectl describe pod dashboard-metrics-scraper-5b59d4bc6b-rxgqb -n kubernetes-dashboard这一句提示: Warning FailedScheduling 7s (x21464 ov…

Java进阶-查找算法

常见的七种查找算法: 1. 基本查找 ​ 也叫做顺序查找 ​ 说明:顺序查找适合于存储结构为数组或者链表。 基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线的一端开始,顺序扫描,依次将遍…

2023年5月北京/南京/西安/深圳DAMA-CDGA/CDGP数据治理认证报名

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中! 考试开放地区:北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证班进行中,报名从速! DAMA认证为数据管…

ARM-处理器模式(二)

文章目录 ARM 处理器模式工作模式模式切换内核寄存器R13_modeR14_modePC 各个模式对应的内核寄存器模式切换代码实现使用 mrs/msr 指令使用 cps 指令 ARM 处理器模式 ARMv7-a 处理器共有 9 种工作模式 工作模式 User:用户模式,非特权模式,大…

如果你想申请国家级高新技术企业

你必须首先满足国家支持的八大高新技术领域: 一、电子信息 二、生物学与新医学 三、航空航天 四、新材料 五、高科技服务业 六、新能源与节能 七。资源与环境 八、先进制造和自动化 如果您满足这八个领域中的一个,您就有资格申请高新技术企业。 …

有了 IP 地址,为什么还要用 MAC 地址?

MAC地址等价于快递包裹上的收件人姓名。 MAC地址更多是用于确认对方信息而存在的。就如同快递跨越几个城市来到你面前,快递员需要和你确认一下收件人是否正确,才会把包裹交给你一样。 IP66在线查IP地址位置:https://www.ip66.net/?utm-sour…

Bean基础配置?实例化方式?生命周期?

文章目录 1 bean基础配置1.1 bean基础配置(id与class) 1 bean基础配置1.1 bean基础配置(id与class)1.2 bean的name属性1.2 bean的name属性步骤1:配置别名步骤2: 根据名称容器中获取bean对象步骤3: 运行程序 1.3 bean作用范围scope配置(单例/非单例)1.3.1 验证IOC容器…

案例8:Java交易商城网站设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

如何判断自己是否适合做项目管理?

如何转做项目管理?如何判断自己是否适合做项目管理?我们可以从项目管理的思维、能力、工具、书籍阅读四个方面入手—— 1.项目管理的思维 (1)系统思考 项目管理需要从一个系统的角度来看待问题,将复杂的项目分解为小…

CAD功能库CAD DLL v15 2023最新上线!改进3D格式文件

CAD DLL是一个为开发者打造的新版本CAD库,可在支持动态链接库技术的语言中添加CAD功能到应用程序中。 很高兴与大家分享,CAD Dll迎来了久违的更新,更新至v15,3D改进,还改进了 DWG 和 DXF 格式的导入,除此之…

商场地图怎么画最简单?商场导视图怎么做?

商场购物中心超大的经营规模能为广大顾客提供购物选择的同时,也面临着许多问题:购物体验差,顾客到店率低。以及数据缺失,无法为商家做营销决策提供依据等等,那么,如何快速提升商场店铺运营效果,…

指定日本|在读博士生获CSC资助赴日本全球环境战略研究所联合培养

R同学的学术背景较弱,虽参与过导师的项目,但自己没有相关文章发表。拟申请CSC联培项目,研究方向为农业经济可持续发展,指定日本并希望合作导师的研究与此相关联。最终我们用日本全球环境战略研究所(IGES)的…

关于多维图形在2D平面投影的个人理解

网上有很多关于多维空间的描述,这里分享一下我的个人理解 假设在二维空间中有两个图形,三角形、四边形,画面如下 以如下规律在三维空间展开 对于三角形,在三维空间中添加一点,和其连接,使得每个面都为三角…

盘点国产BI软件中,那些电商数据分析功能

老牌国产BI软件基本都是适用于所有行业,会为各行各业的提供智能数据可视化分析功能板块,那么,老牌国产BI软件之一的奥威BI软件又为电商数据分析提供了哪些功能板块,效果怎样? 1、提供标准化跨境电商分析方案 这套跨境…