Fork me on GitHub

RPC-个人碎碎念

RPC(Remote Procedure Call),通常翻译为远程过程调用,但我觉得翻译成远程程序调用比较方便理解。调用的程序在不同的内存空间,通过网络调用,而不需要了解底层的网络协议(函数调用网络化),它假定了某些传输协议的存在,以便为通信程序建携带信息数据。

RPC也是经典的C/S模式,传送请求,接收回应

RPC调用的流程:

  1. 客户端调用client stub,本地调用,将参数push进栈
  2. clinet stub 将参数打包成一个消息,然后发送这个消息。打包过程叫 marshaling
  3. client所在的系统将消息发送给server
  4. server系统将收到的包传给server stub
  5. server stub 解包得到参数,解包过程叫unmarshaling
  6. 最后server stub调用服务程序,返回结果按照相反的步骤传给client

与RESTful的对比

传输协议:

  • RPC可基于TPC、UDP或HTTP
  • RESTful基于HTTP

操作对象

  • RPC操作的是对象与方法
  • RESTful操作的是资源

功能

client与服务端的点对点调用

  • stub
  • 通信
  • RPC消息序列化

服务治理

  • 服务发现与注销
  • 服务高可用
  • 负载均衡

从RPC的功能延伸出来,可以比较下当前的RPC框架,发现这些RPC框架主要有两个方向

  1. 偏向于跨语言调用方面
  • gRPC
  • thrift(不支持服务治理)
  • rpcx
  1. 偏向于服务治理方面
  • Alibab Dubbo
  • Motan

使用RPC,体会很深的的两个特性:

  1. 屏蔽了本地调用与远程调用的区别,我们调用别的机器上的程序方法就像调用本地方法一样。
  2. 屏蔽了网络通讯的复杂性,我们不用去处理复杂的网络编程相关的东西,能更专注于处理业务逻辑。