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

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


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

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

  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.mzph.cn/bicheng/43445.shtml

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

相关文章

codesys多段直线电机跨电机控制

1. 电机描述 在X轴上有多段直线电机,如下图有9个,从X1到X9. 2.codesys程序结构 程序名称:Pou_two_motors 动作名称:ACT_move 把这个程序搞到任务配置里面 通过ethercat总线命名一下这些电机,方便调用。 3.程序内容 P…

油烟监测仪:守护厨房,让蓝天白云成为常态

夏日炎炎,白天的酷暑让人们更加向往夜晚的凉爽与惬意。在这样的季节里,品尝各式烧烤、小龙虾,再搭配一杯冰镇啤酒,成为了许多市民夜晚消遣的不二选择。然而,随之而来的餐饮油烟问题也进入了高发阶段,对周边…

智能锁赛博化,凯迪仕携全球顶尖科技亮相建博会!

7月8日,作为大家居建材行业全球规模第一大展,2024中国建博会(广州)在广交会展馆正式拉开序幕。据官方数据显示,本届展会展出规模展览总规模近40万平方米,建筑装饰领域各细分题材的一线品牌几乎全部参展。 其…

循环练习题

思路&#xff1a; 代码&#xff1a; public static void main(String[] args) {double sum0;for (int i1;i<100;i){if (i%2!0){sum1.0/i;}else {sum-1.0/i;}}System.out.println(sum);} 结果为&#xff1a;

vscode取消未使用变量的提示(爆红)

目前项目正在使用ts&#xff08;TypeScript&#xff09;&#xff0c;可以在 tsconfig.json 文件中调整编译选项 在你的项目中找到并打开 tsconfig.json 文件&#xff0c;将noUnusedLocals和noUnusedParameters设置为false&#xff0c;关闭vscode重新打开项目即可 {"comp…

Mysql 高性能索引

引言 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 常见的索引类型包括B-Tree索引、哈希索引、空间数据索引&#xff08;R-Tree&#xff09;、全文索引。 索引的类型 在MySQL中&#xff0c;索引是在 存储引擎层 而不是服…

井字游戏00

题目链接 井字游戏 题目描述 注意点 1 < board.length board[i].length < 100输入一定遵循井字棋规则 解答思路 如果某一方想要获胜&#xff0c;则其需要占满某一行或某一列或对角线&#xff0c;所以只需要根据第一行和第一列判断是否填充完某一行或某一列或对角线…

EHS管理体系,重塑造企业竞争力的关键密码

在当今这个快速发展的时代&#xff0c;企业面临着前所未有的挑战与机遇。随着全球环保意识的普遍觉醒&#xff0c;以及社会各界对企业社会责任的日益关注&#xff0c;EHS&#xff08;环境&#xff0c;健康&#xff0c;安全&#xff09;管理体系成为了企业稳健前行的重要基石。它…

设计模式之Facade设计模式

Facade设计模式&#xff0c;也称为外观模式&#xff0c;是一种结构型设计模式&#xff0c;它主要用于为子系统中的一组接口提供一个统一的高层接口&#xff0c;从而使得子系统更加容易使用。以下是关于Facade设计模式的详细介绍&#xff1a; 一、定义 Facade模式为多个复杂的…

一款强大且免费开源的多连接数据库管理工具

大家好&#xff0c;今天给大家分享一款免费开源的跨平台数据库管理工具DbGate。 DbGate是一款免费开源的跨平台数据库管理工具&#xff0c;支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQL Server、MongoDB、SQLite等。它可以在Windows、Linux、Mac操作系统上运行&#…

【概念介绍】Signed Distance Function(SDF)

三维空间的表示形式可以分为显式和隐式 显式&#xff1a; 体素Voxel&#xff0c;点云Point Cloud&#xff0c;三角面片Mesh隐式&#xff1a;符号距离函数Signed Distance Funciton(SDF)&#xff0c;占用场Occupancy Field&#xff0c;神经辐射场Neural Radiance Field&#xff…

MAC在网络结构中的位置:深入解析

MAC在网络结构中的位置&#xff1a;深入解析 在网络通信的世界里&#xff0c;每一层都扮演着至关重要的角色。今天&#xff0c;我们将聚焦于一个经常被提到但可能不太被理解的概念&#xff1a;MAC&#xff08;Media Access Control&#xff0c;媒体访问控制&#xff09;。我们…

命名空间namespace--c++入门基础等

个人主页点这里~ 1.命名空间-namespace 简介 &#xff1a;在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xf…

echarts图表加载显示空白

数据请求了&#xff0c;图表加载显示空白 报错&#xff1a; Error: Initialize failed: invalid dom. at Object.init (echarts.js:2273:1) 方案 1. 通过this.$nexttick(()>{}) , 试过&#xff0c; 还是不行 2、把 this.lineChart2 this.$echarts.init(document.g…

EV代码签名-解决软件下载时风险警告

软件开发公司在发布软件后&#xff0c;用户尝试下载并安装软件时&#xff0c;如果被SmartScreen识别不常见或尚未建立起良好的信誉度&#xff0c;系统会发出警告&#xff0c;提示用户软件程序可能会对电脑构成风险&#xff0c;或者提示软件非正版软件&#xff0c;这有可能会造成…

点播CDN回源标准化策略

一、背景&问题&#xff1a; 背景&#xff1a; 历史上公司点播CDN接入的厂商就比较多 厂商之间回源的方式存在细节上的差异 不同的厂商之间专线大小存在差异 厂商之间的定位不同&#xff0c;有全镜像存储厂商&#xff0c;作为源站资源副本永久存储&#xff0c;也有镜像存…

Python提取视频文案

Python提取视频文案 1、背景描述2、视频转音频3、音频转文字 1、背景描述 在多媒体应用中&#xff0c;视频是一个信息量巨大的载体。然而&#xff0c;有时我们需要从视频中提取语音并转换为文本&#xff0c;以用于文本分析和机器学习训练 其中主要涉及到两个过程&#xff1a;视…

LeetCode67(二进制求和[位运算,大数运算])

二进制求和 题目要求: 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 这道题其实有几种解法.我们先来介绍简单的方法. 我们可以将两个字符串的二进制转成十进制,获取对应值相加之后,我们可以不断对2取余,获取尾数拼接即可.也就是像我们平常求一…

微信公众平台、公众号、小程序联动

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 微信公众平台、公众号、小程序联动 如何通过unionid获取到微信公众openid如何根据code获取微信公…

UI组件库---vantList组件接口多次调用大坑问题

问题描述&#xff1a;当使用refesh下拉操作时&#xff0c;vanlist组件会多次调用&#xff08;大概三次&#xff09;&#xff01; 解决方案&#xff1a; 1、接口错误的时候&#xff0c;大量重复请求。 可能接口错误时vant3内部某些变量没重置&#xff0c;导致一直重复请求&am…