什么是RPC
RPC 是一种技术思想而非一种规范或协议。
Remote Procedure Call,远程过程调用。也就是说,调用过程代码并不是在调用者本地运行,而是要实现调用者与被调用者二地之间的连接与通信。
通俗的说:老婆坐在沙发上不想动,想吃橘子,于是乎说:“TBKK,我要吃橘子”,我收到指令,下楼->到水果店->买橘子->上楼->剥橘子->递给老婆。这就是一个RPC调用。
对于我老婆来说,吃到了橘子,又不用跑腿,省下了体力,至于我怎么弄到橘子的,她不用关心。这就是RPC。
为什么会出现RPC
很久以前,我们设计系统,机器配置始终是一个瓶颈,单核->双核->四核,内存一加再加。在也加不上的时候怎么办,我们就试着把任务外包给其他的机器,于是乎有了分布式,有了分布式,系统之间还需要交互,于是有了分布式系统中间件,RPC就是其中之一。
RPC要解决的问题
解决分布式系统中,服务之间的调用问题。 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
RPC调用和本地调用的差别
本地调用的返回值,为True/False,而远程调用,还有一个结果:TimeOut,这就是为什么RPC很多需要熔断的原因了。
RPC的核心是什么
所谓麻雀虽小五脏俱全,RPC的五脏是什么
服务寻址
- 直连方式
- 注册中心方式
序列化
- HESSIAN(很多RPC的默认序列化方式)
- PROTOSTUFF(PB的java版效率高)
- KRYO(老牌序列化方式,Spark2.*中默认使用的序列化方式)
- JACKSON(可读性强,压缩性弱)
- 等等。。。
传输方式
- HTTP和TCP
基于 TCP 的协议实现的 RPC 调用,由于 TCP 协议处于协议栈的下层,能够更加灵活地对协议字段进行定制,减少网络开销,提高性能,实现更大的吞吐量和并发数。
但是需要更多关注底层复杂的细节,实现的代价更高。同时对不同平台,如安卓,iOS 等,需要重新开发出不同的工具包来进行请求发送和相应解析,工作量大,难以快速响应和满足用户需求。
基于 HTTP 协议实现的 RPC 则可以使用 JSON 和 XML 格式的请求或响应数据。
而 JSON 和 XML 作为通用的格式标准(使用 HTTP 协议也需要序列化和反序列化,不过这不是该协议下关心的内容,成熟的 Web 程序已经做好了序列化内容),开源的解析工具已经相当成熟,在其上进行二次开发会非常便捷和简单。
但是由于 HTTP 协议是上层协议,发送包含同等内容的信息,使用 HTTP 协议传输所占用的字节数会比使用 TCP 协议传输所占用的字节数更高。
因此在同等网络下,通过 HTTP 协议传输相同内容,效率会比基于 TCP 协议的数据效率要低,信息传输所占用的时间也会更长,当然压缩数据,能够缩小这一差距。
市面上的一些RPC
总结
RPC框架在公司的架构演变进化中不可或缺,但是并不是每个框架都适合自己的业务场景,所以生产出一套能自己驾驭的RPC框架尤为重要。