「 预计阅读 4 分钟 」
旁白:我又来了~
上一篇:位运算符与(&)、或(|)、异或(^)、非(~)、左移(<<)、右移(>>)、右移补零(>>>)如何选择?
正文
远程调用
远程调用简单来说就是发送一个请求给远程机器,远程机器返回一个结果回来的过程。
为什么要这么做?
单台服务器的性能远远不能满足现在互联网这个体量的用户需求,就好比你去肯德基点餐,餐台的服务员把薯条鸡腿汉堡的任务分给不同的人,然后收集起来给你的过程,餐台服务员就相当于调用远程服务。
RPC
RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上调用某种服务。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
可以这么理解,RPC是所有语言的通用协议,有点像SOAP,而RMI是RPC的一种Java实现,或者说RMI是RPC的Java版细化要求。
只要是通过网络从而调有远端的某种服务,那么这就是RPC,而不一定就是要http请求,tcp请求,udp请求,soap报文请求都可以,何况这几种请求是有关联的。
使用代表:Dubbo
开源RPC框架
Dubbo
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前已经进入Apache孵化器。
Motan
Motan是新浪微博开源的一个Java RPC框架。2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。
gRPC
gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。
Thrift
Thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。
RMI
RMI(Remote Method Invocation)远程方法调用,能够让在客户端 Java 虚拟机上的对象调用本地对象一样调用服务器端 Java 虚拟机中的对象方法。
注:Axis框架就是基于RMI的要求而实现的,因为RMI是RPC的java语言的细化版,类似子类版,因此Axis也是实现了RPC标准的。
注:stub就是axis中客户端生成的stub,而skeleton则可以认为是Axis的那个Servlet对象,由这个对象来解析SOAP报文并找到对应的服务然后调用。
使用代表:EJB
RPC 远程调用过程
一次 RPC 调用的过程大概有 10 步:
1. 执行客户端调用语句,传送参数
2. 调用本地系统发送网络消息
3. 消息传送到远程主机
4. 服务器得到消息并取得参数
5. 根据调用请求以及参数执行远程过程(服务)
6. 执行过程完毕,将结果返回服务器句柄(也称伺服器,是提供计算服务的设备)
7. 服务器句柄返回结果,调用远程主机的系统网络服务发送结果
8. 消息传回本地主机
9. 客户端句柄由本地主机的网络服务接收消息
10. 客户端收到调用语句返回的结果数据
RMI 远程方法调用过程
1. 客户调用客户端辅助对象 stub(上图)上的方法
2. 客户端辅助对象 stub 打包调用信息(变量、方法名),通过网络发送给服务器辅助对象 skeleton
3. 服务器端辅助对象 skeleton 将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
4. 调用真正服务对象上的真正方法,并将结果返回给服务器辅助对象 skeleton
5. 服务器端辅助对象将结果打包,发送给客户端辅助对象 stub
6. 客户端辅助对象将返回值解包,返回给调用者
7. 客户获得返回值
RPC 和 RMI 的区别
1、方法调用方式不同
RMI调用方法,RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。
每个远程方法都具有方法签名。
如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
RPC调用函数,RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。这就向RPC服务器表明,被请求的方法在“classname”的类中,名叫“methodname”。
然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后通过网络协议发回。
2、适用语言范围不同
RMI只用于Java,支持传输对象。
RPC是基于C语言的,不支持传输对象,是网络服务协议,与操作系统和语言无关。
3、调用结果的返回形式不同
RMI是面向对象的,Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型。
RPC的结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。只有由XDR定义的数据类型才能被传递,可以说RMI是面向对象方式的Java RPC。
如果你觉得文章不错,欢迎在看、转发、赞赏一条龙,你的支持就是我最大的动力。
<END>
推荐阅读:
网易裁员,让保安把身患绝症的员工赶出公司!前网易员工亲述经历的噩梦!
全球IPv4地址正式耗尽!