这是我参与「第五届青训营 」笔记创作活动的第3天,今天我学习了http与rpc的关系。
- RPC(Remote Procedure Call)远程过程调用
- HTTP(Hyper Text Transfer Protocol) 超文本传输协议
先来说说通常我们说的RPC指的是什么,我们通常把一个服务对另一个服务的调用称为RPC,比如服务A提供了权限鉴定的接口,然后服务B按照规范去调用这个接口就可以获得合理的反馈。这里哪一个词最重要呢?其实是规范。
我觉得RPC就是协议,就是规范!下面我们考虑,如果需要实现一个远程调用,需要做哪些事情。最简单的情况下,只需要下面这样
- 客户端序列化数据
- 客户端向服务端发送数据
- 服务端收到数据并反序列化得到数据内容
- 服务端处理数据,并将结果序列化,发送给客户端
再抽象一点,其实就是两件事情,序列化和收发数据。大部分的RPC协议都采用了TCP作为数据传输的网络层协议,因为TCP保证了数据的可靠性。而各个RPC协议的序列化都各不相同。我们看一个例子,GRPC框架采用的protocol buffer协议。
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
这与JSON看起来非常的类似,在通常我们习惯于用JSON因为JSON具有很好的可读性,然后JSON中的大量换行,括号,引号等字符会占用空间,所以通常同样的信息,JSON的大小会比protocol buffer大。所以我们在追求低延迟,高带宽的时候,会想到用其他序列化方式来取代JSON。
说了这么多的RPC,那么HTTP与RPC是什么关系,我的回答是,HTTP是一种RPC,也是一种远程调用协议。是由浏览器等客户端调用、获取服务端的协议。相对于其他的RPC,HTTP性能较差,但是HTTP拥有最好的通用性,几乎任何一个语言都会天生支持用HTTP来通讯。