必知必会 – 一文搞定理解RPC

  • 2019 年 10 月 4 日
  • 筆記

必知必会 – 一文搞定理解RPC

前言RPC概念RPC协议RPC组成RPC协议RPC框架RPC的优点RPC与HTTP的区别

前言

RPC的概念相信很多软件从业人员或多或少都接触过,从开发到测试都可能需要跟它打交道。 但是对于为什么要用RPC?RPC的优点是什么?RPC是什么原理?它跟HTTP有什么不同?相信并不是每个人都比较熟悉。 那么今天我们就来了解下到底什么是RPC?

RPC概念

如果你百度过RPC,那么你一定看过RPC的百科介绍。RPC(Remote Procedure Call)即远程过程调用。 说真的百科里讲的也只有概念,没有一点可以帮助你理解RPC的细节内容。所以关于概念这里要多讲讲其它的辅助内容。

RPC协议

通常我们所说的RPC其实是说的RPC协议,即一种专门为服务间远程调用而设计的一种通用协议。 该协议基于其它已有的传输协议,规定通信方式为C/S架构;并且在代码开发过程中要屏蔽掉底层通信细节, 让开发者像调用本地方法一样,调用远程服务。

RPC组成

基于RPC协议内容的说明,再来看看RPC的主要组成内容:

  • 确定一个已有的传输协议(TCPUDPHTTPWebsocket等)
  • 一个客户端通信实现模块(即客户端stub)
  • 一个服务端通信实现模块(即服务端stub)
  • 选择一个RPC内容协议(如:json、xml、protobuf等)

这是网络上的一张RPC架构组成图,正好包含了上述列举的几项内容。

RPC

这张图中的client就是我们要开发的功能代码。如果我们想调用远程服务的话,可以直接编写类似本地方法的代码;如:

Calculator.add(1, 2)  

然鹅,这里并不是真的调用了本地的add实现方法,而是调用了客户端stub模块; 而剩下的事情就交给客户端stub,它会负责与服务端的stub进行通信,使用约定的传输协议,内容协议等; 最后完成远程调用并返回结果给client模块。

RPC协议

RPC协议是一个开放的协议,不像TCP和HTTP一样规定了统一的标准,任意的使用方都只能使用相同的规则。 RPC协议可以有很多种实现,只要通信双方约定好就行了。目前市面上的RPC协议实现就有很多种:

  • dubbo
  • rmi
  • hessian
  • webserivice
  • http
  • thrift
  • memcached
  • redis
  • rest
  • jsonrpc
  • motan
  • yar
  • grpc
  • restful

这些协议可以适用于不同的业务场景,比如:dubbo协议适合高频的小数据量调用,hessian则适合文件传输, 而jsonrpc、grpc则适合跨语言的应用。这些协议也与TCP等协议类似,都规定了自己的头信息和body部分, 用于约定通信的规则。

RPC框架

不使用RPC框架能不能进行RPC的调用呢?答案当然是可以的!那为什么还需要RPC框架呢?因为有了RPC框架 我们在使用RPC调用时,就会更加的方便了。比如:RPC框架会帮助我们做这些事情:

  • 客户端stub、服务端stub的实现
  • 通信内容的序列化与反序列化实现(json、xml、protobuf)
  • 服务的注册与发现
  • 服务方负载均衡
  • 并发性能调优

有了RPC框架之后,就不需要再单独的为项目开发这些基础功能了,这样开发具有RPC功能的客户端、 服务端都跟开发普通本地模块一样方便。

RPC的优点

说了这么多,那么RPC到底有什么优点呢?其实讲RPC的优点要结合RPC的使用场景,否则RPC可能就无法体现它的优势。 通常而言RPC的特点如下:

  • 调用远程服务像调用本地方法一样方便
  • 多种传输协议可以选择
  • 为系统提供较强可扩展性、高可用性、维护性

RPC与HTTP的区别

在上面的RPC协议中,也许你已经发现了有HTTP协议。是的没错!就是HTTP协议。 所以RPC和HTTP本质上是面向不同场景的产物。而RPC也可以基于HTTP协议来实现信息内容的传输。 除此之外,RPC和HTTP还有如下典型的区别:

  • RPC可以基于TCP、HTTP、WebStock等作为基础传输协议,而HTTP只能是http协议
  • RPC使用二进制来传输信息内容(体积更小),HTTP则使用文本格式
  • RPC的二进制序列化效率高,HTTP的文本序列化(如json)则耗时多
  • RPC基于TCP时可以网络IO多路复用,HTTP不能很好的支持
  • RPC可以很方便支持服务治理,而HTTP则需要单独实现支持

简而言之,就是RPC在远程调用的场景下,比HTTP更高效,更简洁、附加特性更强大,更适合分布式和微服务的场景。