RPC框架是啥?

54次阅读

共计 1492 个字符,预计需要花费 4 分钟才能阅读完成。

本博客 猫叔的博客,转载请申明出处
在我刚刚了解分布式的时候,经常对 RPC 和分布式有些混淆,甚至一直以为两者对等,所以我们先看看他们有什么区别?
RPC 实现了服务消费调用方 Client 与服务提供实现方 Server 之间的点对点调用流程,即包括了 stub、通信、数据的序列化 / 反序列化。且 Client 与 Server 一般采用直连的调用方式。
而分布式服务框架,除了包括 RPC 的特性,还包括多台 Server 提供服务的负载均衡、策略及实现,服务的注册、发布与引入,以及服务的高可用策略、服务治理等等。
那么 RPC 是什么呢?
百度百科是这样表示的:
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在 OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。
它甚至给出了工作原理,这一点很惊喜。

1. 调用客户端句柄;执行传送参数
2. 调用本地系统内核发送网络消息
3. 消息传送到远程主机
4. 服务器句柄得到消息并取得参数
5. 执行远程过程
6. 执行的过程将结果返回服务器句柄
7. 服务器句柄返回结果,调用远程系统内核
8. 消息传回本地主机
9. 客户句柄由内核接收消息
10. 客户接收句柄返回的数据

我喜欢搜查更多的信息资料,所以我又找到了知乎上的回答。

知乎 1.7k 的点赞,应该还是可以参考的。
恰如回答提到的,RPC 是指远程过程调用,也就是说两台服务器 A,B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数 / 方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
至于为什么使用 RPC?答主也提到,无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同系统间的通讯,甚至不同组织间的通讯。
这里再说一下关于 Netty,Netty 框架不局限于 RPC,更多的是作为一种网络协议的实现框架,比如 HTTP,由于 RPC 需要高效的网络通信,就可以选择 Netty 作为基础。除了网络通信,RPC 还需要有高效的序列化框架,以及一种寻址方式,如果是带会话(状态)的 RPC 调用,还需要有会话的状态保持的功能。
好了,让我们再来整理一下,什么是 RPC?
RPC(远程过程调用)一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源。一般来说,RPC 框架实现的架构原理都是类似的。

可以这样说,

客户端调用:负责发起 RPC 调用,为调用方用户提供使用 API。
服务端响应:主要是服务端业务逻辑实现。
序列化 / 反序列化:负责对 RPC 调用通过网络传输的内容进行序列化与反序列化,不同的 RPC 框架有不同的实现机制。一般分为文本(XML、JSON)与二进制(Java 原生的、Hessian、protobuf、Thrift、Avro、Kryo、MessagePack),需要注意的是,不同的序列化方式在可读性、码流大小、支持的数据类型及性能等方面都存在较大差异,我们可以根据需要自行选择。
Stub:我们看成代理对象,它会屏蔽 RPC 调用过程中的复杂的网络处理逻辑,使其透明简单,且能够保持与本地调用一样的代码风格。
通信传输:即 RPC 的底层通信传输模块,一般通过 Socket 在客户端与服务端之间传递请求与应答消息。

公众号:Java 猫说
学习交流群:728698035
现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

正文完
 0