认识doubbo和rpc

开个新坑,和大家一起学习Dubbo 3.X。我们按照一个由浅入深顺序来学习,先从使用Dubbo开始,再深入Dubbo的核心原理。

今天我们就从认识Dubbo开始,整体的内容可以分为3个部分:

  • Dubbo是什么
  • RPC是什么
  • Dubbo的架构

正式开始前我先叠个甲,通常网上很多资料将RPC称之为协议,并将RPC与HTTP进行比较,目前来看这已经成为“不太正确”但主流的说法了。而我个人是个原教旨主义者,更倾向使用RPC原初的解释,因此可能和你看到的部分文章有一定的差别。另外,因个人能力有限,若出现错误希望大家不吝赐教。

Tips:RPC的章节主要参考Andrew D. Birrell与Bruce Jay Nelson于1984年发表的论文《Implementing Remote Procedure Calls》,通常认为这篇文章是“现代”RPC的起源(实际上,1976年就有文献开始讨论RPC了)。

Dubbo是什么?

我们来看Apache Dubbo社区是怎样描述Dubbo的:

Apache Dubbo是一款RPC服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用Dubbo提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

Dubbo是具有高性能,可拓展等特性的RPC框架,除此之外,Dubbo还提供了服务治理的能力。

Dubbo的“野心”不仅仅在于提供一套完整的RPC调用及服务治理框架,更是将Dubbo与编程语言解绑,提供了大部分主流语言的版本。

Tips:该图截自Apache Dubbo社区在B站上发布的《5分钟快速了解Apache Dubbo》。

RPC是什么?

既然Dubbo的本质是RPC框架,那么在继续深入学习Dubbo前,我们有必要先来了解下RPC是什么。

RPC(Remote Procedure Call),即远程过程调用。《Implementing Remote Procedure Calls》中是这么解释的:

The idea of remote procedure calls (hereinafter called RPC) is quite simple. It is based on the observation that procedure calls are a well-known and well-understood mechanism for transfer of control and data within a program running on a single computer.Therefore, it is proposed that this same mechanism be extended to provide for transfer of control and data across a communication network.

RPC的思想是基于对单机程序中的传输和处理数据的过程调用的观察,并建议将相同的机制拓展到远程网络通信上的结果。

是不是有点难理解?没关系,我们换一个简单点的说法,来看Sahn Lam在油管视频《What is RPC? gRPC Introduction》中的解释,视频中他通过本地过程调用与远程过程调用的对比进行解释:

A local procedure call is a function call within a process to execute some code.A remote procedure call enables one machine to invoke some code on another machine as if it is a local fuction call from a user's perspective.

这个解释就非常清晰了,RPC的核心是希望远程调用可以像本地函数调用一样简单。Birrell与Nelson正是基于此目标,给出了RPC服务的设计参考:

Birrell与Nelson的设计是基于存根(stub,即图中的User-stub和Server-stub)这个概念的,系统整体包含5个部分:

  • 用户端,服务调用方;
  • 用户端存根,保存函数声明,负责请求参数的打包与响应参数的解包;
  • RPC Runtime,选择合适的方式(协议)传输数据;
  • 服务端存根,保存函数声明,负责请求参数的解包与响应参数的打包;
  • 服务端,服务提供方。

用户端和服务端的开发者只需要从存根中获取并调用目标函数,而无需考虑目标函数所在服务器的地址和传输数据的方式,是非常契合“远程调用可以像本地函数调用一样简单”这样的愿景的。

好了,到这里我们已经对“原教旨主义”的RPC有了整体的认知,现在来回答一个不太“正经”的问题:既然有了HTTP为什么还要RPC?

这是个挺常见的初学误区,将RPC与HTTP划上了等号。首先RPC是一种思想(我觉得更像是简化远程服务调用的目标),而HTTP是应用层的传输协议,上图中“两个”RPC Runtime传输数据时可以使用HTTP,也可以是其它能够完成数据传输的方式。其次,“现代”RPC的理论诞生于1984年,而HTTP是1989年发起的,因此这个问题反过来问还显得稍微合理些。最后,HTTP的诞生的目的是接收和发布HTML页面,即在浏览器与服务端之间进行数据的传输,而不是应用在两个服务端之间的数据传输。

Tips

  • Sahn Lam和Alex Xu是油管频道ByteByteGo的管理者,拥有有43万粉丝,另外他们也是《System Design Interview》的作者;
  • RPC的系统设计图截自《Implementing Remote Procedure Calls》;
  • 实际的项目中,没有严格的用户端与服务端的区分,服务都可以提供对外的接口,也可以使用外部服务的接口。

Dubbo的架构

Dubbo 3.0开始,Dubbo的官方文档使用了新的抽象架构:

将Dubbo从整体划分了两层:

  • Dubbo数据面:提供RPC功能的核心部分,通过RPC协议进行通信,定义了调用规范,完成了数据交互的编码和解码功能做;
  • 服务治理控制面:服务治理的抽象,包含了注册中心,流量管控策略,Dubbo Admin控制台等。

Dubbo 3.0之前,官方给出过一张非常复杂的Dubbo 2.X的设计图(以下的部分是官方原文):

图例说明

  • 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口;
  • 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service和Config层为API,其它各层均为SPI
  • 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类;
  • 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。

Dubbo提供了非常丰富的接口,这些都是Dubbo的可被用户自定义的拓展点。Dubbo自身也采用了Microkernel+Plugin(微内核+拓展)的模式,Microkernel只负责组装Dubbo对Plugin的默认实现。

各层说明

  • config配置层:对外配置接口,以ServiceConfig,ReferenceConfig为中心,可以直接初始化配置类,也可以通过Spring解析配置生成配置类
  • proxy服务代理层:服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory
  • registry注册中心层:封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory,Registry,RegistryService
  • cluster路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster,Directory,Router,LoadBalance
  • monitor监控层:RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory,Monitor,MonitorService
  • protocol远程调用层:封装RPC调用,以Invocation,Result为中心,扩展接口为Protocol,Invoker,Exporter
  • exchange信息交换层:封装请求响应模式,同步转异步,以Request,Response为中心,扩展接口为Exchanger,ExchangeChannel,ExchangeClient,ExchangeServer
  • transport网络传输层:抽象Mina和Netty为统一接口,以Message为中心,扩展接口为Channel,Transporter,Client,Server,Codec
  • serialize数据序列化层:可复用的一些工具,扩展接口为Serialization,ObjectInput,ObjectOutput,ThreadPool

有些文章会将Service纳入Dubbo的层级结构中,但实际上Service是用户业务逻辑的部分,严格意义上并不是Dubbo自身的组成。

支持协议

协议是RPC框架的核心功能,定义了数据的传输格式,除了数据本身外,还应包含控制信息,如:序列化方式,超时时间等。

Dubbo支持了非常多的协议,在这里我将它们分成5类:

不要看到Dubbo支持了这么多协议就害怕,它虽然支持的多,但我们不必每个协议都深入。未来我们在学习到协议的部分是,会重点的学习Dubbo协议,Dubbo 3.X主推的Triple协议以及支持HTTP/2的gRPC,其余协议我们大致了解其特性即可。

Tips:实际上Dubbo 2.X的官方文档中有非常详细的设计文档,不知道为什么Dubbo 3.0中删除了这部分内容。

结语

好了,到目前为止希望你能够建立起一个对Dubbo设计的整体认知。设计虽然复杂,支持的协议虽然很多,但我们今天的目的不是“一文弄懂”。我们以理解RPC和Birrell与Nelson给出的设计为主,其次我们需要建立对Dubbo的设计的整体认知,看看它Dubbo在Birrell与Nelson的基础上做出了哪些拓展。如果有兴趣的话,可以参考Birrell与Nelson给出的架构来设计自己的RPC服务,需要考虑如何将服务保存到存根中?使用哪种方式进行交互?交互的数据结构该如何设计?


如果本文对你有帮助的话,还请多多点赞支持。如果文章中出现任何错误,还请批评指正。最后欢迎大家关注分享硬核Java技术的金融摸鱼侠王有志,我们下次再见!

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

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

相关文章

使用navicate快速将Excel中的数据导入到数据库

表名称上右键,导入向导 这种方式速度还是很快的,18万条数据,3分钟左右就导入进去了。

postgresql-多表连接

postgresql-多表连接 内连接查询左外连接查询右外连接查询全外连接查询交叉连接查询简写 总结 内连接查询 内连接用于返回两个表中匹配的数据行,使用关键字INNER JOIN表示,也可以简写成JOIN; selecte.first_name ,d.department_id fromcps…

zookeeper 3.8.1安装和入门使用

1、zookeeper环境搭建(Windows单机版) 1.1、 前提 必须安装jdk 1.8,配置jdk环境变量,步骤略 1.2、安装zookeeper 地址:https://zookeeper.apache.org/ 1.2.1、选择releases版本 1.2.2、下载安装包并解压 1.2.3、配…

网络丢包问题,敢不敢这样定位?

下午好,我的网工朋友。 所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了。 这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率。 丢包…

3种轻量化框架总结

一般的卷积神经网络的参数量和计算量都很大,很难应用在资源有限的场景中。为了解决这个问题,通常是在训练好的模型上进行优化,如通过对模型压缩减少计算量和存储成本,也可以通过剪枝连接方法去掉了不重要的神经元连接或者通道修剪…

无涯教程-JavaScript - BESSELY函数

描述 BESSELY函数针对x的指定顺序和值返回Bessel函数Yn(x)(也称为Weber函数或Neumann函数)。 语法 BESSELY(X, N)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.RequiredNThe order of the function. If n is not an integer, it is tr…

Spring中Endpoint、HasFeatures、NamedFeature和Actuator的关系及实现原理

文章目录 1. 关系缘由2. Actuator简介及简单使用3. Endpoint和Actuator的关系4. Endpoint和HasFeatures的关系5. Endpoint和HasFeatures原理解析5.1 Endpoint的实现原理5.2 HasFeatures的实现原理 6. 个人闲谈 1. 关系缘由 我们经常可以在Springboot中看到Endpoint注解&#x…

什么牌子的led台灯质量好?热门的Led护眼台灯推荐

led台灯有环保无污染、耗能低、长寿命等优点,适合用在阅读、书写、批阅等办公或学习的场所。而挑选LED台灯时,分散光挡板做的比较好的优先选择,能分散大量蓝光,对眼睛危害较小。下面,小编为大家推荐五款质量好的led护眼…

EF框架基础应用入门

文章目录 一、介绍二、EF6框架基础1. 数据模型和实体类2. 数据库上下文(DbContext)介绍3. 配置数据模型与数据库表的映射关系 两种方式Fluent API和数据注解Fluent API数据注解 4. 数据库迁移(Migration)概述a. 创建初始迁移b. 更…

Vulnhub: Masashi: 1靶机

kali:192.168.111.111 靶机:192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容,tftp服务在1337端口 sshfolder.txt内容&#xff0c…

日200亿次调用,喜马拉雅网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近,尼恩指导一个小伙伴简历,写了一个《API网关项目》,此项目帮这个小伙拿到 字节/阿里/微博/…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——减法原理除法原理

减法原理 正面难则反着做(“ − - −”号) 【思路】当出现“至少、至多”、“否定用语"等正面较难分类的题目,可以采用反面进行求解,注意部分反面的技巧以及“且、或"的反面用法。 除法原理 看到相同,定序用除法消序( “ &quo…

python批量下载csdn文章

声明:该爬虫只可用于提高自己学习、工作效率,请勿用于非法用途,否则后果自负 功能概述: 根据待爬文章url(文章id)批量保存文章到本地;支持将文中图片下载到本地指定文件夹;多线程爬取; 1.爬取…

插入排序——希尔排序

1、简述: 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。 希尔排…

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么?2、DMA介绍3、DMA 中的数据传输如何进行?4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式(Burst Mode)6.2 循环窃取模式…

无人机集群路径规划MATLAB:孔雀优化算法POA求解无人机集群三维路径规划

一、无人机模型简介 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 二、孔雀优化算法POA介绍 孔雀优化算法( Peafowl Optimization Algorithm, POA), 是由 Jingbo Wang 等于2022 年提出的一种群体智能优化算法。其灵感来源于孔雀的群体行为。 智能优化算法&am…

Nebula数据库安装

1、什么是nebula NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。 2、利用docker-compose安装Nebula数据库 1、前提条件 主机中安装了docker主机中安装了Docke…

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络分类研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【git】【IDEA】在idea中使用git

目录 一、 在IDEA中配置git 二、 获取git仓库 2.1 本次初始化仓库 2.2 从远程仓库克隆 三、 本地仓库操作 3.1 将文件加入暂存区 3.2 将暂存区的文件提交到版本库 3.3 快捷键 使用快捷键 实现加入到暂存区与提交到版本库 3.4 查看日志 Show History 四、 远程仓库操…

springboot初试elasticsearch

引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…