Dubbo知识点大全

分布式应用场景有高并发,高可扩展和高性能的要求。还涉及到,序列化/反序列化,网络,多线程以及设计模式的问题。幸好 Dubbo 框架将上述知识进行了封装,让程序员能够把注意力放到业务上。

概念和架构

  • Provider:暴露服务的服务提供方
  • Consumer:调用远程服务消费方
  • Registry:服务注册与发现注册中心
  • Monitor:监控中心和访问调用统计
  • Container:服务运行容器

Dubbo 服务器注册与发现的流程?

  • 服务容器Container负责启动,加载,运行服务提供者。
  • 服务提供者Provider在启动时,向注册中心注册自己提供的服务。
  • 服务消费者Consumer在启动时,向注册中心订阅自己所需的服务。
  • 注册中心Registry返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者Consumer,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者Consumer和提供者Provider,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor。

Dubbo 分层

Dubbo 是一款高性能 Java RPC 架构。它实现了面向接口代理的 RPC 调用,服务注册和发现,负载均衡,容错,扩展性等等功能。

Dubbo 大致上分为三层,分别是:

  • 业务层
  • RPC 层
  • Remoting 层

Dubbo 的三层结构

从上图中可以看到,三层结构中包含了 Dubbo 的核心组件。他们的基本功能如下,对于比较常用的组件,会在后面的篇幅中详细讲解。

组件功能列表

这里将这些组件罗列出来,能有一个感性的认识。具体开发的时候,知道运用哪些组件。

Dubbo 调用工作流

Dubbo 框架是用来处理分布式系统中,服务发现与注册以及调用问题的,并且管理调用过程。

上面介绍了 Dubbo 的框架分层,下图的工作流就展示了他们是如何工作的。

Dubbo 服务调用流程图

工作流涉及到服务提供者(Provider),注册中心(Registration),网络(Network)和服务消费者(Consumer):

  • 服务提供者在启动的时候,会通过读取一些配置将服务实例化。
  • Proxy 封装服务调用接口,方便调用者调用。客户端获取 Proxy 时,可以像调用本地服务一样,调用远程服务。
  • Proxy 在封装时,需要调用 Protocol 定义协议格式,例如:Dubbo Protocol。
  • 将 Proxy 封装成 Invoker,它是真实服务调用的实例。
  • 将 Invoker 转化成 Exporter,Exporter 只是把 Invoker 包装了一层,是为了在注册中心中暴露自己,方便消费者使用。
  • 将包装好的 Exporter 注册到注册中心。
  • 服务消费者建立好实例,会到服务注册中心订阅服务提供者的元数据。元数据包括服务 IP 和端口以及调用方式(Proxy)。
  • 消费者会通过获取的 Proxy 进行调用。通过服务提供方包装过程可以知道,Proxy 实际包装了 Invoker 实体,因此需要使用 Invoker 进行调用。
  • 在 Invoker 调用之前,通过 Directory 获取服务提供者的 Invoker 列表。在分布式的服务中有可能出现同一个服务,分布在不同的节点上。
  • 通过路由规则了解,服务需要从哪些节点获取。
  • Invoker 调用过程中,通过 Cluster 进行容错,如果遇到失败策略进行重试。
  • 调用中,由于多个服务可能会分布到不同的节点,就要通过 LoadBalance 来实现负载均衡。
  • Invoker 调用之前还需要经过 Filter,它是一个过滤链,用来处理上下文,限流和计数的工作。
  • 生成过滤以后的 Invoker。
  • 用 Client 进行数据传输。
  • Codec 会根据 Protocol 定义的协议,进行协议的构造。
  • 构造完成的数据,通过序列化 Serialization 传输给服务提供者。
  • Request 已经到达了服务提供者,它会被分配到线程池(ThreadPool)中进行处理。
  • Server 拿到请求以后查找对应的 Exporter(包含有 Invoker)。
  • 由于 Export 也会被 Filter 层层包裹
  • 通过 Filter 以后获得 Invoker
  • 最后,对服务提供者实体进行调用。

上面调用步骤经历了这么多过程,其中出现了 Proxy,Invoker,Exporter,Filter。

实际上都是调用实体在不同阶段的不同表现形式,本质是一样的,在不同的使用场景使用不同的实体。

例如 Proxy 是用来方便调用者调用的。Invoker 是在调用具体实体时使用的。Exporter 用来注册到注册中心的等等。

后面我们会对具体流程进行解析。如果时间不够无法阅读完全文,可以把上面的图保存。

服务暴露实现原理

上面讲到的服务调用流程中,开始服务提供者会进行初始化,将暴露给其他服务调用。服务消费者也需要初始化,并且在注册中心注册自己。

服务提供者和服务消费者暴露服务

首先来看看服务提供者暴露服务的整体机制:

服务提供者暴露服务流程

开篇的大图中列举了 Config 核心组件,在服务提供者初始化的时候,会通过 Config 组件中的 ServiceConfig 读取服务的配置信息。

这个配置信息有三种形式,分别是 XML 文件,注解(Annoation)和属性文件(Properties 和 yaml)。

在读取配置文件生成服务实体以后,会通过 ProxyFactory 将 Proxy 转换成 Invoker。

此时,Invoker 会被定义 Protocol,之后会被包装成 Exporter。最后,Exporter 会发送到注册中心,作为服务的注册信息。上述流程主要通过 ServiceConfig 中的 doExport 完成。

下面是针对多协议多注册中心进行源代码分析:

doExportUrls 方法

doExportUrlsFor1Protocol 方法-1

doExportUrlsFor1Protocol 方法-2

上面截取了服务提供者暴露服务的代码片段,从注释上看整个暴露过程分为七个步骤:

  • 读取其他配置信息到 map 中,用来后面构造 URL。
  • 读取全局配置信息。
  • 配置不是 remote,也就是暴露本地服务。
  • 如果配置了监控地址,则服务调用信息会上报。
  • 通过 Proxy 转化成 Invoker,RegistryURL 存放的是注册中心的地址。
  • 暴露服务以后,向注册中心注册服务信息。
  • 没有注册中心直接暴露服务。

一旦服务注册到注册中心以后,注册中心会通过 RegistryProtocol 中的 Export 方法将服务暴露出去,并依次做以下操作:

  • 委托具体协议进行服务暴露,创建 NettyServer 监听端口,并保持服务实例。
  • 创建注册中心对象,创建对应的 TCP 连接。
  • 注册元数据到注册中心。
  • 订阅 Configurators 节点。
  • 如果需要销毁服务,需要关闭端口,注销服务信息。

说完了服务提供者的暴露再来看看服务消费者。

服务消费者消费服务机制

服务消费者首先持有远程服务实例生成的 Invoker,然后把 Invoker 转换成用户接口的动态代理引用。

框架进行服务引用的入口点在 ReferenceBean 中的 getObject 方法,会将实体转换成 ReferenceBean&#

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统---nginx(1)服务

目录 一.Nginx概述 1.定义 2.Nginx模块作用 (1)main模块 (2)stream服务模块 (3)邮件服务模块 (4)第三方模块 (5)events模块 (6&#xff0…

智慧公厕的目的和意义是什么?

智慧公厕是近年来城市建设中的一项重要举措,其目的在于实现公共厕所的智慧化管理,为市民群众提供更好的服务体验,助力智慧城市和数字环卫的发展,提升社会公共卫生服务水平。 与此同时,智能公厕也具有重要的意义&#x…

泽攸科技JS系列高精度台阶仪在半导体领域的应用

泽攸科技JS系列高精度台阶仪是一款先进的自主研发的国产台阶仪,采用了先进的扫描探针技术。通过扫描探针在样品表面上进行微观测量,台阶仪能够准确获取表面形貌信息。其工作原理基于探针与样品表面的相互作用力,通过测量探针的微小位移&#…

Jessibuca 插件播放直播流视频

jessibuca官网&#xff1a;http://jessibuca.monibuca.com/player.html git地址&#xff1a;https://gitee.com/huangz2350_admin/jessibuca#https://gitee.com/link?targethttp%3A%2F%2Fjessibuca.monibuca.com%2F 项目需要的文件 1.播放组件 <template ><div i…

汽车改装轮毂需要备案吗?哪些不需要更换轮毂?

如今&#xff0c;改装轮毂已经成为很多汽车爱好者的必备选择。 在改装轮毂之前&#xff0c;还有一些问题需要先弄清楚。 网友最常问的问题是&#xff1a;改装轮毂需要注册吗&#xff1f; 今天综艺猴就和朋友们聊聊这个问题。 请问还有哪些改造项目需要备案&#xff1f; 哪些是…

【Unity】如何从现有项目中抽取好用的资源

【背景】 在做Unity项目的过程中引入各种各样的Package&#xff0c;有的Package很大&#xff0c;但是觉得非常有用的可能只是几个Prefab或者Material等。如果直接拷贝想要的Prefab和Material&#xff0c;又需要自己确认所有有依赖关系的资源。 如果能将所有日常经受项目中自己…

电子病历系统

电子病历系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

早产儿视网膜病变分期,自动化+半监督(无需大量医生标注数据)

早产儿视网膜病变 ROP 分期 提出背景解法框架解法步骤一致性正则化算法构建思路 实验 提出背景 论文&#xff1a;https://www.cell.com/action/showPdf?piiS2589-0042%2823%2902593-2 早产儿视网膜病变&#xff08;ROP&#xff09;目前是全球婴儿失明的主要原因之一。 这是…

有效电子邮件地址的最大长度是多少个符号?

有效电子邮件地址怎么填&#xff1f;如何校验邮件地址的有效性&#xff1f; 电子邮件已经成为我们日常生活和工作中不可或缺的一部分。有效电子邮件地址的正确性对于确保信息传递的准确和及时至关重要。那么&#xff0c;你可能会好奇&#xff0c;有效电子邮件地址的最大长度是…

数据结构知识点总结-线性表(3)-双向链表定义、循环单链表、、循环双向链表、静态链表、顺序表与链表的比较

双向链表定义 单链表结点中只有一个指向其后继的指针&#xff0c;这使得单链表只能从头结点依次顺序地向后遍历。若要访问某个结点的前驱结点&#xff08;插入、删除操作时&#xff09;&#xff0c;只能从头开始遍历&#xff0c;访问后继结点的时间复杂度为 O(1) &#xff0c; …

Python采集二手车数据信息实现数据可视化展示

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 模块使用: requests >>> pip install requests csv 数据可视化: pandas >>> pip install pandas pyech…

【前后端的那些事】文件上传组件封装

文章目录 效果前端代码后端代码组件封装 效果 前端代码 /views/file/file.vue <template><el-row><el-uploadv-model:file-list"fileList"class"upload-demo"multiple:auto-upload"false":on-preview"handlePreview"…

与Sora一样能生成视频、图像,还能一次解读100万数据!

大语言模型&#xff08;LLM&#xff09;在生成文本内容方面非常强&#xff0c;但在理解、生成视频、图像等方面略显不足。尤其是在Sora一夜爆红之后&#xff0c;让人们意识到未来主流模型一定是文本音频图像视频的多模态生成、理解功能。 因此&#xff0c;加州大学伯克利分校的…

linux下查看某个命令在哪里个安装包程序下,以ifconfig命令举例子

yum list | grep net-tools &#xff08;查看yum安装列表中有没有安装指定的软件工具&#xff09;

用 SIL 和 PIL 仿真测试生成的代码

目录 PIL 的目标连接配置 对顶层模型运行 SIL 或 PIL 仿真 对 Model 模块运行 SIL 或 PIL 仿真 SIL 或 PIL 模块仿真 硬件实现设置 使用软件在环 (SIL) 和处理器在环 (PIL) 仿真,测试模型组件与从组件生成的生产代码之间的数字等效性。 使用 SIL 仿真,在您的开发…

JAVA高并发——Future模式

文章目录 1、Future模式解析2、Future模式的主要参与者3、Future模式的简单实现4、JDK中的Future模式5、Guava对Future模式的支持 1、Future模式解析 Future模式是多线程开发中非常常见的一种设计模式&#xff0c;它的核心思想是异步调用。当我们需要调用一个函数时&#xff0…

GaussDB SQL调优:选择合适的分布列

一、背景 GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数…

王栎鑫前妻晒情侣装,疑与糊糊复合?网友:真的假的

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 吴雅婷元宵晒情侣装&#xff0c;网友热议是否与王栎鑫复合&am…

春秋招笔试题库整理与购买-值得投资的资源

作为一位资深的IT工程师&#xff0c;我深知求职过程中的不易&#xff0c;尤其是在春秋招季节&#xff0c;竞争激烈&#xff0c;每一个环节都可能成为决定成败的关键。因此&#xff0c;我特别了一份覆盖多家知名企业的秋招笔试题库&#xff0c;希望能帮助到正在备战的朋友们。 这…

leetcode移动零

leetcode移动零 Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements. Note that you must do this in-place without making a copy of the array. Example 1: Input: nums [0,1,0,3,12] Output…