分享一篇Dubbo社区关于RPC基本介绍的文章,同时引出几个简单的思考问题
原文地址
https://github.com/apache/dubbo-website/blob/master/blog/zh-cn/rpc-introduction.md
文中对RPC的定义
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
这里的屏蔽底层网络技术包括 传输协议就是屏蔽TCP/UDP,序列化方式等。
《极客时间》上有一篇关于gRPC介绍中提到一个总结【主流RPC框架】
业界主流的 RPC 框架整体上分为三类:
支持多语言的 RPC 框架,比较成熟的有 Google 的 gRPC、Apache(Facebook)的 Thrift;
只支持特定语言的 RPC 框架,例如新浪微博的 Motan;
支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是 RPC 框架, 例如阿里的 Dubbo。
RPC框架的目标就是让调用方像调用本地应用一样调用远程服务,而不关心服务提供方在哪里。
对于云计算下的分布式系统而言,远程资源具体在哪里实际上并不是很重要,因为你根本不知道了
在 Nelson 的论文 "Implementing Remote Procedure Calls" 中他提到了几点:
简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。 高效:过程调用看起来十分简单而且高效。 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。
而这个论文发表于30年前,不得不赞叹。
User User-stub RPCRuntime Server-stub Server
RPC结构.png
RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。
客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。
代理封装调用信息并将调用转交给RpcInvoker 去实际执行。
在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。
rpc-work-principle.png
我们在讨论RPC时,通常会与HTTP接口调用做比较,实际上业界有从业人员对这块是有误解的,HTTP接口调用也是RPC远程调用的一种,是子集关系。
大多倾向于对外使用HTTP RestAPI,对内使用私有的RPC协议。
对外开放的API采用HTTP RestAPI更加标准和规范,而在系统内部使用HTTP RestAPI会存在性能风险。
http-rpc
这里涉及到一个服务调用方式问题
RPC服务调用方式 分为 1 同步阻塞调用 2 异步非阻塞调用 异步和同步的区分在于是否等待服务端执行完成并返回结果。
这里放一张异步调用时序图
这篇文章从RPC定义开始,从RPC结构,原理和调用方式简单介绍了RPC,RPC在分布式系统构建过程中发挥至关重要的作用,后续我会结合工程实践进一步的深入思考关于RPC,分布式相关的问题。
Dubbo社区文集地址
https://github.com/apache/dubbo-website/tree/master/blog/zh-cn
文章已同步到公众号《图南科技》欢迎关注