您的位置:首页 > 其它

RPC和WebService等相关远程通信概念理解

2015-08-18 19:49 302 查看
借知乎上大神的回答,重新整理如下:

首先,RPC WebService SOAP RMI REST
CORBA JMS等概念都是远程通信用的,只需要搞清楚:

传输层:如何传输,一般基于tcp或http;各种自定义协议;

协议层:(考虑传过来后如何读数据就可以)

1)文本类:xml,json

2)二进制:protobuf,thrift,mcpack等

RMI(remote method invocation,面向对象的远程方法调用)

RPC(remote procedure call,远程过程调用)

SOAP(simple object access protoal,简单对象访问协议)

REST(representational state transfer,表达性状态转移)

RPC是一个技术类别,和其他的几个术语不是同一类的。

RPC应该算是一个概念吧,RMI、REST、WEBSERVICE等也属于RPC,只是protocol不同。现在一谈到RPC更多的是想到dobbo、thrift、avro、hessian等框架。

个人理解是这样的,相对于淘宝、微信等的开发者API应用,一般所谓的RPC不仅仅得到的是一串JSON或XML铺在HTML上。RPC除了JSON和XML外更多的是可以传递二进制的数据,而且可以反序列化,就像是我们在我们自己的程序中从service接口拿一组List<User>一样使用。

RMI是Java自带的一些功能,也是EJB的通信基础,现在的Spring等框架上都有,如果你的项目只有Java,不会出现其他环境的系统(如.NET,Ruby,Python,PHP等),那用RMI应该是最有效,也是最简单的,用最纯粹的序列化就可以了;

RPC 和 REST 是两种不同的 API 接口风格。JMS 是另外一种不同风格的接口,但只是针对 Java 的,它所对应的更宽泛的接口风格是消息通讯。

RMI 和 CORBA 是两种较早期的 RPC 实现。RMI 仅仅可以用于 Java 之间的通讯,不能跨语言。CORBA 虽然是为跨语言而设计,但因为该协议过于复杂,早期实现了 CORBA 的语言之间在互通性上也存在诸多问题,而现今的新型语言绝大多数已经不再支持这个东西了。

WebService 有广义和狭义之分。广义的 WebService 包含了 RPC、REST、消息通讯等各种形式的远程通讯方式。而狭义的 WebService 特指以 SOAP 作为消息体的一种远程通讯方式,但即使是狭义的WebService,也不仅仅只有 RPC 一种风格的 API 接口,它也包括另一种消息通讯的方式的接口。但是狭义的 WebService 因为传输的数据臃肿,跨语言能力并没有它所标榜的那样好,因此现在大部分人都已经抛弃它而转向更轻量级的 RPC 通讯了。

比如现在比较流行的 RPC 有gRPCHproseApache ThriftJSON-RPC 等等。

附:

1、RPC:(Remote Procedure Call Protocol)

RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成

“classname.methodname”形式。

优点:跨语言跨平台,C端、S端有更大的独立性。

缺点:不支持对象,无法在编译器检查出错误,只能在运行期检查发现错误。

2、JMS:(Java Message Service)

JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS支持两种消息模型:Point-to-Point(P2P)

和Publish/Subscribe(Pub/Sub),即点对点和发布订阅模型。

3、Web Service:

web service提供的服务是基于web容器的,底层使用http协议,类似一个远程的服务提供者,例如天气预报服务,对各地的客户端提供天气预报,是一种请求应答机制,是跨系统跨平台的。就是一个servlet,提供服务出去。

首先,客户端从服务器得到WebService的WSDL,同时在客户端生成一个代理类,这个代理类负责与WebService服务器进行通信,当一个数据(XML格式的)被包装成SOAP(简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。)格式的数据发送到服务器端的时候,就会生成一个进程对象并且把接收到的这个Request的SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个结果进行SOAP包装,然后把这个包作为一个

Response发送给客户端的代理类,然后这个代理类也对这个SOAP包进行解析出来,继而进行后续操作,这就是WebService的一个

运行过程。

Web Service的五大层次:

1、http传输协议(信道)

2、XML的数据格式

3、SOAP的封装格式(用来描述传递信息的格式)

4、WSDL(Web Service Description Language)的描述方式(用来描述如何访问具体的接口)

5、UDDI (Universal Description Discovery
and Integration)是一种目录服务,可以用来管理(分发、注册、查询)WebService

4、RMI:(Remote Method Invocation)

RMI采用stubs 和 skeletons 来进行远程对象的通讯。stub充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是在本地工作,采用TCP/IP协议,客户端直接调用服务端上的一些方法。

优点:强类型,编译器即可检查错误,更快。

缺点:只能基于JAVA语言,客户端和服务器紧耦合,易用性没Web Service好。

总结:

Web Service 就是在http即应用层协议上传递xml数据格式的文本文件,与语言和平台无关。

RMI是在TCP/IP即传输层协议上传递可序列化的java对象(对象流化),只能在JVM上,绑定语言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: