一文弄懂什么是RPC

本文来说下rpc相关的知识与概念

文章目录

  • 概述
  • 什么是rpc
  • RPC架构设计
  • RPC调用流程
  • 流行的RPC框架
    • gRPC
    • Thrift
    • Dubbo
  • rpc调用与http调用
  • 本文小结


概述

远程过程调用似乎是一种有用的范式,用于在以高级语言编写的程序之间提供跨网络的通信。本文描述一个提供了远程调用工具的软件包,面对这样一个软件包时一个设计者拥有的选项,以及我们做出的选择。我们描述了我们的RPC机制的整体结构,用于绑定RPC客户端的工具,传输通信层协议,以及一些性能测量。包括用于实现高性能和最小化集群间负载的一些优化的描述。

远程过程调用(以下称RPC)的概念是非常简单的。它是基于这一观察:过程调用是一个众所周知且易于理解的机制,用于在单个计算机上运行的程序内的控制和数据的传输。因此提出扩展这种机制以提供跨网络的控制和数据的传输。但一个远程程序被调用时,该调用环境会被挂起,参数通过网络传输到该程序被调用的环境中(我们将之称为被调用者),并在那里执行相应的程序。当程序执行结束并产生结果时,结果再被传回调用环境中。此时调用环境中的执行恢复,仿佛是在单机上执行调用一样。当调用环境被挂起时,该机器上的其他进程可能仍然在执行——这取决于该环境的并行性和RPC的实现。

一文弄懂什么是RPC_第1张图片


什么是rpc

RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

除 RPC 之外,常见的多系统数据交互方案还有分布式消息队列、HTTP 请求调用、数据库和分布式缓存等。其中 RPC 和 HTTP 调用是没有经过中间件的,它们是端到端系统的直接数据交互。

通俗点说

  • RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
  • RPC会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)。
  • 客户端发起请求,服务器返回响应(类似于Http的工作方式)RPC在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

一文弄懂什么是RPC_第2张图片


RPC架构设计

先说说 RPC 服务的基本架构吧。我们可以很清楚地看到,一个完整的 RPC 架构里面包含了四个核心的组件。

  • Client
  • Server
  • Client Stub
  • Server Stub(这个Stub大家可以理解为存根)

一文弄懂什么是RPC_第3张图片

分别说说这几个组件:

  • 客户端(Client),服务的调用方。
  • 服务端(Server),真正的服务提供者。
  • 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。

RPC调用流程

RPC调用流程时序图

一文弄懂什么是RPC_第4张图片

具体实现步骤:

  1. 服务调用方(client)(客户端)以本地调用方式调用服务;
  2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在Java里就是序列化的过程;
  3. client stub找到服务地址,并将消息通过网络发送到服务端;
  4. server stub收到消息后进行解码,在Java里就是反序列化的过程;
  5. server stub根据解码结果调用本地的服务;
  6. 本地服务执行处理逻辑;
  7. 本地服务将结果返回给server stub;
  8. server stub将返回结果打包成消息,Java里的序列化;
  9. server stub将打包后的消息通过网络并发送至消费方;
  10. client stub接收到消息,并进行解码, Java里的反序列化;
  11. 服务调用方(client)得到最终结果。

RPC框架的目标就是把2-10步封装起来,把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。要做到对客户端(调用方)透明化服务, RPC框架需要考虑解决如下问题:

通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

寻址问题: A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。

序列化与反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。


流行的RPC框架

目前流行的开源 RPC 框架还是比较多的。下面重点介绍三种


gRPC

gRPC 是 Google 最近公布的开源软件,基于最新的 HTTP2.0 协议,并支持常见的众多编程语言。

我们知道 HTTP2.0 是基于二进制的 HTTP 协议升级版本,目前各大浏览器都在快马加鞭的加以支持。

这个 RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。

一文弄懂什么是RPC_第5张图片


Thrift

Thrift 是 Facebook 的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的 IDL 定义文件自动生成服务代码框架。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

用户只要在其之前进行二次开发就行,对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。


Dubbo

Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,Dubbo自2011年开源后,已被许多非阿里系公司使用。

同样的远程接口是基于 Java Interface,并且依托于 Spring 框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

一文弄懂什么是RPC_第6张图片


rpc调用与http调用

很长时间以来都没有怎么好好搞清楚RPC(即 Remote Procedure Call,远程过程调用)和 HTTP调用的区别,不都是写一个服务然后在客户端调用么?

先说一下他们最本质的区别,就是 RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基于 HTTP 协议的

我们都知道 HTTP 协议是在传输层协议 TCP 之上的,所以效率来看的话,RPC 当然是要更胜一筹啦!下面来具体说一说 RPC 服务和 HTTP 服务。


本文小结

本文介绍了rpc相关的概念与知识,对后续dubbo的学习有极大的帮助,可以对dubbo有更加深入的理解与掌握。

你可能感兴趣的:(核心知识点,dubbo,分布式,架构)