分布式通讯方式比较(RPC、RMI、JMS、WebService、TIBCO)

发布时间 2023-11-23 16:15:34作者: IT苦行僧-QF

在分布式服务框架中,最基本的问题就是网络服务间的远程通讯。根据计算机网络通讯的基本原理,网络服务间的通讯就是将数据流从一台PC传输到另一台PC,这一切都是基于网络传输协议与网络IO实现的。网络传输技术发展至今,我们常用的协议都是基于Socket而扩展出的传输协议,主要有HTTP、TCP、UDP,网络IO主要有BIO、AIO、NIO。

基于传输协议与网络IO技术,各种语言随之发展出各种更加贴合语言的传输格式与转化为流的通讯机制,从而发展出当下我们所知晓的应用级协议,如RPC、RMI、JMS、WebService、TIBCO。

一、RPC

1.概念
Java RPC:远程过程调用(Remote Procedure Call)它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了过程的分布能力。

2.特点

会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)
注意:RPC都是同步返回技术,也就是说程序会一直等待,直到超时或者得到返回结果。

3.原理

 

 

① 执行客户端调用语句,传送参数
② 调用本地系统发送网络消息
③ 消息传送到远程主机
④ 服务器得到消息并取得参数
⑤ 根据调用请求以及参数执行远程过程(服务)
⑥ 执行过程完毕,将结果返回服务器句柄
⑦ 服务器句柄返回结果,调用远程主机的系统网络服务发送结果
⑧ 消息传回本地主机
⑨ 客户端句柄由本地主机的网络服务接收消息
⑩ 客户端接收到调用语句返回的结果数据

二、RMI

1.概念
Java RPC:远程过程调用(Remote Procedure Call)用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了过程的分布能力。

Java RMI:(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。

它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。Java 的 RMI 则在 RPC 的基础上向前又迈进了一步,即提供分布式对象间的通讯。

2.原理
RMI能让一个Java程序去调用网络中另一台计算机的Java对象的方法,那么调用的效果就像是在本机上调用一样。

RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。

RMI是Java最初的远程方法调用技术。RMI最初在JDK1.1被引入到Java平台中,它为Java开发者提供了一种强大的方法来实现Java程序间的交互。在RMI之前,对于Java开发者来说,远程调用的唯一选择就是CORBA(在当时,需要购买一种第三方产品,叫做Object Request Broker[ORB]),或者手工编写Socker程序。

3.包含
⑴. 远程服务的接口定义
⑵. 远程服务接口的具体实现
⑶. 桩(Stub)和框架(Skeleton)文件
⑷. 一个运行远程服务的服务器
⑸. 一个RMI命名服务,它允许客户端去发现这个远程服务
⑹. 类文件的提供者(一个HTTP或者FTP服务器)
⑺. 一个需要这个远程服务的客户端程序

 


4. 步骤
⑴、客户调用客户端辅助对象stub上的方法
⑵、客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton
⑶、服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
⑷、调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton
⑸、服务端辅助对象将结果打包,发送给客户端辅助对象stub
⑹、客户端辅助对象将返回值解包,返回给调用者
⑺、客户获得返回值

 


5.问题

RMI使用任意端口来交互,故RMI很难穿越防火墙。

RMI是基于JAVA的,使用了JAVA的序列化机制,所以通过网络传输的对象类型必须要保证在调用两端的Java运行时中是完全相同的版本。

三、JMS

1.概念

JMS:Java 消息服务(Java Messaging Service) 是一种允许应用程序创建、发送、接受和读取消息的Java API。JMS 在其中扮演的角色与JDBC 很相似,正如 JDBC 提供了一套用于访问各种不同关系数据库的公共API,JMS 也提供了独立于特定厂商的企业消息系统访问方式。

使用JMS 的应用程序被称为JMS客户端,处理消息路由与传递的消息系统被称为 JMS Provider,而JMS 应用则是由多个JMS 客户端和一个 JMS Provider 构成的业务系统。发送消息的JMS 客户端被称为生产者(producer),而接收消息的JMS 客户端则被称为消费者(consumer)。同一JMS 客户端既可以是生产者也可以是消费者。

JMS 的编程过程很简单,概括为:应用程序A 发送一条消息到消息服务器(也就是JMS Provider)的某个目的地(Destination),然后消息服务器把消息转发给应用程序B。因为应用程序A 和应用程序B 没有直接的代码关连,所以两者实现了解偶。

典型实现:ActiveMQ

2.JMS具有两种通信模式:

① Point-to-Point Messaging Domain (点对点)

 

 

每个消息只有一个消费者
发送者和接收者在时间上是没有时间的约束,也就是说发送者在发送完消息之后,不管接收者有没有接受消息,都不会影响发送方发送消息到消息队列中。
发送方不管是否在发送消息,接收方都可以从消息队列中去到消息
接收方在接收完消息之后,需要向消息队列应答成功
② Publish/Subscribe Messaging Domain (发布/订阅模式)

 

 

一个消息可以传递个多个订阅者(即:一个消息可以有多个接受方)
发布者与订阅者具有时间约束,针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
四、WebService

1.概念

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

2.WebService三要素(SOAP、WSDL、UDDI)

① SOAP:
SOAP(Simple Object Access Protocol:简单对象访问协议)是微软、IBM等大公司联合制定的一个协议规范。SOAP是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

② WSDL
Web Service描述语言WSDL,用于描述Web Service及其函数、参数和返回值(也就是描述如何访问具体的接口)。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

③ UDDI
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。(简单一句话概括就是:用来管理,分发,查询webService)。

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

 

 

五、TIBCO

1.概念

TIBCO Rendezvous(或称为TIBCO RV)产品是一种中间件,它具有发布/订阅(Publish/Subscribe)、基于主题寻址(Subject-Based Addressing) 和自定义数据信息(Self-Describing Data Messages)等功能,使不同应用平台上的信息在一个共享的虚拟总线Information Bus(TIB)上进行传输交换。

2. TIBCO Rendezvous 结构

① TIBCO Rendezvous Daemon(rvd)

rvd进程便会监听到消息,根据其订阅的Subject首先进行消息筛选,将筛选完成后的消息发送给消息分发进程(Dispatch Svr),由其对消息进行分类(一般RV通过XML进行消息传输,此时便可根据等区分),发送给处理相应业务处理的进程。
② TIBCO Rendezvous Routing Daemon(rvrd)

在WAN 和LAN 间跨网段有效地传递信息,业务需要与B系统跨外网进行通信就可以使用RVRD服务。

五、RMI、RPC、JMS、Webservice、TIBCO的区别

① 传输方式不同:

采用 JMS 服务,对象是在物理上被异步从网络的某个 JVM 上直接移动到另一个 JVM 上。
RMI 对象是绑定在本地 JVM 中,只有函数参数和返回值是通过网络传送的。
Webservice是两系统间的直接交互(Request <—> Response)。
RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。
TIBCO是采用UDP协议,RV在IP层使用的是广播或者组播的方式。使用广播或者组播可以直接实现一对多的发布订阅形式。
② 适用语言范围不同:

RMI只用于Java,是在TCP协议上传递可序列化的java对象,只能基于JVM运行,绑定语言,客户端和服务端都必须是java。
RPC是基于C语言的,是网络服务协议,与操作系统和语言无关。
Webservice没有语言限制,Webservice是在HTTP协议上传递XML文本文件,与语言和平台无关。
JMS最开始是java平台上的消息规范,JMS消息不是一个XML,而是一个java对象。但好在现在主流的JMS中间件都解决了异构问题。
提供Java、C、C++、ActiveX、.NET、Perl 的API 库,源码兼容所有的平台。
③ 方法调用方式不同:

RMI是面向对象的,Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型。
RPC请求包括一个参数集和一个文本集,通常形成“classname.methodname”形式,不支持传输对象。
JMS 一般只是一个点发出一个Message到Message Server端,发出之后一般不会关心谁用了这个message,步调用完全隔离了客户端和服务提供者,主流的JMS是作为三方中间件交互(Consumer <—> Broker <—> Producer)。
WebService服务通常为同步调用,需要有复杂的对象转换,Webservice是两系统间的直接交互(Request <—> Response)。
RV使用的是消息推送的模式。消息从发送端发出后,并不在 Server 上缓存, Server 只做路由把消息推送给消息接收端。消息接收端只要连接上 Server ,订阅要接收的消息,这些消息就会源源不断地从 Server 那里推送过来,消息先缓存到接收客户端的队列里,接收端应用再从队列里取消息。

参考:https://blog.csdn.net/weixin_41422086/article/details/125544593

什么是MQ和认识RabbitMQ:

https://blog.csdn.net/weixin_47316183/article/details/125464947

TIBCO中间件 介绍与部署