自定义协议?
第一次听到这个名词的时候,感觉好高大上!后面学习了这块类容以后,发现也就那样,所谓的自定义协议,就是自己定义一套数据传输的规则。这么说你不一定明白

我们知道只有二进制才能在网络中传输,所以 RPC 请求在发送到网络中之前,他需要把方法调用的请求参数转成二进制但,在传输过程中,RPC 并不会把请求参数的所有二进制数据整体一下子发送到对端机器上,中间可能会拆分成好几个数据包,也可能会合并其他请求的数据包(合并的前提是同一
个 TCP 连接上的数据),至于怎么拆分合并,这其中的细节会涉及到系统参数配置和 TCP窗口大小。对于服务提供方应用来说,他会从 TCP 通道里面收到很多的二进制数据,那这时候怎么识别出哪些二进制是第一个请求的呢?因此,自定义协议的第一个必不可少的元素来啦。

消息长度 标识消息的长度,服务端收到消息时先读取固定位置的数据获取消息长度,然后就知道这条消息应该从哪开始读,读多少,最简单的消息协议如下

但是仅仅这些还不够,为什么呢?
因为前面我们提到了,我们的可能是支持多种序列化方式的,如果协议里没有序列化方式的标识,我们即使拿到数据也没办法正确的反序列化,因此协议头里面还应该加上序列化方式的标识。
既然是自定义的协议,我们是不是应该有个固定标识这条消息是按我们的协议走的,就像看一个文件的类型不应该只是看文件的后缀名一样。不同类型的文件我们会在文件的开头以一个固定的自负或者数字来表示,这个标识有一个统一的称呼魔数
你以为一个自定义协议就长这样?

好的协议不但要考虑现在,还要考虑将来!
我们的协议还需要一个协议版本,不同的时候我们可能会按照不同的方式来编码消息。为了保证协议的可扩展性,我们还可以定义一个协议头的长度,方便以后我们协议头部分内容的扩展等等。写代码不难,要想写一份好代码却不是一件简单的事。
本着能简就减的原则,我们的自定义协议长这样

说了这么多,有的人可能要问了,http协议不够好么?你认为自己能写的比http协议更好?

  1. 相对于 HTTP 的用处,RPC 更多的是负责应用间的通信,所以
    性能要求相对更高。
  2. HTTP 协议的数据包大小相对请求数据本身要大很多,又需要加入
    很多无用的内容,比如换行符号、回车符等。
  3. 还有一个更重要的原因是,HTTP 协议属于无状态协议,客户端无法对请求和响应进行关联,每次请求都需要重新建立连接,响应完成后再关闭连接。

说了这么多,我们可以把这个自定义协议实现出来了,一个完整自定义协议里面包含了协议头和消息体,因此由协议头和消息内容两部分共同组成自定义协议。

package com.info.protocol.netty.core;import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class Header {/*+-------------------------------------------------------------------------------------------+|魔数 16bit|协议版本 8bit|序列化方式 8bit|协议头长度 16bit| 消息长度 32bit |消息类型(请求还是响应)2bit|+-------------------------------------------------------------------------------------------+*/private short magic;private byte protocolVersion;private byte serializeType;private short protocolHeaderLength;private int messageLength;private byte messageType;
}
package com.info.protocol.netty.core;import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class Protocol<T> {private Header header;private T content;
}

定义一个枚举方便管理消息类型

package com.info.protocol.enums;import lombok.AllArgsConstructor;
import lombok.Getter;import java.util.Arrays;@Getter
@AllArgsConstructor
public enum MessageTypeEnum {REQUEST((byte) 1),RESPONSE((byte) 2),heart_beat((byte) 3);private byte code;public static MessageTypeEnum getMessageTypeEnumByCode(int code) {return Arrays.stream(MessageTypeEnum.values()).filter(e -> e.getCode() == code).findFirst().orElseGet(null);}
}

本节的内容就先到这里了,欲知后事如何,且听下回(拍醒木)分解!

系列文章传送门如下:
手写RPC(一) 絮絮叨叨
手写RPC(二) 碎碎念
手写RPC(三) 基础结构搭建
手写RPC(四) 核心模块网络协议模块编写 ---- netty服务端
手写RPC(六) 核心模块网络协议模块编写 ---- 实现编解码器
手写RPC(七) 核心模块网络协议模块编写 ---- 实现客户端
手写RPC(八) provider、consumer 实现
手写RPC(九) 测试
手写RPC(十) 优化
关于 LengthFieldBasedFrameDecoder 不得不说的事

手写RPC(五) 核心模块网络协议模块编写 ---- 自定义协议相关推荐

  1. 手写RPC(一) 絮絮叨叨

    目录 前言 我的知识库 学会了? 学不动了? 前言 提到RPC(Remote Procedure Call)大家应该都不陌生,特别是像我一样做web开发的,可以说天天和rpc打交道.常见的rpc框架主 ...

  2. c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...

    一.前言 RPC,远程过程调用,调用远程方法像调用本地方法一样.RPC交互分为客户端和服务端,客户端调用服务端方法,服务端接收数据并打印到控制台,并response响应给客户端. RPC和HTTP的联 ...

  3. 第四篇 - 手写RPC框架

    Github源码下载地址:https://github.com/chenxingxing6/myrpc 一.前言 RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从 ...

  4. 手写篇:如何手写RPC框架?

    手写篇:如何手写RPC框架? 首先我们讲下什么是RPC? RPC(Remote Procedure Call)远程过程调用协议,他是一种通过网络从远程计算机程序请求服务.简单的来说,就是通过网络进行远 ...

  5. MyRPCDemo netty+jdk动态代理+反射+序列化,反序列化手写rpc框架

    RPC RPC(remote procedure call)远程过程调用 RPC是为了在分布式应用中,两台主机的Java进程进行通信,当A主机调用B主机的方法时,过程简洁,就像是调用自己进程里的方法一 ...

  6. pytorch手写数字识别验证四流网络

    四流网络验证 四流网络10 epoch 结果 16.19526395201683 correct1: tensor(9871, device='cuda:0') Test acc: 0.9871512 ...

  7. 三分钟手写RPC调用 (三)

    三分钟springboot整合dubbo3(三)(手写RPC调用) 1.设计思路 2.代码编写 3.总结 1.设计思路 1.启动一个springboot项目,定义一个简单的HelloWord程序,能通 ...

  8. Robot Framework自动化测试框架核心指南-如何使用Java编写自定义的RobotFramework Lib

    如何使用Java编写自定义的RobotFramework Lib 本文包括2个章节 1. Robot Frdamwork中如何调用java Lib库 2.使用 java编写自定义的Lib 本文作者为: ...

  9. java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起

    上次Version06说到了咱们手写迷你版RPC的大体流程, 对咱们的迷你版RPC的大体流程再做几点补充: 为什么要封装网络协议,别人说封装好咱们就要封装?Java有这个特性那咱就要用?好像是这样.看 ...

  10. 神经网络学习(三)比较详细 卷积神经网络原理、手写字体识别(卷积网络实现)

    之前写了一篇基于minist数据集(手写数字0-9)的全连接层神经网络,识别率(85%)并不高,这段时间学习了一些卷积神经网络的知识又实践了一把, 识别率(96%左右)确实上来了 ,下面把我的学习过程 ...

最新文章

  1. 元宇宙不是下一代互联网,而是人类群体思维空间或梦境世界的具现
  2. JVM 调优实战--常见的垃圾回收算法及垃圾收集器组合
  3. LeetCode 面试题 10.02. 变位词组
  4. SQL Server代理的阶梯 - 第2级:作业步骤和子系列
  5. visio studio json工具_《产品经理入门指南》彩蛋2:别技淫原型图!你的Visio和Balsamiq Mockup入门了吗?...
  6. IOS开发基础知识--碎片33
  7. mysql row 日志格式_mysql row日志格式下 查看binlog sql语句
  8. 安装PaddleOCR遇到ERROR: Command errored out with exit status 1:command: ‘f:\python3.7\python.exe‘ -u -c
  9. 是以微型计算机为中心 配以相应的外围设备,______是以微型计算机为中心,配以相应的外围设备、电源和辅助电路,以及指挥微型计算机工作的系统软件而构成的。...
  10. Jmater (十九) 分布式测试(性能测试大并发、远程启动解决方案)
  11. ionic中select下拉框点击无反应解决办法
  12. M2Det-一种使用新的特征金字塔方式的单阶段目标检测器(论文笔记)
  13. 画三线格子的高效方法,不用再一个格子一个格子的选中啦
  14. Pr2023(Premiere Pro)中文版软件下载「附带安装教程」
  15. 电影中的计算机 过去与未来
  16. ps如何设置裁剪后的背景颜色
  17. 五篇经典好文,值得一看
  18. [Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
  19. 一个26岁女生的软件测试自学之路,从4k到月入过万
  20. 不断收集一些不错的博客(献给未来路上的人)

热门文章

  1. 英文论文查重规则是什么?
  2. 瞎聊高速公路与主干道的立交匝道设计
  3. 证书错误 导航已阻止 无法跳转 最终解决
  4. 5G无线技术基础自学系列 | 大规模天线阵列
  5. 查询IP归属地的接口
  6. AWS简介(Amazon Web Services )
  7. effective stl
  8. 按键精灵连接远程mysql_按键精灵手机版 如何连接远程网络数据库 进行读写操作...
  9. matlab中radon函数6,matlab实用程序(六)
  10. ASO优化如何做?3个核心要点必须掌握