RPC
RPC的全拼叫做Remote Procedure Call,远程过程调用;RPC的最大特点就是可以让我们像调用本地方法一样发起远程调用。做任何事情都应该 Start with Why,那我们就先来说说为什么要学习 RPC。要回答这个问题,我们就得先考虑下 RPC 的实际应用场景。说到 RPC,可能你的第一反应就是“微服务”。RPC 最大的特点就是可以让我们像调用本地一样发起远程调用,这一特点常常会让人感觉 RPC 就是为“微服务”或 SOA 而生的。现在的大多数应用系统发展到一定规模之后,都会向“微服务化”演进,演进后的大型应用系统也的确是由一个个“微服务”组成的。我们可以说 RPC 是“微服务”的基础,这一点是毋庸置疑的。现在我们就可以反过来想这样一个问题——RPC 是不是只应用在“微服务”中呢?
当然不是,只要涉及到网络通信,我们就可能用到 RPC。一起看这样两个例子。
例 1:大型分布式应用系统可能会依赖消息队列、分布式缓存、分布式数据库以及统一配置中心等,应用程序与依赖的这些中间件之间都可以通过 RPC 进行通信。比如 etcd,它作为一个统一的配置服务,客户端就是通过 gRPC 框架与服务端进行通信的。
例 2:我们经常会谈到的容器编排引擎 Kubernetes,它本身就是分布式的,Kubernetes 的 kube-apiserver 与整个分布式集群中的每个组件间的通讯,都是通过 gRPC 框架进行的。
在我看来,RPC 是解决分布式系统通信问题的一大利器。分布式系统中的网络通信一般都会采用四层的 TCP 协议或七层的 HTTP 协议,在我的了解中,前者占大多数,这主要得益于 TCP 协议的稳定性和高效性。网络通信说起来简单,但实际上是一个非常复杂的过程,这个过程主要包括:对端节点的查找、网络连接的建立、传输数据的编码解码以及网络连接的管理等等,每一项都很复杂。你可以想象一下,在搭建一个复杂的分布式系统过程中,如果开发人员在编码时要对每个涉及到网络通信的逻辑都进行一系列的复杂编码,这将是件多么恐怖的事儿。所以说,网络通信是搭建分布式系统的一个大难题,是一点不为过的,我们必须给予足够的重视。而 RPC 对网络通信的整个过程做了完整包装,在搭建分布式系统时,它会使网络通信逻辑的开发变得更加简单,同时也会让网络通信变得更加安全可靠。现在你是不是感觉到学好 RPC 是很有必要的?
说起来也特别简单。当我们认识到,使用 RPC 就可以像调用本地一样发起远程调用,用它可以解决通信问题,这时候我们肯定要去学序列化、编解码以及网络传输这些内容。把这些内容掌握后,你就会发现,原来这些只是 RPC 的基础,RPC 还有更吸引人的点,它真正强大的地方是它的治理功能,比如连接管理、健康检测、负载均衡、优雅启停机、异常重试、业务分组以及熔断限流等等。突然间,你会感觉自己走进了一个新世界,这些内容会成为你今后学习 RPC 的重点和难点。
参考资料