RPC是什么
RPC:Remote Procedure Call,远程过程调用
是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。
也便于微服务的划分,根据业务模块做了不同的拆分,像用户的服务不用我这个小组负责,我这小组只要写订单服务就行了。
HTTP和RPC
图源:链接
HTTP和RPC不是对等的概念
RPC是一个完整的远程调用方案,它包括了:接口规范+序列化反序列化规范+通信协议等。
而HTTP只是一个通信协议,工作在OSI的第七层,不是一个完整的远程调用方案。
所以可以说 RPC是能够基于 HTTP 实现,也可以不基于,基于更下一层的 TCP/ UDP协议
且主要有以下两点:
- HTTP是一种国际语言,大家都用的协议,所以相对于内部使用的过于冗余,而内部使用往往可以通过牺牲可读性换取更高的效率。而RPC往往是指与框架相关的定制化协议,及上层的IDL(可以理解为内部接口);(框架有什么:gRPC、brpc、thrift、srpc等;IDL有什么:protobuf、thrift等;)
所以,如果我们更习惯用 HTTP,那么只是因为它更通用;如果我们更习惯用RPC,那么只是因为框架使得我们操作IDL更方便; - 我们既可以用HTTP client访问RPC server,也可以用RPC client发出HTTP请求;
更通俗的讲
基于HTTP
实现的 RPC
好比普通话,而基于TCP/UDP
自定义的 RPC
好比团伙内部黑话。
讲普通话,好处就是谁都听得懂,谁都会讲。
讲黑话,好处是可以更精简、更加保密、更加可定制,坏处就是要求“说”黑话的那一方(client端)也要懂,而且一旦大家都说一种黑话了,换黑话就困难了。
且很多RPC框架包含了重试机制,路由策略,负载均衡策略,高可用策略,流量控制策略等等。 如果应用进程之间只使用HTTP协议通信,显然是无法完成上述功能的。