面试官,设计一个RPC协议?我...

简介: 面试官,设计一个RPC协议?我...

背景

在RPC大行其道的时候,很多人并不是很懂该如何设计一个RPC协议?本文将会深入浅出地讲一下设计过程。

一、RPC是什么?

RPC全称Remote Procedure Call,简单理解字面意思,即跨机器访问应用程序,结合HTTP简单通俗讲讲。

首先,它们都属于应用层协议,这里不展开讲网络模型,如果有需要评论区留言,后续单开一讲。其次,RPC没有行业标准,百花争艳,而HTTP有官方定义的一套标准。最后,大部分RPC是通过TCP协议实现的,当然也有个例,例如GRPC采用HTTP2。

二、为什么需要协议?

众所周知,网络中传输的二进制,所以任何请求包括RPC请求,它们在发送之前都需要转换成二进制,写入Socket,最终通过网卡发送至网络设备中。

发送的数据往往在传输的过程中会被TCP切分或者合并,那么接受方如何知道你一个完成的请求是哪块数据?聪明的你很快会想到,每次发送的时候告诉对方请求数据的结束位置不就好了。

这个大家都能想到的发送请求的时候设置结束位置(消息边界),接收方按照结束位置进行数据处理做法,其实就是协议。

三、如何设计RPC协议?

基础V1.0

协议本身是用来规定请求的内容的,这点大家应该没有异议。

前面我们说过消息边界,由于每个请求的大小都是不固定的,为了接收方能够正确读出请求,可以在协议头固定长度的存储请求的大小,这样在接收方收到数据时,根据协议头所存储的请求大小值,读取请求协议体的数据。

协议头 协议体

请求的数据是可以正常的获取到了,这时接收方拿到的是协议体的二进制数据,它不知道调用方具体序列化的方式是哪种,也就无法知道消息的真正含义。

基础V2.0

就如上节所说的,接收方需要知道请求的序列化方式,除此之外一般的协议中还会存放消息ID、协议版本、消息类型等固定长度存放的参数,这部分数据我们统称协议头;协议体则存放具体的请求内容,长度不固定。到这里,一个功能完善的RPC协议也就出来了。

length message id version type serialization body
0-9 10-14 15-19 20-24 25-29 ...

前0-9位属于请求长度、10-14位属于消息ID,以此类推body为不定长的协议体,当然这个不定长受到length的max value限制。

可扩展V3.0

上节说到的协议属于定长协议头,不支持新加参数,强行添加会造成线上兼容问题。例如新参数加在协议头末尾,接收方只会把新参数当成协议体的一部分,导致出错,这点相信大家也不难理解。

一般的操作是会把新参数加在协议体,但是一旦放入协议体中,那么就会涉及序列化。如果参数本身不和请求内容含义相关联,例如是一个请求超时时间,在这个场景下调用方设置的超时时间在被接收方收到后,如果在协议头就无需反序列化协议体得到超时时间直接返回给调用方,降低了CPU开销。

所以一个可扩展的协议,应该是包含三部分协议头固定长度、协议头扩展长度、协议体。

body-length message id version type serialization head-length 扩展字段 body
0-9 10-14 15-19 20-24 25-29 30-24 ... ...

小结

设计一个完整的RPC协议并不复杂,难的是如何在迭代的过程中,新加特性之后还能够做到版本的向下兼容,这时候一个协议需要同时支持协议头和协议体的可扩展性显得尤为重要。

一个架构设计良好的系统往往是扩展性良好的,支持新特性的插装。

相关文章
|
7月前
|
自然语言处理 Dubbo Java
【面试问题】Dubbo 推荐用什么协议?
【1月更文挑战第27天】【面试问题】Dubbo 推荐用什么协议?
|
7月前
|
Dubbo Cloud Native 网络协议
【Dubbo3技术专题】「服务架构体系」第一章之Dubbo3新特性要点之RPC协议分析介绍
【Dubbo3技术专题】「服务架构体系」第一章之Dubbo3新特性要点之RPC协议分析介绍
100 1
|
缓存 网络协议 Linux
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
|
XML 存储 JSON
【面试题精讲】序列化协议对应于 TCP/IP 4 层模型的哪一层?
【面试题精讲】序列化协议对应于 TCP/IP 4 层模型的哪一层?
|
1月前
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
1月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
7月前
|
Java Android开发
java利用xml-rpc协议操作wordpress博客
java利用xml-rpc协议操作wordpress博客
92 1
|
4月前
|
API 开发者 微服务
RPC和 HTTP协议
【8月更文挑战第8天】RPC(远程过程调用)使程序能像本地调用般请求远程服务,简化网络通信细节。其优点包括高效的数据传输及严格的类型定义,适合微服务间的高效通信。HTTP(超文本传输协议)则是用于万维网数据传输的通用协议,以文本为基础,易于理解和调试,并被广泛支持。两者各有侧重,RPC偏高速服务通信,HTTP则更适用于多样化的网络场景。选择时需根据具体需求决定。
|
6月前
|
分布式计算 资源调度 网络协议
分布式系统详解--框架(Hadoop--RPC协议)
分布式系统详解--框架(Hadoop--RPC协议)
51 0

热门文章

最新文章