RPC原理及应用

Posted 云计算通俗讲义

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC原理及应用相关的知识,希望对你有一定的参考价值。


01

背景

    对于一个电商平台而言, 往往涉及购物车,订单,支付,商品等多个模块,这就需要多个人员进行维护,如果采用单机系统,就会导致这样的问题:

    1、某人在维护自己模块代码时,需要将所有代码编译打包,其余模块可能需要回归测试;

    2、其中一个模块出问题,可能导致整个系统故障。

    这就出现了远程过程调用RPC,它使得我们可以像调用本地函数一样调用远程服务器的函数。

    RPC是分布式的基石


    从单机走向分布式,产生了很多分布式的通信方式:

    1、TCP/UDP二进制传输:最古老,也是最有效的,事实上所有的通信方式归根结底都是TCP/UDP;

    2、CORBA(Common Object Request Broker Architecture):古老而复杂,支持面向对象的通信协议;

    3、Web Service(SOA SOAP RDDI WSDL):基于http+xml的标准化Web API;

    4、RestFul(Reprensentational State Transfer):http+json;

    5、RMI(Remote Method Invocation):Java内部的分布式通信协议;

    6、JMS(Java Message Service):JavaEE的消息框架标准,很多MQ支持;

    7、RPC(Remote Procedure Call):远程过程调用,这只是一个统称,重点在于方法调用,具体实现甚至可以用RMI RestFul等去实现,但一般不用,因为RMI不能跨语言,而ResuFul效率太低。

    多用于服务器集群间的通信(分布式或微服务架构),因此常使用更加高效、短小精悍的传输模式以提高效率。


02

概述

    RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。除RPC之外,常见的多系统数据交互方案还有分布式消息队列、HTTP请求调用、数据库和分布式缓存等。

    RPC是一种概念,HTTP也是RPC实现的一种方式。

    通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于HTTP协议,只是传输协议而已。

    2.1 RPC与HTTP

    和一般基于Message的分布式框架(如MPI)相比,RPC更加抽象,也更方便理解。不过在底层,无论是RPC还是MPI,终究还是要转化成TCP/UDP包发来发去的。

    对比:


RPC

HTTP

性能

主要差别在序列化和反序列化

RPC通过thrift实现二进制传输

HTTP一般是json格式

序列化更消耗性能

传输协议

RPC基于TCP,也可以基于HTTP长连接

HTTP只能是HTTP

负载均衡

RPC自带负载均衡

HTTP需自己处理,如nginx

传输效率

可自定义TCP协议,报文相对较小

或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率

HTTP报文有很多无用信息(头部信息)

通知

RPC自动通知

HTTP事先通知

自行修改Nginx配置或其他负载均衡配置

    RPC适用于公司内部使用,性能消耗低,传输效率高,服务治理方便,但是不建议传输较大的文本、视频等。

    HTTP适用于对外的技术,公司上下游的调用可以使用MQ。主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。

    2.2 RPC与IPC

    我们通常所说管道、FIFO等是同一机器的进程间通信方式(IPC),RPC是不同机器之间进程通信方式。

    2.3 RPC与Socket

    RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用)。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

    RPC作为普遍的C/S开发方法,开发效率高效,可靠。但RPC方法的基本原则是--以模块调用的简单性忽略通讯的具体细节,以便程序员不用关心C/S之间的通讯协议,集中精力对付实现过程。这就决定了RPC生成的通讯包不可能对每种应用都有最恰当的处理办法,与Socket方法相比,传输相同的有效数据,RPC占用更多的网络带宽

    2.4 RPC与MQ

    区别:

    1、在架构上,MQ有一个中间结点,可以把消息存储。

    2、同步调用:对于要立即等待返回处理结果的场景,RPC是首选。

    3、MQ的使用,一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时响应),需要在队列里缓存。另外一方面,它更侧重数据的传输,因此方式更加多样化,除了点对点外,还有订阅发布等功能。

    4、随着业务增长,处理端出现性能瓶颈,此时会进行同步调用改造为异步调用,可以考虑使用MQ。

    由此可知,二者最大的区别是,RPC没有broker, 而消息队列是需要管理消息的存储的,RPC没有存储,只有通信

    总结:

    异步MQ,同步RPC


03

分类

    常见的RPC技术有Cobra、RMI、.NET Remoting、WebService、JSON-RPC、XML-RPC、Hessian、Thrift、Protocol Buffer、gRPC等等。

    按照序列化机制的特点,我们可以把RPC技术分为文本的(WebService、JSON-RPC、XML-RPC等)和二进制的(RMI、Hessian、Thrift、Protocol Buffer等)。

    按照常见的通信协议来看,我们又可以分为基于HTTP的(WebService、Hessian等)和基于TCP的(RMI、.NET Remoting等)。

    按照是否可以用于多个不同平台,又可以分为平台特定的(RMI是Java平台特定的、.NET Remoting是.NET平台特定的)和平台无关的(比如WebService、JSON-RPC、Hessian等)。


04

模式

    按照调用方式来看,RPC有四种模式:

    RR(Request-Response)模式,又叫请求响应模式,指每个调用都要有具体的返回结果信息。

    Oneway模式,又叫单向调用模式,调用即返回,没有响应的信息。

    Future模式,又叫异步模式,返回拿到一个Future对象,然后执行完获取到返回结果信息。

    Callback模式,又叫回调模式,处理完请求以后,将处理结果信息作为参数传递给回调函数进行处理。

    这四种调用模式中,RR和Oneway最常见。

    从本质上看,RPC一般对于客户端的来说是一种同步的远程服务调用技术。与其相对应的,一般来说MQ是一种异步的调用技术


    而对于MQ,根据消息处理的特点,我们又可以总结两种消息模式:

    点对点模式(Point to Point,PTP),一个生产者发送的每一个消息,都只能有一个消费者能消费,看起来消息就像从一个点传递到了另外一个点。

    发布订阅模式,(Publish-Subscribe,PubSub,一个生产者发送的每一个消息,都会发送到所有订阅了此队列的消费者。


05

原理

    RPC的一般需要经历4个步骤:

    1、建立通信

    A机器想要调用B机器,首先得在客户端和服务器之间建立TCP连接。

    2、服务寻址

    3、网络传输

    1)序列化

    当A服务器上的应用发起一个RPC调用时,调用方法和参数数据都需要先进行序列化。

    2)反序列化

    当B服务器接收到A服务器的请求之后,又需要对接收到的参数等信息进行反序列化操作。

    4、服务调用

    B服务器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A服务器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A服务器。

    通常,一次完整的PRC调用需要经历如上4个步骤。


    5.1 组件

    一个RPC框架一般包含以下几个组件:

    RPC Server:负责导出(export)远程接口

    RPC Client:负责导入(import)远程接口的代理实现

    RPC Proxy:远程接口的代理实现

    RPC Invoker:

    客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回;

    服务方实现:负责调用服务端接口的具体实现并返回调用结果

    RPC Protocol:负责协议编/解码

    RPC Connector:负责维持客户方和服务方的连接通道和发送数据到服务方

    RPC Acceptor:负责接收客户方请求并返回请求结果

    RPC Processor:负责在服务方控制调用过程,包括管理调用线程池、超时时间等

    RPC Channel:数据传输通道

    5.2 序列化

    RPC实现另一台机器的调用通信,本质上是借助底层TCP/IP协议,通过序列化和反序列化实现的

    序列化把对象转换为可传输的二进制。可以采用JDK(仅适用于Java),JSON(跨语言,文本化,比二进制包大,性能稍差),Hessian,Protobuf(使用IDL文件,对数据类型做了约定,跨语言能力强)。

    反序列化安全问题,采用白名单:

    1、扫描接口类声明的类型

    2、系统内置白名单

    3、用户定义白名单

    5.3 服务发现

    服务发现:

RPC原理及应用

    健康检查:

RPC原理及应用

    通过状态机实现节点假死的转移。

    通过心跳机制将亚健康的节点转换为死亡状态,然后还可以通过探活机制实现节点状态的检查。

    5.4 负载方式

    负载均衡:

RPC原理及应用 


    负载方式:

    1、随机负载

    2、一致性hash负载

    3、自适应负载(计算TPS,利用率等计算出权重)

    集群策略:

RPC原理及应用

    集群策略:快速失败,失败重试,定点调用

    5.5 流量控制

    服务端流量控制:

RPC原理及应用

    流量控制方案:

    1、识别调用来源

    2、单节点限流:平滑限流算法

    3、集群限流

    5.6 分组部署

    5.7 安全认证


06

特点

    优点:

    1、长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;

    2、RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作;

    3、提升系统可扩展性;

    4、提升系统可维护性和持续交付能力;

    5、实现系统高可用。

    缺点:

    1、一个完善的RPC框架开发难度大;

    2、RPC框架调用成功率受限于网络状况;

    3、调用远程方法对初学者来说难度大。


07

框架

    Dubbo

    Dubbo是阿里巴巴开源的一个Java高性能优秀的服务框架,可以和Spring框架无缝集成。

    Montan

    Montana是新浪微博开源的一个Java框架。

    Spring Cloud

    rpcx

    rpcx是go语言生态圈的Dubbo。

    gRPC

    gRPC是Google开发的高性能、通用的开源RPC框架。

    gsaop

    gsoap更适合C/C++程序,重量级应用。

    Thrift

    适合Java程序,中量级应用。

    rest

    适合脚本语言,轻量级应用。

    对比


Dubbo

Montana

Rpcx

gRPC

开发语言

Java

Java

Go

跨语言

分布式

×

多序列化框架支持

×

多种注册中心

[Hessian2JSON,可拓展]

×

[支持protocolbuf]

管理中心

×

×

跨编程语言

×

×

×


08

应用

    RPC在我们熟悉的各种中间件中都有它的身影。我们这里说的RPC指的是广义的RPC,即分布式系统的通信技术。

    8.1 Nginx与RPC

    Nginx和后端服务之间的交互在本质上也可以理解为RPC数据交互。

    8.2 Hadoop与RPC

    Hadoop文件系统HDFS,一般包括一个NameNode和多个DataNode,NameNode和DataNode之间就是通过一种称为Hadoop RPC的二进制协议进行通讯。

    8.3 TensorFlow与RPC

    Tensorflow Cluster的RPC通讯框架使用了Google内部自研的gRPC框架。

你们点点“分享”,给我充点儿电吧~

以上是关于RPC原理及应用的主要内容,如果未能解决你的问题,请参考以下文章

RPC原理及应用

RPC框架面试总结-RPC原理及实现

Java学习---快速掌握RPC原理及实现

RPC原理及实现

《RPC 应用与原理概述》之入门介绍

RPC原理及实现