RPC (Remote Procedur call ) 远程服务调用
什么是rpc?
举个小河上的桥例子.
rpc的作用?
- 屏蔽远程调用和本地的区别,让我们感觉像本地调用
- 隐藏底层网络通信的复杂性
联想网络通信本质是啥?
netty 网络通信的框架
一个完整的rpc会涉及到哪些过程?
数据传输,保证其可靠性通常都是TCP来传输,常用的http协议就是在其基础之上
网络数据肯定是二进制数据,那么就会涉及到序列化和反序列化. 这里也会产生数据通信之间的协议.
数据格式的约定内容叫协议.协议包括请求头和请求体.
请求头: 一般用于身份识别、协议标识、数据大小、请求类型、序列化类型
消息体 : 请求业务参数信息和扩展信息
协议
http 协议和rpc 协议都属于应用层协议.
Rpc 数据请求通过网络,二进制格式传输,写入本地socket 通过网卡发到另外的设备上.
数据也不是一次把数据全部传递过去,中间可能需要拆包,合并请求等(合并的前提是同一个tcp连接上的数据)
这些取决于tcp的窗口大小,系统参数配置.
协议 也是给请求一个参考边界. 例如数据大小,结尾格式等.可以联想到redis 的resp协议使用#key#value 这样的分割方式.
为啥还要rpc自己的协议? http协议不能满足要求吗? 他们有什么样的区别?
http协议属于无状态协议,而且协议本身有很多无用的内容,比如换行符、回车符、请求头导致数据多.
无法实现请求跟响应关联,每次都需要重新建立连接,响应完成关闭连接.
rpc 是如果和实现请求和响应关联的呢?
dubbo 是消费者发出请求,Atomiclong 产生消息id,,之后底层IO是异步发送消息,dubbo发送请求后,需要阻塞等待消费者返回消息.消费者id存储在map结构里,服务提供者返回附带请求消息id,之后dubbo 通过消息id就能对应上请求和响应啦.
怎么完成自定义的协议呢?
协议的边界
给一个固定大小的长度表示数据长度,之后在根据数据的大小进行读取数据.
数据的序列化方式
如果不指定序列化方式的话,那么也解析不出来数据的格式啊?
得出结论,数据大小,序列化的方式这些 固定下来的数据空间,我们可以放到协议头上,具体的请求内容放置在协议体.
bit offset | 0-15 | 16-47 | 48-63 | 64-71 | 72-79 | 80-87 |
---|---|---|---|---|---|---|
0 | 魔术位 | 数据长度 | 消息id 请求和响应关联 | 协议版本 | 消息类型 | 序列化方式 |
协议体 | 请求接口 | 请求参数 | 可变长度 |
可扩展的协议?