如何理解RPC

简述

远程过程调用(Remote Procedure Call,缩写为RPC),是一种用于构建基于C/S(客户端/服务器)的分布式应用程序技术。调用者与被调用者可能在同一台服务器上,也可能在由网络连接的不同服务器上,对于他们来说,网络通信是透明的,远程调用像本地调用一样简单。

理解

RPC就是要像调用本地函数一样去调用远程函数,要理解RPC,让我们先来看看如何完成一个本地函数的调用:

int add(int x,int y)
{
    return x + y;
}

int a = 1;
int b = 1;
int result = add(a,b);

add函数的执行流程大致为:

  1. 分别将变量a、b的值压入栈
  2. 执行add函数,从栈中取出a、b的值赋值给x、y
  3. 计算x+y的值,并保存在栈中
  4. 退出add函数,将x+y的值赋值给result

本地过程调用发生在同一个进程,共享内存区域,但是RPC通信需要跨过不同的机器,不同的进程,因此需要解决几个问题:

  • 函数ID
  • 序列化、反序列化
  • 网络传输

函数ID

第一个需要解决的问题是如何定位函数的位置,如何告诉远程服务器调用的是哪个函数?
在本地调用中,通过函数指针来指定函数体,调用add函数,编译器会自动通过函数指针确定add函数在内存中的位置。但是在RPC中,无法通过函数指针来完成调用,因为它们的内存地址可能是完全不同的。所以调用方和被调用方同时需要维护一个{函数<->ID}的映射表,来保证调用到正确的函数。

序列化、反序列化

本地过程调用中传参是通过栈内存结构来实现的,但是RPC并不能直接使用内存来传递参数,因此传输过程中需要把参数或者返回值序列化,转化为字节流,反之为反序列化。


image.png | center | 246x224

序列化(serialization)是指将数据结构或物件状态转换成可取用格式(例如存成档案,存于缓冲,或经由网络中传送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。

序列化方式的优劣很大程序上影响了RPC的性能,市场上也有很多种序列化方案供选择,如何选择?可以从以下几个角度考虑:

  • 通用性:是否能支持较为复杂的数据结构,如Map等;
  • 性能:序列化所需要的时间以及所占用的空间;
  • 拓展性:是否可以很好的应对公司业务的发展。

网络传输:

函数的调用方和被调用方通常是通过网络连接的,也就是说函数ID、序列化之后的字节流都需要通过网络传输,因此并不局限于某种网络协议,只要可以完成传输即可。比如有的RPC框架使用TCP协议、有的使用HTTP。

对于Java语言来讲,使用IO相关的类库便可以完成网络编程。两种常用的通信模型:BIO与NIO,无论是哪一种模型,实现起来都比较复杂,对程序员要求较高,很有可能会出现隐藏Bug,于是便有了网络通信的编程框架。

Mina和Netty都是Java生态中非常知名的通信框架,它们出自同一个作者:Trustin Lee ,Mina诞生略早,属于Apache基金会,早年火热,如今更新缓慢;而Netty开始在Jboss名下,后来自立门户netty.io,现在大受欢迎,许多RPC框架都基于Netty实现,如阿里的dubbo。

框架

上文中,我们知道实现RPC通信需要解决三个问题,其中序列化、反序列化和网络传输实现的方式多种多样,因此市场上也有着很多种RPC框架。

国内:

  • Dubbo:阿里开源的一款高性能RPC框架,在国内应用广泛,期间停止维护过一段时间,如今又开始了更新,并且捐献给Apache基金会,孵化中;
  • Dubbox:当当团队基于Dubbo升级的一个版本,支持RESTful风格API的远程调用,基于Kryo/FST的Java高效序列化实现等功能,可直接用于生产环境;
  • Motan:新浪微博于2016年开源,“在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用”。

国外

  • gRPC:Google开源,具有平台无关性,基于http/2协议,支持服务追踪、负载均衡、健康检查等功能;
  • Thrift:可伸缩的跨语言服务的RPC软件框架,最早由Facebook开发,2007年捐献给了Apache基金会管理,现在是Apache的顶级项目;
  • Finagle:Twitter基于Netty开发的支持容错的、协议无关的RPC框架,支撑了Twitter的核心服务。

参考

  1. RPC wiki
  2. Remote Procedure Calls (RPC)
  3. 你应该知道的RPC原理
  4. 谁能用通俗的语言解释一下什么是 RPC 框架?

猜你喜欢

转载自blog.csdn.net/u013201439/article/details/81460373
今日推荐