RPC

分布式系统离不开RPC远程调用,本文首先理一下什么是RPC。

1.java本地方法调用

假设你有一个Calculator,那么单体应用时,要调用Calculator的add方法来执行一个加运算,你可以方法中直接使用,因为在同一个地址空间,或者说在同一块内存,这个称为本地函数调用。

java的本地方法调用中,每个方法会作为java虚拟机栈中的一个栈帧放入到java虚拟机栈中,方法调用的时候执行入栈操作,方法执行完成执行出栈操作。

 

2.远程方法调用-RPC

需求:系统不同模块之间能够像本地方法一样调用。在一个典型的主从分布式系统中,master-slave结构,自己开发网络通信程序,TCP socket,http通信。

 

例如,使用tcp的方式,服务端启动网络服务程序等待连接,客户端启动程序连接服务端端,当客户端需要发送连接给服务端,比如心跳,需要自定义一个心跳的数据结构,并开发网络通信代码模块,发送给服务端,服务端接收后判断请求类型,做对应的处理,其中还要处理拆包,粘包等网络底层问题。使用HTTP的实现也有同样的问题,只不过将socket编程换成了HTTP调用。不论使用哪种通信协议,都需要在开发时嵌入这么一段远程通信的代码,客户端发起xxRequest,服务端返回xxResponse响应。

对于上面的代码我们可以做一些改进:使用一个代理,而这个代理对象的内部,就是通过Client来实现远程过程调用的。就变成了了下图所示:

 

 

这个方式中解决了如下两个问题:

1.分布式系统中,服务之间的调用问题。

2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,也可以使用HTTP,为通信程序之间携带信息数据。RPC的核心并不在于使用什么协议。RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式。

RPC = 网络协议 + 序列化

服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出。这样能实现通讯。比如需要发送流大小,编码,Ip等。这样就有了协议,协议就是规范,就是发送的流中携带了很多的内容。发送的内容就是文本类型,客户端就得序列化,那么常用的就有json,xml之类,如果想把内容变得更小,那就有二进制了。把文本变成二进制传递。

RPC 只是一种概念、一种设计,就是为了解决 不同服务之间的调用问题, 它一般会包含有 传输协议 和 序列化协议 这两个。

 

 

RPC调用过程

  1. 服务消费方(client)调用以本地调用方式调用服务;
  2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
  3. client stub找到服务地址,并将消息发送到服务端;
  4. server stub收到消息后进行解码;
  5. server stub根据解码结果调用本地的服务;
  6. 本地服务执行并将结果返回给server stub;
  7. server stub将返回结果打包成消息并发送至消费方;
  8. client stub接收到消息,并进行解码;
  9. 服务消费方得到最终结果。

RPC框架屏蔽了底层细节,对于调用者来说感受不到远程调用的存在

 

 

常见的RPC协议框架:

  • RMI(JDK自带): JDK自带的RPC,有很多局限性,不推荐使用。
  • Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。除了RPC外,DUBBO还实现了很多服务治理的功能,相对更上层一些。
  • gRPC :gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
  • Hessian: Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
  • Thrift: Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
  • AKKA:akka基于actor模型,充分利用携程的性能优势,是对并发、并行程序的简单的高级别的抽象。是异步、非阻塞、高性能的事件驱动编程模型。非常轻量的事件驱动处理机制(1GB内存可容纳约270万个Actor)。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐