RPC学习

设计协议

相对于 HTTP 的用处,RPC 更多的是负责应用间的通信,所以性能要求相对更高。但 HTTP 协议的数据包大小相对请求数据本身要大很多,又需要加入很多无用的内容,比如换行符号、回车符等;

还有一个更重要的原因是,HTTP 协议属于无状态协议,客户端无法对请求和响应进行关联,每次请求都需要重新建立连接,响应完成后再关闭连接。因此,对于要求高性能的 RPC 来说,HTTP 协议基本很难满足需求,所以
RPC 会选择设计更紧凑的私有协议。

协议要点:

在协议头里面,我们除了会放协议长度、序列化方式,还会放一些像协议标示、消息 ID、消息类型这样的参数,而协议体一般只放请求接口方法、请求的业务参数值和一些扩展属性。这样一个完整的 RPC 协议大概就出来了,协议头是由一堆固定的长度参数组成,而协议体是根据请求接口和参数构造的,长度属于可变的,具体协议如下图所示:

RPC学习

可扩展:

如果加新参数的话,首先不可以放在协议头,那么放在协议体中可以吗

答案是不可以的

因为协议体中的内容都是要经过序列和反序列化的,如果要获取到你参数的值,就必须把整个协议体里面的数据经过反序列化出来,在某些场景下这样做代价有点高

那就变成协议头(固定部分,扩展部分),协议体

RPC学习

序列化和反序列化

实际上任何一种序列化框架,核心思想就是设计一种序列化协议,将对象的类型、属性类型、属性值一一按照固定的格式写到二进制字节流中来完成序列化,再按照固定的格式一一读出对象的类型、属性类型、属性值,通过这些信息重新创建出一个新的对象,来完成反序列化

常见的序列化方式有:JDK,Json,Hessian,Protobuf序列化方式。

选择序列化方式要考虑的因素

  1. 性能和效率
  2. 空间开销’
  3. 通用性和兼容性
  4. 安全性

RPC学习

首选的还是 Hessian 与 Protobuf,因为他们在性能、时间开销、空间开销、通用性、兼容性和安全性上,都满足了我们的要求。其中 Hessian 在使用上更加方便,在对象的兼容性上更好;Protobuf 则更加高效,通用性上更有优势。

在使用过程中编码需注意那些问题

1.对象要尽量简单,没有太多的依赖关系,属性不要太多,尽量高内聚;
2. 入参对象与返回值对象体积不要太大,更不要传太大的集合;
3. 尽量使用简单的、常用的、开发语言原生的对象,尤其是集合类;
4. 对象不要有复杂的继承关系,最好不要有父子类的情况

IO

零拷贝

取消用户空间和内核空间的拷贝

应用进程的每一次读写可以直接将数据从内核区中取出或者写入,再通过DMA将内核中的数据拷贝到网卡或从网卡拷贝到内核。

所以解决方式就是使用户空间和内核空间的数据都在一个地方存取,那就是虚拟内存。

RPC协议在传输数据过程中,中间可能会拆分成好几个数据包,也可能会合并其他请求的数据包,所以消息都需要有边界。那么一端的机器收到消息之后,就需要对数据包进行处理,根据边界对数据包进行分割和合并,最终获得一条完整的消息。

收到消息后,对数据包的分割和合并,是在用户空间完成,还是在内核空间完成的

Netty 的零拷贝就是为了解决这个问题,在用户空间对数据操作进行优化。

Netty 框架中很多内部的 ChannelHandler 实现类,都是通过 CompositeByteBuf、slice、wrap 操作来处理 TCP 传输中的拆包与粘包问题的。

那么 Netty 解决用户空间与内核空间之间的数据拷贝问题的方法:
Netty 的 ByteBuffer 可以采用 Direct Buffers,使用堆外直接内存进行 Socketd 的读写操作,最终的效果与虚拟内存所实现的效果是一样的。

SPI

设计RPC框架时,为了实现插件化架构,可将功能点抽象成接口,将接口与实现分离,并提供接口的默认实现

利用SPI(服务发现机制),可动态的为接口寻找服务

实现:在Classpath 下的 METAINF/services 目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体实现类。

服务发现

还是最终一致性性能更好

Original: https://www.cnblogs.com/zz01/p/16488048.html
Author: 山野村夫01
Title: RPC学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621456/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • HTML&CSS-盒模型运用居中方式合集

    { margin: 0; padding: 0; list-style: none; 清除浏览器默认样式 .father1 { width: 400px; height: 400p…

    数据库 2023年6月11日
    0100
  • mysql基础语法_曾佳豪

    一、构建数据库、表和数据类型 [En] I. Building databases, tables and data types 1.建库 create database if n…

    数据库 2023年5月24日
    092
  • 【StoneDB Class】入门第一课:数据库知识科普

    在没有出现数据库之前,数据存储在文本中,这种数据存储方式不管是管理还是查询,效率都是极其低下的,数据之间没有关联性。到了1970年,IBM研究员 E.F.Codd 发表了论文&#8…

    数据库 2023年5月24日
    087
  • Mysql8+数据库安装和使用

    一、Mysql的版本选择 Mysql目前分文社区版和企业版,社区版在技术方面会加入许多新的未经严格测试的特性,而企业版经过严格测试认证,更加稳定、安全、可靠,性能也比社区版好。社区…

    数据库 2023年6月14日
    081
  • [LeetCode]27. 移除元素

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原…

    数据库 2023年6月9日
    067
  • pg substring 正则提取子串

    官方案例: 测试: posted @2022-02-08 19:48 cheng_blog 阅读(218 ) 评论() 编辑 Original: https://www.cnblo…

    数据库 2023年6月16日
    092
  • Android Studio更改SDK、Gradle以及模拟器默认下载位置

    版本:Android Studio Chipmunk | 2021.2.1 Patch 2时间:2022年9月1日 1、更改SDK位置 找到 File -> Settings…

    数据库 2023年6月16日
    094
  • QT槽函数获取信号发送对象

    Qt 在槽函数中获取信号发送对象 Qt中提供了一个函数 qobject_cast(QObject *object),可以通过这个函数判断信号发出对象 Qt 帮助文档的解释:Retu…

    数据库 2023年6月16日
    0136
  • MySQL之SQL语句优化

    即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行。 移除不必要的括号 select * from x where ((a = 5)); 上面…

    数据库 2023年5月24日
    078
  • 省去跨表联查与注释查询的存储过程

    1 — 打印query存储过程的帮助信…

    数据库 2023年5月24日
    070
  • Linux 下安装 redis

    2、使用命令下载: 3、将文件拷贝到安装目录 /usr/local 目录下 4、进入 /usr/local 目录下,解压安装包 5、进入解压后的目录 6、编译,将 redis 安装…

    数据库 2023年6月14日
    092
  • SpringMvc(二)- 请求处理参数 和 响应数据处理

    1、请求处理参数 1.1 请求参数 @RequestParam 1.1.1 不使用 @RequestParam 注解 请求参数处理, 不使用参数注解:1.如果 请求参数名和请求处理…

    数据库 2023年6月16日
    077
  • 根据温度、气压计算海拔高度

    基本概念 标准大气压:表示气压的单位,习惯上常用水银柱高度。例如,一个标准大气压等于760毫米高的水银柱的重量,它相当于一平方厘米面积上承受1.0336公斤重的大气压力。由于各国所…

    数据库 2023年6月14日
    0138
  • mysql视图,索引

    一、视图 View 视图是一个 虚拟表,是sql语句的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基…

    数据库 2023年6月9日
    069
  • 基于PHP7.2+MySQL5.7的回收租凭系统

    likeshop回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零钱提现。支持在线…

    数据库 2023年5月24日
    0118
  • Mysql终端Terminal操作

    datebase管理 1.创建数据库-create 语法:create database 数据库名 character set 编码 注意:默认会存在四个数据库,其数据库中存储的是…

    数据库 2023年6月14日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球