Dubbo服务发现原理

news2024/9/28 7:27:53

一、Dubbo服务发现设计

Dubbo提供的是一种Client-Based的服务发现机制,依赖第三方注册中心组件来协调服务发现过程,支持常用的注册中心如Nacos、Connsul、Zookeeper等

Dubbo服务发现机制的基本工作原理图:

服务发现包含提供者、消费者和注册中心三个参与角色,其中,Dubbo提供者实例注册URL地址到注册中心,注册中心负责对数据进行聚合,Dubbo消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。

1.面向百万实例集群的服务发现机制

区别于其他很多微服务框架的是,Dubbo3的服务发现机制诞生于阿里巴巴超大规模微服务电商集群实践场景,因此,其在性能、可伸缩性、易用性等方面的表现大幅领先于业界大多数主流开源产品。是企业面向未来构建可伸缩的微服务集群的最佳选择。

首先,Dubbo注册中心以应用粒度聚合实例数据,消费者按消费需求精准订阅,避免了大多数开源框架如Istio、Spring Cloud等全量订阅带来的性能瓶颈。

其次,Dubbo SDK在实现上对消费端地址列表处理过程做了大量优化,地址通知增加了异步、缓存、bitmap等多种解析优化,避免了地址更新常出现的消费端进程资源波动。

最后,在功能丰富度和易用性上,服务发现除了同步IP、port等端点基本信息到消费者外,Dubbo还将服务端的RPC/HTTP服务及其配置的元数据信息同步到消费端,这让消费者,提供者两端的更细粒度的协作称为可能,Dubbo基于此机制提供了很多差异化的治理能力。

高效地址推送实现:

从注册中心视角来看,它负责以应用名(Dubbo.application.name)对整个集群的实例地址进行聚合,每个对外提供服务的实例将自身的应用名,实例ip:port地址信息(通过还包含少量的实例元数据,如机器所在区域、环境等)注册到注册中心。

Dubbo2.0版本注册中心以服务粒度聚合实例地址,比应用粒度更细,也就意味着传输的数据量更大,因此,在大规模集群下也遇到一些性能问题。

针对Dubbo2与Dubbo3跨版本数据模型不一致的问题,Dubbo3给出了平滑迁移方案,可做到模型变更对用户无感。

每个消费服务的实例从注册中心订阅实例地址列表,相比于一些产品直接将注册中心的全量数据(应用+实例地址)加载到本地进程,Dubbo实现了按需精准订阅地址信息。比如一个消费者应用依赖app1、app2,则只会订阅app1、app2的地址列表更新,大幅度减轻了冗余数据推送和解析的负担。

丰富的元数据配置

除了于注册中心的交互,Dubbo3的完整地址发现过程还有一条额外的元数据通路,称之为元数据服务(MetadataService),实例地址于元数据共同组成了消费者端有效的地址列表。

完整工作流程如上图所示,首先,消费者从注册中心接收到地址信息(ip:port),然后于提供者建立连接并通过元数据服务读取到端的元数据配置信息,两部分信息共同组成了Dubbo消费端有效的面向服务的地址列表。以上两个步骤都是在实际的RPC服务调用发生之前的。

2.配置方式

Dubbo服务发现扩展了多种注册中心组件支持,如Nacos、Zookeeper、Consul、Redis、Kubernetes等,可以通过配置切换不通实现,同时还支持鉴权、命名空间隔离等配置。具体配置方式请查看SDK文档。

Dubbo还支持一个应用内配置多注册中心的情形如双注册、双订阅等,这对于实现不同集群地址数据互通、集群迁移等场景非常有用处,官网任务里有关于这部分的示例说明。

3.自定义扩展

注册中心适配支持自定义扩展实现。

1.设计目标:

显著降低服务发现过程的资源消耗,包括提升注册中心容量上限、降低消费端地址解析资源占用等,使得Dubbo3框架能够支持更大规模集群的服务治理,实现无限水平扩展。

适配底层基础设施服务发现模型,如K8s、Service Mesh等。

2.背景:

Dubbo接口级别服务发现-基本原理

Dubbo的地址发现是通过借助注册中心组件协调Provider与Consumer实例地址的过程。

Provider实例通过待定key向注册本机可访问地址

注册中心通过key将Provider实例地址聚合

Consumer通过订阅特定key实时从注册中心接收地址变更

Dubbo最经典的工作原理图来看,Dubbo从设计之初就内置了服务地址发现的能力,Provider注册地址到注册中心,Consumer通过订阅实时获取注册中心的地址更新,在收到地址列表后,consumer基于特定的负载均衡策略发起对Provider的RPC的调用。

在这个过程中:

  1. 每个Provider通过特定的key向注册中心注册本机可访问地址
  2. 注册中心通过这个key对Provider实例地址进行聚合
  3. Consumer通过同样的key从注册中心订阅,以便及时收到聚合后的地址列表

Dubbo接口级别2服务发现---数据与结构1

接口级别地址发现的内部数据结构进行详细分析如下:

首先,右下角Provider实例内部的数据与行为,Provider部署的应用中通常会有多个service,也就是Dubbo2中的服务,每个service都可能会有其独有的配置,通常情况下service服务发布的过程,其实就是基于这个服务配置生成地址URL的过程,生成的地址数据如图所示,同样的,其他服务也都会生成地址。

其次,看一下注册中心的地址数据存储结构,注册总线以service服务名为数据划分依据,将一个服务下的所有地址数据都作为子节点进行聚合,子节点的内容就是实际可访问的IP地址,也就是我们Dubbo中URL,格式就是刚才Provider实例生成的。

URL地址数据可以划分为几份:

  1. 首先是实例可访问地址,主要信息包含IP port,是消费端将基于这条数据生成tcp网络连接,作为后续RPC数据的传输载体。
  2. 其次是RPC元数据,元数据用于定义和描述一次RPC请求,一方面表明这条地址是与其具体的RPC服务有关的,它的版本号,分组以及方法相关信息
  3. 下一部分是RPC配置数据,部分配置用于控制RPC调用的行为,还有一部分配置用于同步Provider进程实例的状态,典型的如超时时间,数据编码的序列化方式等
  4. 最后一部分是自定义的元数据,这部分内容区别于以上框架预定于的各项配置,给了用户更大的灵活性,用户可任意扩展并添加自定义元数据,以进一步丰富实例状态。

Dubbo的优势,

  1. 地址发现聚合的key就是RPC粒度的服务
  2. 注册中心同步的数据不止包含地址,还包含了各种元数据以及配置
  3. 得益于1与2,Dubbo实现了支持应用,RPC服务,方法粒度的服务治理能力

一、Dubbo服务发现设计

Dubbo提供的是一种Client-Based的服务发现机制,依赖第三方注册中心组件来协调服务发现过程,支持常用的注册中心如Nacos、Connsul、Zookeeper等

Dubbo服务发现机制的基本工作原理图:

服务发现包含提供者、消费者和注册中心三个参与角色,其中,Dubbo提供者实例注册URL地址到注册中心,注册中心负责对数据进行聚合,Dubbo消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。

1.面向百万实例集群的服务发现机制

区别于其他很多微服务框架的是,Dubbo3的服务发现机制诞生于阿里巴巴超大规模微服务电商集群实践场景,因此,其在性能、可伸缩性、易用性等方面的表现大幅领先于业界大多数主流开源产品。是企业面向未来构建可伸缩的微服务集群的最佳选择。

首先,Dubbo注册中心以应用粒度聚合实例数据,消费者按消费需求精准订阅,避免了大多数开源框架如Istio、Spring Cloud等全量订阅带来的性能瓶颈。

其次,Dubbo SDK在实现上对消费端地址列表处理过程做了大量优化,地址通知增加了异步、缓存、bitmap等多种解析优化,避免了地址更新常出现的消费端进程资源波动。

最后,在功能丰富度和易用性上,服务发现除了同步IP、port等端点基本信息到消费者外,Dubbo还将服务端的RPC/HTTP服务及其配置的元数据信息同步到消费端,这让消费者,提供者两端的更细粒度的协作称为可能,Dubbo基于此机制提供了很多差异化的治理能力。

高效地址推送实现:

从注册中心视角来看,它负责以应用名(Dubbo.application.name)对整个集群的实例地址进行聚合,每个对外提供服务的实例将自身的应用名,实例ip:port地址信息(通过还包含少量的实例元数据,如机器所在区域、环境等)注册到注册中心。

Dubbo2.0版本注册中心以服务粒度聚合实例地址,比应用粒度更细,也就意味着传输的数据量更大,因此,在大规模集群下也遇到一些性能问题。

针对Dubbo2与Dubbo3跨版本数据模型不一致的问题,Dubbo3给出了平滑迁移方案,可做到模型变更对用户无感。

每个消费服务的实例从注册中心订阅实例地址列表,相比于一些产品直接将注册中心的全量数据(应用+实例地址)加载到本地进程,Dubbo实现了按需精准订阅地址信息。比如一个消费者应用依赖app1、app2,则只会订阅app1、app2的地址列表更新,大幅度减轻了冗余数据推送和解析的负担。

丰富的元数据配置

除了于注册中心的交互,Dubbo3的完整地址发现过程还有一条额外的元数据通路,称之为元数据服务(MetadataService),实例地址于元数据共同组成了消费者端有效的地址列表。

完整工作流程如上图所示,首先,消费者从注册中心接收到地址信息(ip:port),然后于提供者建立连接并通过元数据服务读取到端的元数据配置信息,两部分信息共同组成了Dubbo消费端有效的面向服务的地址列表。以上两个步骤都是在实际的RPC服务调用发生之前的。

2.配置方式

Dubbo服务发现扩展了多种注册中心组件支持,如Nacos、Zookeeper、Consul、Redis、Kubernetes等,可以通过配置切换不通实现,同时还支持鉴权、命名空间隔离等配置。具体配置方式请查看SDK文档。

Dubbo还支持一个应用内配置多注册中心的情形如双注册、双订阅等,这对于实现不同集群地址数据互通、集群迁移等场景非常有用处,官网任务里有关于这部分的示例说明。

3.自定义扩展

注册中心适配支持自定义扩展实现。

1.设计目标:

显著降低服务发现过程的资源消耗,包括提升注册中心容量上限、降低消费端地址解析资源占用等,使得Dubbo3框架能够支持更大规模集群的服务治理,实现无限水平扩展。

适配底层基础设施服务发现模型,如K8s、Service Mesh等。

2.背景:

Dubbo接口级别服务发现-基本原理

Dubbo的地址发现是通过借助注册中心组件协调Provider与Consumer实例地址的过程。

Provider实例通过待定key向注册本机可访问地址

注册中心通过key将Provider实例地址聚合

Consumer通过订阅特定key实时从注册中心接收地址变更

Dubbo最经典的工作原理图来看,Dubbo从设计之初就内置了服务地址发现的能力,Provider注册地址到注册中心,Consumer通过订阅实时获取注册中心的地址更新,在收到地址列表后,consumer基于特定的负载均衡策略发起对Provider的RPC的调用。

在这个过程中:

  1. 每个Provider通过特定的key向注册中心注册本机可访问地址
  2. 注册中心通过这个key对Provider实例地址进行聚合
  3. Consumer通过同样的key从注册中心订阅,以便及时收到聚合后的地址列表

Dubbo接口级别2服务发现---数据与结构1

接口级别地址发现的内部数据结构进行详细分析如下:

首先,右下角Provider实例内部的数据与行为,Provider部署的应用中通常会有多个service,也就是Dubbo2中的服务,每个service都可能会有其独有的配置,通常情况下service服务发布的过程,其实就是基于这个服务配置生成地址URL的过程,生成的地址数据如图所示,同样的,其他服务也都会生成地址。

其次,看一下注册中心的地址数据存储结构,注册总线以service服务名为数据划分依据,将一个服务下的所有地址数据都作为子节点进行聚合,子节点的内容就是实际可访问的IP地址,也就是我们Dubbo中URL,格式就是刚才Provider实例生成的。

URL地址数据可以划分为几份:

  1. 首先是实例可访问地址,主要信息包含IP port,是消费端将基于这条数据生成tcp网络连接,作为后续RPC数据的传输载体。
  2. 其次是RPC元数据,元数据用于定义和描述一次RPC请求,一方面表明这条地址是与其具体的RPC服务有关的,它的版本号,分组以及方法相关信息
  3. 下一部分是RPC配置数据,部分配置用于控制RPC调用的行为,还有一部分配置用于同步Provider进程实例的状态,典型的如超时时间,数据编码的序列化方式等
  4. 最后一部分是自定义的元数据,这部分内容区别于以上框架预定于的各项配置,给了用户更大的灵活性,用户可任意扩展并添加自定义元数据,以进一步丰富实例状态。

Dubbo的优势,

  1. 地址发现聚合的key就是RPC粒度的服务
  2. 注册中心同步的数据不止包含地址,还包含了各种元数据以及配置
  3. 得益于1与2,Dubbo实现了支持应用,RPC服务,方法粒度的服务治理能力

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

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

相关文章

MySQL 被 PG 干翻了。。

出品 | OSC开源社区(ID:oschina2013) Stack Overflow 发布了 2023 年开发者调查报告,据称共计超过 9 万名开发者参与了此次调查。 完整报告包含了受访开发者画像,以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于…

ICC2: 工具是如何控制局部利用率的?

分析congestion map时不难发现,route congestion高的地方局部利用率往往要比周围低,这时疑问就来了,既然standard cell的分布不是均匀的,那局部再降一降彻底解决congestion问题不好嘛?工具是如何控制这种congestion driven的行为的呢? 在place_opt以及clock_opt的log里都…

Apache Atlas高级搜索语法示例

from hive_table;hive_table from hive_table where name xxx or name yyy from hive_table where name ["xxx", "yyy"] from hive_table where name LIKE *_xxx hive_db where name like "???dm?*" hive_column where table.name …

Dcat Admin 2 集成富文本编辑器 wangEditor 5

由于默认的 TinyMCE 个人不是很喜欢,所以替换成国产的富文本编辑器 wangEditor Dcat Admin 文档示例:集成富文本编辑器 wangEditor 但是官方的示例是针对 wangEditor 4 编写的,这里仅指出对版本 5 的差异部分 获取文件 将以下三个文件保存…

快码住! 结构体内存对齐(计算结构体大小) 干货满满!

文章目录 结构体内存对齐规则结构体大小计算为什么存在内存对齐?设计结构体的技巧如何修改默认对齐数? 结构体内存对齐规则 我们知道,整型变量有自己的大小,浮点型变量有自己的大小,数组也有自己的大小,那…

血流动力学与血压(一)--平均动脉压

平均动脉压 在血管血流动力学研究中,心血管系统通常被认为是一个简单的液压回路,由泵(心脏)组成,泵(心脏)有节奏地活动(收缩 --> 舒张 --> 收缩 --> 舒张 --> 收缩…&am…

中国一重集中采购平台的建设经历和亮点

中国一重前身为第一重型机器厂,是“一五”期间建设156项重点工程项目之一,始建于1954年,是中央管理的涉及国家安全和国民经济命脉的国有重要骨干企业之一,是国家创新型试点企业、国家高新技术企业,拥有国家级企业技术中…

java 校园管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 校园管理系统 是一套完善的系统源码,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,以及相应配套的设计文档,系统主要采用B/S模式开发。 研究的基本内容是基于Web的校园管理系统&…

访问不到阿里云服务器端口

这里前台在主机上 然后访问服务器上的node后台 一直访问不到 不能连入阿里云服务器后台 连不上公网ip端口 解决方案 登录阿里云 进入云服务器 2、管理控制台 3、网络与安全——>安全组 4、安全组里面点击配置规则 5、手动添加 即可

《项目实战》构建SpringCloud alibaba项目(三、构建服务方子工程store-user-service)

系列文章目录 构建SpringCloud alibaba项目(一、构建父工程、公共库、网关) 构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service) 构建SpringCloud alibaba项目(三、构建服务方子工程stor…

python学习——NumPy数值计算基础

目录 NumPy数值计算基础1.array创建数组及其属性2.其他创建方式3.数据类型及其转换4.生成随机数5.数组的索引和切片6.改变数组形态【案例】两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办 …

《网络安全0-100》单钥加密体制

单钥加密体制 DES算法 DES属于对称密码算法中的分组加密(块加密),和流密码相对应。DES算法将明文分为若干个64位块(不足补充),秘钥为56位(8位校验位)。DES算法流程图如下 接下来,进行DES算法关键步骤的逐步解析: IP置换 IP置换…

Python学习——数据分组统计、分组运算及透视

目录 1 数据分组统计 groupby1.1 按照单列进行分组统计df.groupby(列名).count()1.2 按照多列进行分组统计 df.groupby([列名1,列名2]).count()1.3 分组填充缺失值 df.groupby(需填充列名).apply(lambda x:x.fillna(x.mean())) 2 分组运算 agg2.1 传入标准函数 df.groupby(班级…

机器学习之KNN(K近邻)算法

1 KNN算法介绍 KNN算法又叫做K近邻算法,是众多机器学习算法里面最基础入门的算法。KNN算法是最简单的分类算法之一,同时,它也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法,它看起来和Kmeans相似(Kmeans是…

乱七八糟知识点

知识点汇总 看一个文件的前n行、指定行、末n行idea 创建快捷测试文件Mac版 pycharm 快捷键ideaMac 终端MySQL 安装完,初始密码一般存在vim操作搜索引擎 看一个文件的前n行、指定行、末n行 # 先准备一个文件 ➜ tmp cat a.txt 001 002 003 004 005 006# 查看前2行…

不变的是需求,变化的是解决方法和工具:探讨iPaaS与ESB的差异

在企业数字化转型过程中,企业需要面临日益复杂的业务和数据集成挑战。为了应对这些挑战,需要借助适当的解决方法和工具来实现系统间的通信和数据传输。在这方面,iPaaS(Integration Platform as a Service)和ESB&#x…

STM32外设系列—OLED

文章目录 一、OLED简介二、数据手册分析2.1 供电电压2.2 引脚定义2.3 原理图介绍2.4 数据手册程序 三、IIC通信3.1 什么是IIC3.2 IIC通信协议3.3 IIC主从通信过程3.3.1 写入数据3.3.2 读取数据 四、OLED程序设计4.1 OLED初始化4.2 OLED控制函数编写4.2.1 OLED显示开/关程序4.2.…

ECCV2022 多目标跟踪(MOT)汇总

一、《Towards Grand Unification of Object Tracking》 作者: Bin Yan1⋆, Yi Jiang2,†, Peize Sun3, Dong Wang1,†,Zehuan Yuan2, Ping Luo3, and Huchuan Lu School of Information and Communication Engineering, Dalian University of Technology, China 2 ByteDance …

企业级开发环境配置(JDK、tomcat、Maven、Git、IDEA个性化界面的设定)

企业级开发环境配置(JDK、tomcat、Maven、Git、IDEA个性化界面的设定) 一、JRE,JDK8安装和环境变量配置1. 进入Oracle官网进行jdk8安装包的下载2. 选择安装路径,安装路径不要出现中文以及空格3. 环境变量的配置4. 安装验证 二、Tomcat 安装和…

性能测试面试题:如何测试App性能?(面试必问)

为什么要做App性能测试? 如果APP总是出现卡顿或网络延迟的情况,降低了用户的好感,用户可能会抛弃该App,换同类型的其他应用。如果APP的性能较好,用户体验高,使用起来丝滑顺畅,那该应用的用户粘…