RPC
远程服务调用
RPC出现的最初目的,是为了让计算机像调用本地方法一样,去调用远程方法。
1994 年至 1997 年间,由 ACM 和 Sun 的院士Peter Deutsch、套接字接口发明者Bill Joy、Java 之父James Gosling等众多在 Sun Microsystems 工作的大佬们,共同总结了通过网络进行分布式运算的八宗罪(8 Fallacies of Distributed Computing):
网络是可靠的(The network is reliable)
延迟是不存在的(Latency is zero )
带宽是无限的(Bandwidth is infinite)
网络是安全的(The network is secure)
拓扑结构是一成不变的(Topology doesn't change)
总会有一个管理员(There is one administrator)
不考虑传输成本(Transport cost is zero)
网络是同质化的(The network is homogeneous)
RPC协议需要解决的问题
怎么表示数据
即如何序列化和反序列化。
怎么传递数据
如何通过网络,在2个服务间进行互相操作。异常、超时、安全、认证、授权、事务等信息,都可能存在双方交换信息的需求。
怎么表示方法
不同的语言,有不同的方法签名。
围绕着这三个问题,相继出现过 RPC 协议 / 框架:RMI(Sun/Oracle)、Thrift(Facebook/Apache)、Dubbo(阿里巴巴 /Apache)、gRPC(Google)、Motan2(新浪)、Finagle(Twitter)、brpc(百度)、.NET Remoting(微软)、Arvo(Hadoop)、JSON-RPC 2.0(公开规范,JSON-RPC 工作组)……
这些 RPC 的功能、特点都不太一样,有的是某种语言私有,有的能支持跨越多门语言,有的运行在 HTTP 协议之上,有的能直接运行于 TCP/UDP 之上,但没有哪一款是“最完美的 RPC”。都不再去追求大而全的“完美”,而是会找到一个独特的点作为主要的发展方向。
功能强大的框架往往要在传输中加入额外的负载和控制措施,导致传输性能降低,而如果既想要高性能,又想要强功能,这就必然要依赖大量的技巧去实现,进而也就导致了框架会变得过于复杂,这就决定了不可能有一个“完美”的框架同时满足简单、普适和高性能这三个要求。
Last updated
Was this helpful?