重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章为大家展示了如何分析原理及应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
成都创新互联公司专业为企业提供开原网站建设、开原做网站、开原网站设计、开原网站制作等企业网站建设、网页设计与制作、开原企业网站模板建站服务,10余年开原做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
对于一个电商平台而言, 往往涉及购物车,订单,支付,商品等多个模块,这就需要多个人员进行维护,如果采用单机系统,就会导致这样的问题:
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效率太低。
多用于服务器集群间的通信(分布式或微服务架构),因此常使用更加高效、短小精悍的传输模式以提高效率。
RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。除RPC之外,常见的多系统数据交互方案还有分布式消息队列、HTTP请求调用、数据库和分布式缓存等。
RPC是一种概念,HTTP也是RPC实现的一种方式。
通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于HTTP协议,只是传输协议而已。
和一般基于Message的分布式框架(如MPI)相比,RPC更加抽象,也更方便理解。不过在底层,无论是RPC还是MPI,终究还是要转化成TCP/UDP包发来发去的。
对比:
RPC适用于公司内部使用,性能消耗低,传输效率高,服务治理方便,但是不建议传输较大的文本、视频等。
HTTP适用于对外的技术,公司上下游的调用可以使用MQ。主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
我们通常所说管道、FIFO等是同一机器的进程间通信方式(IPC),RPC是不同机器之间进程通信方式。
RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用)。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC作为普遍的C/S开发方法,开发效率高效,可靠。但RPC方法的基本原则是:以模块调用的简单性忽略通讯的具体细节,以便程序员不用关心C/S之间的通讯协议,集中精力对付实现过程。这就决定了RPC生成的通讯包不可能对每种应用都有最恰当的处理办法,与Socket方法相比,传输相同的有效数据,RPC占用更多的网络带宽。
区别:
1、在架构上,MQ有一个中间结点,可以把消息存储。
2、同步调用:对于要立即等待返回处理结果的场景,RPC是首选。
3、MQ的使用,一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时响应),需要在队列里缓存。另外一方面,它更侧重数据的传输,因此方式更加多样化,除了点对点外,还有订阅发布等功能。
4、随着业务增长,处理端出现性能瓶颈,此时会进行同步调用改造为异步调用,可以考虑使用MQ。
由此可知,二者最大的区别是,RPC没有broker, 而消息队列是需要管理消息的存储的,RPC没有存储,只有通信。
总结:
异步MQ,同步RPC。
常见的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等)。
按照调用方式来看,RPC有四种模式:
RR(Request-Response)模式,又叫请求响应模式,指每个调用都要有具体的返回结果信息。
Oneway模式,又叫单向调用模式,调用即返回,没有响应的信息。
Future模式,又叫异步模式,返回拿到一个Future对象,然后执行完获取到返回结果信息。
Callback模式,又叫回调模式,处理完请求以后,将处理结果信息作为参数传递给回调函数进行处理。
这四种调用模式中,RR和Oneway最常见。
从本质上看,RPC一般对于客户端的来说是一种同步的远程服务调用技术。与其相对应的,一般来说MQ是一种异步的调用技术。
而对于MQ,根据消息处理的特点,我们又可以总结两种消息模式:
点对点模式(Point to Point,PTP),一个生产者发送的每一个消息,都只能有一个消费者能消费,看起来消息就像从一个点传递到了另外一个点。
发布订阅模式,(Publish-Subscribe,PubSub),一个生产者发送的每一个消息,都会发送到所有订阅了此队列的消费者。
RPC的一般需要经历4个步骤:
1、建立通信
A机器想要调用B机器,首先得在客户端和服务器之间建立TCP连接。
2、服务寻址
要解决寻址的问题,A服务器上如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么。
3、网络传输
1)序列化
当A服务器上的应用发起一个RPC调用时,调用方法和参数数据都需要先进行序列化。
2)反序列化
当B服务器接收到A服务器的请求之后,又需要对接收到的参数等信息进行反序列化操作。
4、服务调用
B服务器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A服务器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A服务器。
通常,一次完整的PRC调用需要经历如上4个步骤。
一个RPC框架一般包含以下几个组件:
RPC Server:负责导出(export)远程接口
RPC Client:负责导入(import)远程接口的代理实现
RPC Proxy:远程接口的代理实现
RPC Invoker:
客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回;
服务方实现:负责调用服务端接口的具体实现并返回调用结果
RPC Protocol:负责协议编/解码
RPC Connector:负责维持客户方和服务方的连接通道和发送数据到服务方
RPC Acceptor:负责接收客户方请求并返回请求结果
RPC Processor:负责在服务方控制调用过程,包括管理调用线程池、超时时间等
RPC Channel:数据传输通道
RPC实现另一台机器的调用通信,本质上是借助底层TCP/IP协议,通过序列化和反序列化实现的。
序列化把对象转换为可传输的二进制。可以采用JDK(仅适用于Java),JSON(跨语言,文本化,比二进制包大,性能稍差),Hessian,Protobuf(使用IDL文件,对数据类型做了约定,跨语言能力强)。
反序列化安全问题,采用白名单:
1、扫描接口类声明的类型
2、系统内置白名单
3、用户定义白名单
服务发现:
调用方和提供方通过注册中心实现函数(地址)的发布和订阅,提供方将自己的函数注册到注册中心,调用方到注册中心订阅相应的函数。
健康检查:
通过状态机实现节点假死的转移。
通过心跳机制将亚健康的节点转换为死亡状态,然后还可以通过探活机制实现节点状态的检查。
负载均衡:
负载方式:
1、随机负载
2、一致性hash负载
3、自适应负载(计算TPS,利用率等计算出权重)
集群策略:
集群策略:快速失败,失败重试,定点调用
服务端流量控制:
流量控制方案:
1、识别调用来源
2、单节点限流:平滑限流算法
3、集群限流
优点:
1、长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;
2、RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作;
3、提升系统可扩展性;
4、提升系统可维护性和持续交付能力;
5、实现系统高可用。
缺点:
1、一个完善的RPC框架开发难度大;
2、RPC框架调用成功率受限于网络状况;
3、调用远程方法对初学者来说难度大。
Dubbo
Dubbo是阿里巴巴开源的一个Java高性能优秀的服务框架,可以和Spring框架无缝集成。
Montan
Montana是新浪微博开源的一个Java框架。
Spring Cloud
rpcx
rpcx是go语言生态圈的Dubbo。
gRPC
gRPC是Google开发的高性能、通用的开源RPC框架。
gsaop
gsoap更适合C/C++程序,重量级应用。
Thrift
适合Java程序,中量级应用。
rest
适合脚本语言,轻量级应用。
对比
RPC在我们熟悉的各种中间件中都有它的身影。我们这里说的RPC指的是广义的RPC,即分布式系统的通信技术。
Nginx和后端服务之间的交互在本质上也可以理解为RPC数据交互。
Hadoop文件系统HDFS,一般包括一个NameNode和多个DataNode,NameNode和DataNode之间就是通过一种称为Hadoop RPC的二进制协议进行通讯。
Tensorflow Cluster的RPC通讯框架使用了Google内部自研的gRPC框架。
上述内容就是如何分析原理及应用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。