Dubbo协议模块源码剖析

  • 目录
    • 概 述
      • RPC协议报文编码与实现详解
        • RPC 传输实现:
      • 拆包与粘包解决办法:
      • Dubbo 报文格式
    • 分析:
  • 小结:
  • 参考资料和推荐阅读

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。

目录

在一个典型RPC的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中RPC协议就指明了程序如何进行网络传输和序列化 。也就是说一个RPC协议的实现就等于一个非透明的远程调用实现,如何做到的的呢?。

概 述

协议的组成:

1.地址:服务提供者地址
2.端口:协议指定开放的端口
3.报文编码:协议报文编码 ,分为请求头和请求体两部分。
4.序列化方式:将请求体序列化成对象
Hessian2Serialization、DubboSerialization,JavaSerialization,JsonSerialization,运行服务: 网络传输实现

netty,mina,RMI 服务,servlet 容器(jetty、Tomcat、Jboss)

Dubbo中所支持RPC协议使用:
dubbo 支持的RPC协议列表:
名称 实现描述 连接描述 适用场景
dubbo 传输服务: mina, netty(默认), grizzy序列化: hessian2(默认), java, fastjson自定义报文 单个长连接NIO异步传输 1、常规RPC调用2、传输数据量小3、提供者少于消费者
rmi 传输:java rmi 服务序列化:java原生二进制序列化 多个短连接BIO同步传输
hessian 传输服务:servlet容器序列化:hessian二进制序列化 基于Http 协议传输,依懒servlet容器配置 1、提供者多于消费者2、可传大字段和文件3、跨语言调用
http 传输服务:servlet容器序列化:java原生二进制序列化 依懒servlet容器配置 1、数据包大小混合
thrift 与thrift RPC 实现集成,并在其基础上修改了报文头 长连接、NIO异步传输

协议的配置:
Dubbo框架配置协议非常方便,用户只需要在 provider 应用中 配置*<*dubbo:protocol> 元素即可。

<!--name: 协议名称 dubbo|rmi|hessian|http|host:本机IP可不填,则系统自动获取port:端口、填-1表示系统自动选择server:运行服务  mina|netty|grizzy|servlet|jettyserialization:序列化方式 hessian2|java|compactedjava|fastjson详细配置参见dubbo 官网 dubbo.io--><dubbo:protocol name="dubbo" host="192.168.0.11" port="20880" server="netty" serialization=“hessian2” charset=“UTF-8” />

TODO 演示采用其它协议来配置Dubbo
dubbo 协议采用 json 进行序列化 (源码参见:com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol*)*
采用RMI协议 (源码参见:com.alibaba.dubbo.rpc.protocol.rmi.RmiProtocol)
采用Http协议 (源码参见:com.alibaba.dubbo.rpc.protocol.http.HttpProtocol.InternalHandler)
netstat -aon|findstr “17732”

序列化比较:
fastjson 文本型:体积较大,性能慢、跨语言、可读性高
fst 二进制型:体积小、兼容 JDK 原生的序列化。要求 JDK 1.7 支持。
hessian2 二进制型:跨语言、容错性高、体积小
java 二进制型:在JAVA原生的基础上 可以写入Null
compactedjava 二进制型:与java 类似,内容做了压缩
nativejava 二进制型:原生的JAVA 序列化
kryo 二进制型:体积比hessian2 还要小,但容错性 没有hessian2 好

RPC协议报文编码与实现详解

RPC 传输实现:

RPC的协议的传输是基于 TCP/IP 做为基础使用Socket 或Netty、mina等网络编程组件实现。但有个问题是TCP是面向字节流的无边边界协议,其只管负责数据传输并不会区分每次请求所对应的消息,这样就会出现TCP协义传输当中的拆包与粘包问题。
我们知道tcp是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size)指的是,连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,mss则是这个最大限制减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节,也就是180多字节。

tcp为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据。这时就会出现以下情况:

1.应用程序写入的数据大于MSS大小,这将会发生拆包。

2.应用程序写入数据小于MSS大小,这将会发生粘包。

3.接收方法不及时读取套接字缓冲区数据,这将发生粘包。

拆包与粘包解决办法:

1.设置定长消息,服务端每次读取既定长度的内容作为一条完整消息。
2.{“type”:“message”,“content”:“hello”}\n
3.使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。

Dubbo 报文格式

Dubbo协议的编解码过程:

分析:

小结:

参考资料和推荐阅读

1.链接: link.

Dubbo协议模块源码剖析相关推荐

  1. Python envoy 模块源码剖析

    Kenneth Reitz 是公认的这个世界上 Python 代码写得最好的人之一.抱着学习的心态,我阅读了 Reitz 写的 envoy 模块的源码,将笔记记录如下. 介绍 和 requests 模 ...

  2. 【nodejs原理源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    [摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...

  3. 【nodejs原理源码赏析(4)】深度剖析cluster模块源码与node.js多线程(上)

    [摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...

  4. tomcat(12)org.apache.catalina.core.StandardContext源码剖析

    [0]README 0)本文部分文字描述转自 "how tomcat works",旨在学习 "tomcat(12)StandardContext源码剖析" 的 ...

  5. pymavlink 源码剖析(一)之XML文件的数据解析

    文章目录 1 引言 2 pymavlink 的代码自动生成方法 3 XML 文件的数据解析 3.1 XML 文件预处理 3.2 解析 XML 的数据 3.2.1 依据协议版本初始化一些版本特征变量 3 ...

  6. Chrome源码剖析、上--多线程模型、进程通信、进程模型

    Chrome源码剖析.上 原著:duguguiyu. 整理:July. 时间:二零一一年四月二日. 出处:http://blog.csdn.net/v_JULY_v. 说明:此Chrome源码剖析很大 ...

  7. Chrome源码剖析 上--多线程模型 进程通信 进程模型

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Chro ...

  8. CHROME源码剖析 上《转》

    转自:http://www.blogjava.net/xiaomage234/archive/2012/02/16/370122.html 原著:duguguiyu. 整理:July. 时间:二零一一 ...

  9. 【chrome】Chrome源码剖析、上--多线程模型、进程通信、进程模型

     Chrome源码剖析.上 原著:duguguiyu. 整理:July. 时间:二零一一年四月二日. 出处:http://blog.csdn.net/v_JULY_v. 说明:此Chrome源码剖析很 ...

最新文章

  1. Java 遍历map
  2. JQueryEasyUI学习笔记(十四)tree
  3. crontab、chkconfig、systemd、unit、targ
  4. 用Xamarin 实现园友的 :Android浮动小球与开机自启动
  5. 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits 函数:求交叉熵损失
  6. Linux环境下配置Tomat
  7. 连分数求解Pell方程
  8. 编程必备的32个修养,你占了几个?
  9. Bootstrap使用后笔记
  10. Odoo10教程---模块化一:新建一个模块及基本视图
  11. 安装qt qmake assistant 错误:could not find a Qt installation of ''
  12. 自动化检测工具助力GJB 8114-2013 C/C++语言编程安全子集标准落地应用
  13. 【精彩文章】数学家论数学——数学的本质
  14. 计算机论文有哪些方向,计算机论文研究方向有以下四类
  15. U盘重装Win10系统视频教程
  16. 自定义安装官方Microsoft Office 2019
  17. 2020年7月 leetcode每日一题 C语言版本
  18. Python操控鼠标和键盘
  19. 2021高考成绩特长生查询,2021高考体育生分数怎么算 体育四项评分标准及分值一览表...
  20. 2017安卓开发工程师面试题总结

热门文章

  1. win7系统如何提升电脑开机速度?
  2. 想要更高效地使用云计算,推荐学习云计算部署的五大策略
  3. Capture Modules 车载网络报文捕获(监听)模块(低时延、802.1AS时钟同步)
  4. 简图 新聚合图床源码自带鉴黄功能
  5. LR推导及其与SVM的区别
  6. Windows2008下安装域控DC及加域
  7. 从村上春树到cyberspace security
  8. 云计算中存储继承知识
  9. 建筑企业“出租脚手架”究竟如何缴纳增值税
  10. 《阿里铁军》的读书笔记和读后感范文2600字