Jianglinyuan

9 天前

RPC 架构初探

本文作者:IMWeb Jianglinyuan 原文出处:IMWeb社区 未经同意,禁止转载

RPC 架构初探

RPC的全称是Remote Procedure Call,它是一种进程间的通信方式。允许像调用本地服务一样调用远程服务,它的具体的实现方式可以不同,例如Spring的HTTP Invoker,FaceBook的Thrift二进制私有协议通信。

RPC概念术语在上世纪80年代由Bruce Jay Nelson提出,在他的论文中对RPC进行了如下的总结:

  • 简单:RPC概念的语义十分清晰和简单,这样建立分布式计算就更容易。
  • 高效:过程调用看起来十分简单并且高效。
  • 通用:在单机计算中过程往往是不同算法和API,跨进程调用最重要的是通用的通信机制。

2006年之后,随着移动互联网的发展,各种智能终端的普及,远程分布式调用已经成为主流,RPC框架也如雨后春笋搬诞生,开源和自研的RPC框架的普及标志着传统垂直应用架构时代的终结。

RPC框架的目的就是让远程过程(服务)调用更加简单、透明,RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列号方式(XML/JSON/二进制)和通信细节。框架使用者只需要了解谁在什么位置提供了什么样的远程服务接口即可,开发者不用关心底层的通信细节和调用过程。其原理图如下图所示:

RPC框架实现的几个核心的技术总结如下:

  • 远程服务提供者需要以某种形式提供调用服务相关的信息,包括不限于服务接口、数据结构,或者中间态的服务定义文件,例如Thrift的IDL文件,WS-RPC的WSDL文件定义,甚至也可以是服务端的接口说明文档;服务调用者需要通过一定的途径获取远程服务调用相关信息,例如服务器端接口定义Jar包导入,获取服务度IDL文件等。
  • 远程代理对象:服务调用者调用的服务实际是远程服务的本地代理,对于Java语言,它的实现是JDK的动态代理,通过动态代理的拦截机制,将本地调用封装成远程调用服务等等。
  • 通信:RPC框架与具体的协议无关,例如Spring的远程调用支持HTTP Invoke、RMI Invoke,MessagePeck使用的是私有的二进制压缩协议。
  • 序列化:远程通信,需要将对象转换成二进制码流进行网络传输,不同的序列化框架,支持的数据类型、数据包大小、异常类型以及性能等都不同。不同的RPC框架的应用场景也不同,因此技术选择会存在很大的差异。一些做的比较好的RPC框架,可以支持多种序列化方式,有的甚至支持用户自定义序列化框架(Hadoop Arvo)。

业界开源的RPC框架非常多,比较主流的RPC框架列举如下:

  • 由Facebook开发的远程服务调用框架Apache Thrift。
  • Hadoop的子项目Arvo-RPC。
  • Caucho提供的基于binary-RPC实现的远程通信框架Hessian。
  • Google开源的基于HTTP/2和ProtoBuf的通用RPC框架gRPC。
0条评论

    您需要 注册 一个IMWeb账号或者 才能进行评论。