一起养成写作习惯!这是我参与「掘金日新计划·4月更文挑战」的第21天,点击查看活动详情。
RPC我们听到的频率非常的高,往往就是这种缩写,这种被别人默认脱口而出的词会让还没接触过的新人或者稍有经验的社畜惶恐不已。RPC到底是什么,什么情况下要用,为什么要用?希望今天的文章能让你至少能和别的同学有话可谈。
概念
RPC,Remote Procedure Call,远程过程调用。上来就不讲人话,远程就是跨网络,调用就是调用方法或者服务,那过程是什么意思?这里可以理解为一系列的方法与网络的封装,即整个调用的过程都封装起来了。总结起来就是,首先RPC调用就和本地方法调用没有区别,其次RPC封装了网络与序列化的复杂性。
Dive Deeper
RPC由深及浅,首先是基于TCP传输的,TCP是传输层的协议,稳定可靠。RPC依靠TCP传输了二进制数据,这个二进制数据在发送端可能是json可能是xml,但发送端会对它们进行序列化,从而变成二进制数据。在接收端,这个二进制数据会被反序列化,还原成原来的json之类的数据。这里并没有采用HTTP协议的报文,因为首先在服务之间的调用并没有必要去传输那些给浏览器看的字段,然后原始报文直接传输性能肯定更好。
无论是序列化还是反序列化,对于使用者来说,代码的细节肯定是不希望自己去实现的。所以这里在两端都会存在大量的动态代理,去生成这些序列化的类。能做到像本地方法一样的调用,动态代理功不可没。
为什么
那直接用HttpClient调用对方的API不也行吗?当然,但这样首先性能会差一些,其次很多监控和限流之类的切面任务需要和业务解耦的,现在需要自己单独实现。市面上的一些高性能RPC框架,比如gRPC或者thrift等等,都在序列化的效率上下足功夫,如果走HttpClient那就毫无竞争力了。