注册中心组成结构和基本原理解析

假如你正在设计和开发一个分布式服务系统,系统中存在一批能够独立运行的服务,而在部署上也采用了集群模式以防止出现单点故障。显然,对于一个完整的业务系统而言,这些服务之间需要相互调用并形成复杂的访问链路,一种可能的系统运行时状态如下所示:


如果你所开发的系统一直处于上图中的稳定状态,也就是说没有新的服务需要添加,正在运行的服务实例也不会出现宕机等故障,那么一切看上去都没有什么问题。但显然,这是不现实的。一方面,业务的快速发展势必要求服务本身不断迭代,所以系统中服务的拆分方式和数量需要随之变化和演进。另一方面,任何服务也无法保证不会出现异常情况或发布需求,导致服务需要重新启动。

以上场景就揭示了构建分布式服务系统中所面临的一些挑战,主要包括两个方面,即:

  1. 服务实例的数量如何进行管理?
  2. 服务实例的状态如何进行管理?

正如上图中所展示的,假设一个系统中存在几十个甚至上百个服务时,开发人员可能甚至都无法明确系统中到底有哪些服务正在运行。另一方面,因为很难同时确保所有服务都不出现问题,也很难保证当前的服务部署方式不做调整和优化,因此各个服务自身对外暴露的访问地址也具有动态性。由于自动扩容、服务重启等因素,服务实例的运行时状态会经常变化,如下图所示:


为了更好的描述服务的运行时状态,我们可以对每个服务实例信息进行抽象,提取如下所示的状态信息:


这样,上图中所涉及的服务实例变化信息就可以通过更加统一而形象的方式表达出来,如下所示:


既然服务数量的增加以及服务实例的变化都不可避免,那么有什么好的办法能够做到对这些服务实例进行有效的管理呢?这实际上就是一个服务治理的问题,服务治理的需求来自于服务的数量,也来自于服务实例的动态性。为了实现高效的服务治理,通常都需要构建一个独立的媒介来管理服务的实例,这个媒介就是我们今天要介绍的注册中心。

注册中心是服务实例信息的存储仓库,也是服务提供者和服务消费者进行交互的桥梁,提供了服务注册和服务发现这两大核心功能,如下所示:


上图中,访问注册中心的客户端程序一般会嵌入在服务提供者和服务消费者内部。在服务启动时,服务提供者通过内部的注册中心客户端程序自动将自身注册到注册中心,这就是服务注册过程。

而服务消费者则通过对自己感兴趣的服务进行订阅,从而从注册中心中获取那些已经注册的服务实例信息,这就是服务发现过程。同时,为了提高服务发现过程的效率和容错性,服务消费者可以配备缓存机制以保存已经获取的服务实例信息。更重要的是当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。

讲完这里,我们实际上已经了解了服务治理的主体内容。通过获取注册中心中的服务实例信息,我们可以掌握系统中服务的数量以及当前的运行时状态。但还有一个问题需要解决,即一旦服务的运行时状态发生了变更,我们如何有效获取这些变更信息呢?这就需要在注册中心中进一步引入变更通知机制,如下图所示:


变更通知机制是实现注册中心的一大难点。从架构设计上讲,状态变更管理可以采用注册中心本身具有的发布-订阅模式,这就诞生了一种服务监听机制。服务监听机制确保服务消费者能够实时监控服务更新状态,是一种被动接收变更通知的实现方案,通常采用监听器以及回调机制,如下图所示。


上图中,服务消费者可以对这些具体的服务实例节点添加监听器,当这些节点发生变化时(例如图中服务B的第一个实例变得不可用、服务C的第一个实例地址变更、或者是服务D新增了一个实例3),注册中心就能触发监听器中的回调函数确保更新通知到每一个服务消费者。显然,使用监听和通知机制具备实时的数据同步效果。

另外一种确保状态信息同步的方式是采用轮询机制。轮询机制是一种主动拉取策略,即服务的消费者定期调用注册中心提供的服务获取接口获取最新的服务列表并更新本地缓存,如下图所示:


轮询机制在实现上就是一个定时器,需要考虑的问题就是轮询的频率。为了确保数据同步的时效性,轮询频率不能太短。但考虑到轮询对注册中心的性能影响,也不能过于频繁的进行定时操作。一般而言,轮询频率控制在几十秒到几分钟之间是一种比较好的选择。

讨论完注册中心中服务实例存储和管理的核心功能之后,我们再来分析注册中心自身应该具备的高可用性,也就意味着注册中心本身需要构建对等集群。所谓对等集群,是指集群中所有的服务器都提供同样的数据,所以在对等集群中,作为注册中心客户端的各个服务只需要连接到一台注册中心服务器完成服务注册和发现即可,任何一台服务器宕机都不影响客户端正常使用,如下所示:


讲完注册中心的基本模型,我们再来分析目前市面上存在的一些代表性实现工具,常见的包括的Consul 、Zookeeper、Eureka、Nacos。其中Consul来自于HashiCorp公司,是一款用来实现分布式环境下服务发现与配置的开源工具。而Zookeeper是Apache顶级项目,作为分布式协调领域的代表性框架被广泛用于注册中心、配置中心、分布式锁等的构建场景。Netflix的Eureka则采用了一套完全不同的实现方案,被集成到微服务开发框架Spring Cloud中。而Nacos则由阿里巴巴开发,其核心定位是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台。

上述工具各有特色,都实现了注册中心的高可用性、服务实例存储以及同步功能,并提供了一组方便集成的客户端组件。这里以Zookeeper和Eureka为例来展开讨论,它们分别是Dubbo和Spring Cloud这两款微服务开发框架中的默认注册中心实现方案。

Zookeeper是“服务监听机制”实现策略的典型代表性工具。Zookeeper本质上是一个树形结构,可以在树上创建临时节点,并对节点添加监听器。临时节点的客户端与该节点建立长链接,并关注节点的状态,一旦发生变化则通过监听器回传消息到客户端,然后客户端的回调函数就会得到调用,如下图所示:

而对于Netflix Eureka而言,采用的就是典型的“轮询机制”来实现服务实例状态的同步,如下所示:


在Eureka中,Eureka的客户端会每隔30秒发送一次心跳来进行服务续约。通过续约来告知Eureka服务器该客户端仍然存在。在默认的情况下,当Eureka客户端连续90秒没有向服务器发送服务续约心跳,Eureka服务器就会将该服务实例从服务注册列表中删除,即剔除该服务。通过这种方式确保Eureka服务器中服务实例信息的正确性。而客户端则通过轮询机制获取这些服务实例信息,默认的轮询频率是30秒。

最后,作为总结,你只需要记住注册中心就是这样一种服务治理工具:管理系统中所有服务实例的运行时状态,并能够把这些状态的变化同步到各个服务中。在分布式系统中,你可以通过引入注册中心轻松实现对大规模服务的高效治理。

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

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

相关文章

HTML(29)——立体呈现

作用:设置元素的子元素是位于3D空间中还是平面中 属性名:transform-style 属性值: flat:子级处于平面中preserve-3d:子级处于3D空间 步骤: 父级元素添加 transform-style:preserve-3d 子级定位调整子盒子的位置&a…

14-54 剑和诗人28 - 用于实时嵌入查找的向量检索

介绍 LLM 成功的关键因素是向量嵌入的使用。通过将文本转换为数字向量表示,我们可以将语义含义映射到数学向量空间。这使得模型能够根据向量之间的相似性在语言中概括模式。 随着我们的模型和数据集变得越来越大,高效地存储、组织和检索这些嵌入变得至关…

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下: 科学计算模式效果如下: 更具体的功能演示视频见如下链接…

【易捷海购-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

ffmpeg滤镜-drawtext-命令行

使用 FFmpeg 在视频上添加文字可以通过 drawtext 滤镜来实现。这个滤镜允许你指定字体、大小、颜色、位置等。 基本用法 以下命令将 "Hello, World!" 添加到视频的顶部左侧: ffmpeg -i input.mp4 -vf "drawtexttextHello, World\!:fontcolorwhite…

JAVA Tesseract OCR引擎

Tess4j是一个基于Tesseract OCR引擎的Java库, Tesseract库最初由惠普实验室于1985年开发&#xff0c;后来被Google收购并于2006年开源。识别效果不好&#xff0c;速度还慢&#xff0c;但是好早好早了。 一、POM依赖 <!--OCR识别https://digi.bib.uni-mannheim.de/tesserac…

14-26 剑和侠客 – 预训练模型三部曲3 – 机器人时代来临

概述 在第 1 部分和第 2 部分中&#xff0c;我们讨论了适用于文本和图像任务的预训练模型&#xff0c;并探索了当今常用的模型。我们分析了这些模型的架构以及如何将它们用于特定任务。实现 AGI 所需的两个主要支柱是语言理解和机器的视觉能力。有许多任务与这两种能力有关。 …

Syncthing一款开源去中心化和点对点文件同步工具

Syncthing&#xff1a;一款开源的文件同步工具&#xff0c;去中心化和点对点加密传输&#xff0c;支持多平台&#xff0c;允许用户在多个设备之间安全、灵活地同步和共享文件&#xff0c;无需依赖第三方云服务&#xff0c;特别适合高安全性和自主控制的文件同步场景。 &#x…

4. kvm存储虚拟化

kvm存储虚拟化 一、命令行工具管理虚拟磁盘1、查看虚拟磁盘2、添加磁盘3、删除磁盘 二、qcow2格式的磁盘文件1、创建磁盘文件2、差量镜像/快速创建虚机2.1 创建差量镜像2.2 准备配置文件2.3 创建虚拟机2.4 批量部署虚拟机 三、存储池 storage pool1、类型2、在线迁移2.1 规划后…

【基于R语言群体遗传学】-14-种群起源的相对似然

我们可以将预测的基因型比例视为在种群中看到一组特定等位基因的概率。如果种群在等位基因频率上存在差异&#xff0c;我们可以使用基因型来推断个体起源于每个种群的相对可能性。大家可以先看一下之前的博客&#xff1a;群体遗传学_tRNA做科研的博客-CSDN博客 种群起源的相对似…

pytest-yaml-sanmu(六):YAML数据驱动测试

如果说 pytest 中哪些标记使用得最多&#xff0c;那无疑是 parametrize 了&#xff0c; 它为用例实现了参数化测试的能力&#xff0c;进而实现了数据驱动测试的能力。 1. 使用标记 parametrize 的使用需要提高两个内容&#xff1a; 参数名 参数值 pytest 在执行用例时&…

javascript DOM BOM 笔记

Web API API的概念 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细…

el-scrollbar实现自动滚动到底部(AI聊天)

目录 项目背景 实现步骤 实现代码 完整示例代码 项目背景 chatGPT聊天消息展示滚动面板&#xff0c;每次用户输入提问内容或者ai进行流式回答时需要不断的滚动到底部确保展示最新的消息。 实现步骤 采用element ui 的el-scrollbar作为聊天消息展示组件。 通过操作dom来实…

高智能土壤养分检测仪:农业生产的科技新助力

在科技日新月异的今天&#xff0c;农业领域也迎来了革命性的变革。其中&#xff0c;高智能土壤养分检测仪作为现代农业的科技新助力&#xff0c;正逐渐改变着传统的农业生产方式&#xff0c;为农民带来了前所未有的便利与效益。 高智能土壤养分检测仪&#xff0c;是一款集高科技…

共筑智能未来 | 思腾合力闪耀2024世界人工智能大会(WAIC 2024)

在刚刚结束的2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC 2024&#xff09;上&#xff0c;思腾合力作为行业领先的人工智能基础架构解决方案提供商&#xff0c;凭借卓越的产品和解决方案&#xff0c;成为展会上的亮点之一。此次盛会不仅展示了全球人工智…

Android 性能优化之启动优化

文章目录 Android 性能优化之启动优化启动状态冷启动温启动热启动 耗时检测检测手段TraceView使用方式缺点 Systrace环境配置使用方式TraceView和Systrace比较 AOP统计耗时环境配置使用 优化白屏优化异步加载优化环境配置使用 延迟加载优化AppStartup 源码下载 Android 性能优化…

网站高性能架构设计——高性能缓存架构

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、缓存基础 1.缓存简介 缓存提升性能的幅度&#xff0c;不只取决于存储介质的速度&#xff0c;还取决于缓存命中率。为了提高命中 率&#xff0c…

HarmonyOS Next应用开发之系统概述

一、鸿蒙系统概述 鸿蒙系统可以分为华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;和开源鸿蒙系统&#xff08;OpenHarmony&#xff09;&#xff0c;华为鸿蒙系统是基于OpenHarmony基础之上开发的商业版操作系统。他们二者的关系可以用下图来表示&#xff1a; 1.1、…

Linux 创建新虚拟机的全过程图解

一、创建新虚拟机 1.选择自定义 2.直接下一步 3.选择稍后安装 4.设置虚拟机名和安装位置 5.配置处理器&#xff08;处理器数量&#xff1a;4、每个处理器的内核&#xff1a;2&#xff09; 6. 内存选择 7.网络类型 8. IO控制器类型-默认推荐 9.磁盘类型-默认推荐 10.选择虚拟磁…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver gdb是一款开源的、强大的、跨平台的程序调试工具。主要用于在程序运行时对程序进行控制和检查&#xff0c;如设置断点、单步执行、查看变量值、修改内存数据等&#xff0c;从而帮助开发者定位和修复代码中的错误。 gdbserve…