赞
踩
在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。后面,广发采用WebService来实现远程调用,但是,WebService需要定义非常复杂的Scheme文件,导致无效数据内容过于臃肿。之后,就被HTTP加JSON的方案所代替了。
RPC发展到现在,实现的方式也非常多样,但是基本都实现了跨语言的远程调用。一般来说,RPC框架都应用于大型企业,只有在业务复杂度和用户体量都比较大的时候,需要对服务进行解耦,从而达到扩展性强、部署灵活的目的。目前比较流行的开源RPC框架有Goole的gRPC、Facebook的Thrift、Alibaba的Dubbo。这些框架除了提供基础的远程通信功能以外,还会在系统性能、传输效率、服务治理等方面做出一些优化设计。比如,阿里开源的RPC框架Dubbo就提供了非常丰富的服务治理功能。
RPC(远程过程调用)是一种计算机通信协议,用于在不同的进程或者计算机之间实现远程通信,使得一个进程可以调用另一个进程(通常是运行在不同机器上)的函数或方法,就像调用本地函数一样。
rpc的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的。为实现该目标,rpc框架器提供一种透明调用机制,让使用者不必是式的区分本地调用和远程调用。
基本原理:
分布式设计
部署灵活
解耦服务
扩展性强
RPC(Remote Procedure Call,远程过程调用)是一种用于在不同的计算机之间进行通信的技术,允许一个程序调用另一个程序中的函数或方法,就像调用本地函数一样,而无需程序员显式地编写通信代码。RPC的底层原理涉及通信协议、序列化和反序列化、网络传输、服务注册与发现等方面。
下面是RPC的一般工作原理:
总的来说,RPC的底层原理涉及到将方法调用的参数序列化、通过网络传输、反序列化、调用远程方法、序列化结果、再次通过网络传输、反序列化结果的过程。各种RPC框架会根据具体需求和场景进行优化和扩展。
RPC(Remote Procedure Call)框架是一种用于实现远程调用的技术,它可以让不同的进程或计算机之间通过网络进行通信和调用远程方法。以下是一些常见的 RPC 框架:
这些RPC框架在不同的场景和需求下有着各自的优势和特点,选择适合自己业务需求的RPC框架是非常重要的。每种框架都有其独特的特性和适用范围,因此在选择时需要综合考虑技术栈、性能需求、跨语言支持等因素,这些都是比较流行的 RPC 框架,每个框架都有其独特的特点和适用场景。选择合适的 RPC 框架取决于具体的需求、技术栈和团队经验。
1、RMI
利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列 化。
2、Hessian
是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采 用二进制编解码。
3、protobuf-rpc-pro
是一个Java类库,提供了基于 Google 的 Protocol Buffffers 协议的远程方法调用的框架。基于
Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志 等功能。
4、Thrift
是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,
C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。
依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
最初由facebook开发用做系统内个语言之间的RPC通信,2007年由facebook贡献到apache基金 ,现 在是apache下的opensource之一 。支持多种语言之间的RPC方式的通信:php语言client可以构造一 个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。底层通讯基于 SOCKET
5、Avro
出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下推出Avro的目标不仅是提供一套类 似Thrift的通讯中间件,更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。支持 HTTP,TCP两种协议。Apache Avro:一个数据序列化系统,也提供了RPC框架的支持,具有快速、紧凑的特点,支持多种编程语言。
rpc框架一般使用长链接,不必每次通信都要3次握手,减少网络开销。
rpc框架一般都有注册中心,有丰富的监控管理,发布,下线接口,动态扩展等,对调用方来说是无感知,统一化的操作,协议私密,安全性较高
rpc协议更简单内容更小,效率更高,服务化架构,服务化治理,rpc框架是一个强力的支撑。
rpc基于tcp实现,也可以基于http2实现
需要有非常高效的网络通信,比如一般选择 Netty 作为网络通信框架;
需要有比较高效的序列化框架,比如谷歌的 Protobuf 序列化框架;
可靠的寻址方式(主要是提供服务的发现),比如可以使用 Zookeeper 来注册服务等;
如果是带会话(状态)的 RPC 调用,还需要有会话和状态保持的功能;
跨进程,可以理解为同一台计算上的多个进程、多个JVM或者多台计算之间的进程。
那什么是RPC呢?RPC的全称是Remote Procedure Call,翻译过来叫远程过程调用。
它是一种通过网络从远程计算机程序上获取服务,而不需要了解代码网络技术实现的一种协议。凡是符合这种协议的框架,都可以称之为RPC框架。
通俗理解就是,A计算机提供一个服务,B计算机可以像调用本地服务一样去调用A计算机提供的服务,这就是RPC的主要作用。
其实,RPC的应用在很早之前就出现了。在40年以前,也就是1981年的时候,由一家叫做Nelson的公司提出,并把它应用到了分布式系统之间的通信协议。
RPC协议
要实现RPC,需要通过网络进行数据传输,并且对调用的过程进行封装。现在比较流行的RPC框架一般都是采用TCP协议作为底层的传输协议。当然,其他协议也是可以的,比如UDP。
RPC协议,强调的是过程调用,调用的过程对于用户来说是完全透明的,用户不需要关心调用细节。可以像调用本地服务一样去调用远程服务。
一个完整的RPC协议包含了四个组件,分别是Client、Server、Client Stub和Sever Stub。
Client客户端表示服务的调用方;
Sever服务端是真正的服务提供方;
Client Stub表示客户端存根,专门用来存放服务端的地址信息,再将客户端的请求参数打包成网络消息,也就是序列化,然后通过网络远程发送给服务提供方。
Server Stub表示服务端存根,用来接收客户端发送过来的消息,然后,解析消息内容,也就是反序列化,并且调用本地方法。
1、分布式系统网络通讯
2、分布式子系统之间的服务治理
3、分布式负载均衡和流控
4、服务发现与注册
5、构建分布式调试环境
1、动态代理
生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候需要用到Java动态代理技术,可
以使用JDK提供的原生的动态代理机制,也可以使用开源的:CGLib代理,Javassist字节码生成技术。
2、序列化和反序列化
在网络中,所有的数据都将会被转化为字节进行传送,所以为了能够使参数对象在网络中进行传输,需
要对这些参数进行序列化和反序列化操作。
序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。反序列化:把字节
序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高
效的开源序列化框架:如Kryo、FastJson和Protobuf等。
3、NIO通信
出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供 了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者MINA来解决NIO数据传输的问题。
4、服务注册中心
可选:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服务注册与发现功能,解决单 点故障以及分布式部署的问题(注册中心)。
一般超时容错 、重试、超时处理、
处理远程过程调用(RPC)异常的方法取决于您使用的RPC框架和编程语言。一般来说,以下是一些处理RPC调用异常的常见方法:
传输协议
RPC,可以基于TCP协议,也可以基于HTTP协议
HTTP,基于HTTP协议传输效率
RPC,使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率
HTTP,如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为⼀个RPC来使用的,这时标准RPC框架更多的是服务治理
性能消耗,主要在于序列化和反序列化的耗时
RPC,可以基于thrift实现高效的二进制传输
HTTP,大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能
负载均衡
RPC,基本都自带了负载均衡策略
HTTP,需要配置Nginx,HAProxy来实现
服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
RPC,能做到自动动通知,不影响上游
HTTP,需要事先通知,修改Nginx/HAProxy配 置
b. 总结:RPC主要⽤于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要⽤于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
RPC(Remote Procedure Call)相比于HTTP在一些情况下可能更快,这主要是由于以下几个原因:
Dubbo 和 OpenFeign 是两种常用的远程服务调用框架,它们在实现远程服务调用时有一些不同之处:
rmi
http
hessian
webservice
socket
网络通信
负载均衡
注册中心
远程通讯协议的基本原理
网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio 、 nio 、 aio 三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。
应用级协议Binary-RPC
Binary-RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种和RMI(Remote Method Invocation,远程方法调用)类似的远程调用的协议,它和RMI 的不同之处在于它以标准的二进制格式来定义请求的信息 ( 请求的对象、方法、参数等 ) ,这样的好处是什么呢,就是在跨语言通讯的时候也可以使用。
Binary -RPC 协议的一次远程通信过程:
1 、客户端发起请求,按照 Binary -RPC 协议将请求信息进行填充;
2 、填充完毕后将二进制格式文件转化为流,通过传输协议进行传输;
3 、接收到在接收到流后转换为二进制格式文件,按照 Binary -RPC 协议获取请求的信息并进行处理;
4 、处理完毕后将结果按照 Binary -RPC 协议写入二进制格式文件中并返回。
问题总结:
1 、传输的标准格式是:标准格式的二进制文件。
2 、怎么样将请求转化为传输的流?将二进制格式文件转化为流。
3 、怎么接收和处理流?通过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入 XML 中返回。
4 、传输协议是?http
RMI 是 java 语言本身提供的远程通讯协议,稳定高效,是 EJB 的基础。但它只能用于 JAVA 程序之间的通讯。
Hessian 和 Burlap 是 caucho 公司提供的开源协议,基于 HTTP 传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。跨平台有点小问题。
Httpinvoker 是 SpringFramework 提供的远程通讯协议,只能用于 JAVA 程序间的通讯,且服务端和客户端必须使用 SpringFramework。
Web service 是连接异构系统或异构语言的首选协议,它使用 SOAP 形式通讯,可以用于任何语言,目前的许多开发工具对其的支持也很好。
效率相比:RMI > Httpinvoker >= Hessian >> Burlap >> web service。
RMI (Remote Method Invocation)
RMI 采用 stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当
远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用
该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip
协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只
能基于 JAVA 语言,客户机与服务器紧耦合。
JMS(Java Messaging Service)
JMS 是 Java 的消息服务,JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。
JMS 支持两种消息模型:Point-to-Point(P2P)和 Publish/Subscribe(Pub/Sub),即
点对点和发布订阅模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。