Dubbo协议解析过程

news2024/11/26 10:28:35

Dubbo协议解析过程

Dubbo有哪些底层协议

同学们以为Dubbo只有一个RPC协议吗?非也,既然是阿里巴巴出品的开源项目,那自然秉承了“包罗万象”的一贯传统。Dubbo的底层有支持多达9种通信协议,并且他们都有各自的适用场景。我们快速的一扫而过:

  1. Dubbo本尊这也是官方首推的底层通信协议
  2. RMI Java界的老法师可能会对RMI比较熟悉,没错,这个就
    是JDK中“java.rmi”包下的实现,底层采用阻塞式(同步传输)的短连接+JDK中标准的二进制序列化。
    • 适用场景参数数据包大小不一,服务提供者和服务消费者的个数相近
  3. Hessian用于集成Hessian的服务,基于HTTP短连接,采用S ervlet向外暴露服务
    • 适用场景参数数据包较大,服务提供者的数量远多于消费者数量
  4. HTTP最简单的基于HTTP表单的协议
    • 适用场景可以使用浏览器直接查看,适用于需要同时给后台应用程序以及浏览器提供服务的场景(很多其他协议无法通过浏览器直接发起调用)
  5. WebService基于大名鼎鼎的Apache CXF,使用基于SOAP 的序列化技术
    • 适用场景比如公司内部的系统是由多种不同语言构成的,那么这个场景就比较适合采用WebService协议,WebService通 常使用在系统集成和跨语言调用场景
  6. REST基于标准的Java REST API (JAX-RS 2.0) 实现的RES
    T风格调用,Dubbo花了大力气在这部分的实现上面,它的使用风格和原生Spring MVC类似。但它不是今天的主角,同学们如果感兴趣的话可以自己花点时间去阅读REST协议的源码
  7. 杂七杂八的协议 Dubbo还支持基于Thrift, Memcached和Red is的协议,不过相信大家在职业生涯中应该是用不到的

Dubbo协议Dubbo协议的特性和性能

我们先来看一看 Dubbo协议的特性:

项目说明
连接个数单连接
连接方式长连接
传输协议TCP
底层通信框架Netty异步NIO
序列化方式Hessian2或Dubbo序列化

在官方的测试报告中,由于Dubbo将底层的通信框架从mina换成了Netty,大大提升了稳定性,主要体现在JVM Old区对象的数量减少了很多,因此Full GC的触发频率大幅减少。

Dubbo协议的适用场景

尺有所短寸有所长,Dubbo并不是万能药,我们在使用它之前务必要知道它的适用场景:

适用场景传入传出参数数据包较小(建议小于100K),但是并发量高的场景。简单来说就是短平快,QPS/TPS高但是数据量小的情况

不适场景尽量不要用Dubbo协议传输大数据包(比如大文件、视频、超大字符串等),这类场景建议使用上面介绍过的其他协议栈

Dubbo协议的调用流程

接下来我们通过一幅图,看一下Dubbo协议的工作流程

这次我们换个姿势,采用从中间向两边展开的方式解读这个协议工作流程

Transporter

大家注意看图片底部最中间的Transporter,这个是底层网络传输组件,目前Dubbo支持Mina和Netty。大家可能对Netty比较熟悉,但并没有接触过Mina。在Dubbo的2.0版本以后已经从Mina全面替换为Netty,基于Netty的传输层在稳定性和性能上都要更好一些。

Header & Body

接下来我们看图中的绿色部分,就是Header和Body,这部分是Dubbo定义的私有RPC协议中的数据格式部分,它是一个变长协议,由定长的Header和不定长的Body组成。

  • Header

上面是Header的结构,图片中的数字代表Header中Bit位置,下 面的文字表示这段字节所携带的信息,Header总 长度为16字节。其中Magic High=0xda, Magic Low=0xbb,标识了这是个Dubbo协议。

后面紧跟着16-23比特位带有两个信息:当前请求的类型以及序列化的方式。其中高四位表示当前请求的Request flag (有 三种类型: REQUEST, TWOWAY和EVENT),低四位表示序列化的方式,Du bbo有四种序列化方式,分别对应Dubbo, FastJson, Hessian2和Java 原生序列化。

接下来24-31位是响应报文才有的信息,作为Request报文并不包含这部分信息。其中定义了详情请求的状态,比如OK,BAD_ RESP ONSE,SERVER TIMEOUT。注意这些Status Code可不是HTTP St atus,而是Dubbo自定义的状态。

最后两个部分分别对应Request ID (唯一请求ID)和经过序列化后的Body内容的长度。

  • Body

这部分是Dubbo协议中不定长的部分,在传输之前会经过序列化处理,对于一个请求包来说,主要包含三部分的信息:

  1. 协议版本Dubbo当前的版本
  2. 寻址信息目标服务的名称,服务版本,方法名,方法签名类型
  3. 数据方法参数值,附件形式的数据等

Client, Server和ThreadPool

Client对应调用发起方,Server对 应服务提供方。

  • Client在发起调用之前会将整个消息进行序列化,组装成上面的Header+ Body的变长协议格式
  • Server根据Header里标识的序列化方式,对Body 中的内容进行反序列化
  • ThreadPool响应服务调用请求的线程池,可以选择配置Fix ed或Cached Thread Pool

Dispatcher线程派发模型

Dispatcher用来创建具有线程派发能力的ChannelHandler,将来访Request派发到线程池或当前I0线程。我们可以给Dispatcher配置5种派发策略

策略说明
all所有消息都派发到线程池,包括请求,响应,连接事件,断开事件等
direct所有消息都不派发到线程池,全部在IO线程上直接执行
message只有请求和响应消息派发到线程池,其它消息均在IO线程上执行
execution只有请求消息派发到线程池,不含响应。其它消息均在IO线程上执行
connection在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池

协议的约束

既然Dubbo协议应用了序列化和反序列化技术,那么对我们数据传输有几个约束条件:

  1. Serializable 参数和返回值必须实现Serializablc接口,否则在调用的时候会抛出无法序列化反序列化的异常
  2. 使用JDK原生类 比如Map、Date、 List、 Number等-系列接
    口,我们不能在返回值和参数中使用自己创建的实现类,只能使用JDK原生的接口实现类。

服务的同步和异步调用

Dubbo支持同步和异步两种调用方式,整个链路流程非常复杂,我们只抓重点看下两个调用模式的不同

  • 异步调用 异步调用还可细分为“有返回值”的异步调用和“无返回值”的异步调用。所谓“无返回值”异步调用是指服务消费方只管调用,但不关心调用结果,此时Dubbo会直接返回一个空的RpcResult。若要使用异步特性,需要服务消费方手动进行配置。
  • 同步调用 这是默认情况下Dubbo所采用的调用方式,调用方等待服务提供者返回处理结果

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

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

相关文章

阿赵UE学习笔记——10、Blender材质和绘制网格体

阿赵UE学习笔记目录   大家好,我是阿赵。   之前介绍了虚幻引擎的材质和材质实例。这次来介绍一个比较有趣的内置的Blender材质。   在用Unity的时候,我做过一个多通道混合地表贴图的效果,而要做过一个刷顶点颜色混合地表和水面的效果。…

Arm LDM和STM的寻址方式

A32指令集中包含多数据传输指令LDM和STM,也就是单条指令可以传输多个寄存器的值与内存交互,这对于数据块传输以及寄存器的压入栈很有帮助。LDM和STM指令可分别用于实现堆栈的pop和push操作。对于堆栈操作,基寄存器通常是堆栈指针(SP)。 LDM和…

uniapp写微信小程序实现电子签名

写电子签名一定要注意的是一切全部按照手机上的适配来,为啥这么说呢,因为你在微信开发者工具中调试的时候认为是好的,正常的非常nice,当你发布版本的时候你会发现问题出来了。我下边的写法你可以直接用很简单。就是要记住canvas的几个属性和用…

探索数据之美:深入Seaborn的数据可视化艺术与技巧【第26篇—python:Seaborn】

文章目录 1. 引言2. Seaborn基础2.1 安装和环境设置2.2 常用数据可视化函数2.3 设置样式和颜色主题 3. 数据准备与导入3.1 使用Pandas库加载和处理数据3.2 数据清理和缺失值处理 4. Seaborn中的常见图表4.1 折线图和散点图:展示趋势和变量关系4.2 条形图和箱线图&am…

【昕宝爸爸小模块】深入浅出之针对大Excel做文件读取问题

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

Nestjs 图片下载

一、download直接下载 1、添加下载代码 uploadController.ts import { Controller, Get, Post, Body, Patch, Param, Delete, UseInterceptors, UploadedFile, Res } from nestjs/common; import { UploadService } from ./upload.service; import { CreateUploadDto } from…

STM32WLE5JC介绍

32位 ARM Cotrex-M4 CPU 32MHz晶体振荡器 32 kHz RTC振荡器与校准 20x32位备份寄存器 引导程序支持USART和SPI接口 介绍 STM32WLE5/E4xx远程无线和超低功耗器件嵌入了强大的超低功耗LPWAN兼容无线电解决方案,支持以下调制:LoRa,&#xff08…

C++类与对象【对象的初始化和清理】

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 C类与对象🎄1 对象的初始化和清理🥕1.1 构造函数和析构函数🥕1.2 构造函数的分类及调用🥕1.3 拷贝构造函数调用时机&#x1f…

C# 读取ini文件示例

一般使用一个相关win32 api的封装类&#xff1b;我用的如下&#xff1b; using System; using System.Runtime.InteropServices; using System.Text;namespace DotNet.Utilities {/// <summary>/// INI文件读写类。/// </summary>public class INIFile{public str…

大数据毕业设计:基于python美食推荐系统+爬虫+Echarts可视化+协同过滤推荐算法+Django框架(源码)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

4D毫米波雷达——原理、对比、优势、行业现状

前言 4D 毫米波雷达是传统毫米波雷达的升级版&#xff0c;4D指的是速度、距离、水平角度、垂直高度四个维度。 相比传统 3D 毫米波雷达&#xff0c;4D 毫米波雷达增加了“高度”的探测&#xff0c;将第四个维度整合到传统毫米波雷达中。 4D毫米波雷达被视为未来车载雷达的一…

【计算机网络】【Python】【练习题】【新加坡南洋理工大学】【Computer Control Network】

一、题目描述 该题目描述一个网络中数据包交换&#xff08;Packet Switching&#xff09;的例子。题目如下&#xff1a; 二、问题解答&#xff08;使用Python&#xff09; Q1&#xff1a;如何求出0.0004这个值&#xff1f; &#xff08;1&#xff09;、公式推导过程&#xf…

072:vue+mapbox 点击某图层feature,高亮这部分

第072个 点击查看专栏目录 本示例是介绍如何在vue+mapbox中点击某图层feature,高亮这部分。思路是通过点击,获取点击部分的feature信息,生成一个新的source和layer,如果这个图层不为空,则清除之,相当于点击了别的地方,原有的高亮会删除掉,在别的地方高亮。 直接复制下…

ubuntu系统(10):使用samba共享linux主机中文件

目录 一、samba安装步骤 1、Linux主机端操作 &#xff08;1&#xff09;安装sabma &#xff08;2&#xff09;修改samba配置文件 &#xff08;3&#xff09;为user_name用户设置samba访问的密码 &#xff08;4&#xff09;重启samba服务 2、Windows端 二、使用 1、代码…

google网站流量怎么获取?

流量是一个综合性的指标&#xff0c;可以说做网站就是为了相关流量&#xff0c;一个网站流量都没有&#xff0c;那其实就跟摆饰品没什么区别 而想从谷歌这个搜索引擎里获取流量&#xff0c;一般都分为两种方式&#xff0c;一种是网站seo&#xff0c;另一种自然就是投广告&#…

《C++ Primer》第15章 面向对象程序设计(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 15.1 OOP&#xff1a;概述&#xff08;P526&#xff09; **面向对象程序设计&#xff08;object-oriented programming&#xff09;**的核心思想是数据抽象、继承和动态绑定。 继承 通过继承&#xff08;…

逆变器之变压器基础知识

1 基础知识 我们的磁芯要工作的话&#xff0c;必须要有磁场&#xff0c;有磁场就就会有磁力线。 磁场我们是看不着摸不见的&#xff0c;为了好的描述磁场&#xff0c;我们就用磁力线来表示&#xff0c; 磁力线是有方向的&#xff0c;在一个磁铁的内部磁力线是从 S指向N的&…

Elasticsearch:和 LIamaIndex 的集成

LlamaIndex 是一个数据框架&#xff0c;供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的&#xff0c;可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…

【创作活动】ChatGPT 和文心一言哪个更好用?

文章目录 文心一言优点缺点 ChatGPT优点缺点 Java编码能力比较对人工智能的看法 ChatGPT是由OpenAI开发的交互式AI大模型&#xff0c; 文心一言是由百度研发的知识增强大语言模型&#xff0c;本文从Java开发的角度对比一下哪个更好用&#xff08;本文仅用于投稿CSDN创造活动&am…

【playwright】新一代自动化测试神器playwright+python系列课程15_playwright网页相关操作_网页截图

Playwright 网页截图 在做web自动化测试时&#xff0c;脚本执行时会出现执行失败的情况&#xff0c;这个时候就需要分析失败的原因&#xff0c;由于脚本执行时是不需要人工盯着执行的&#xff0c;这个时候就需要在脚本执行失败时保留某些信息方便脚本执行完成后来分析失败的原…