`
gavinhp
  • 浏览: 3079 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA远程通讯的方法总结

    博客分类:
  • RPC
阅读更多
转载至:http://developer.51cto.com/art/200902/110536.htm

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇文章中我们将来一探究竟。

AD:


基本原理

要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

应用级协议

远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。

原理是这样的,但为了应用的方便,业界推出了很多基于此原理之上的应用级的协议,使得大家可以不用去直接操作这么底层的东西,通常应用级的远程通信协议会提供:

为了避免直接做流操作这么麻烦,提供一种更加易用或贴合语言的标准传输格式;

网络通信机制的实现,就是替你完成了将传输格式转化为流,通过某种传输协议传输至远端计算机,远端计算机在接收到流后转化为传输格式,并进行存储或以某种方式通知远端计算机。

所以在学习应用级的远程通信协议时,我们可以带着这几个问题进行学习:

◆ 传输的标准格式是什么?

◆ 怎么样将请求转化为传输的流?

◆ 怎么接收和处理流?

◆ 传输协议是?

不过应用级的远程通信协议并不会在传输协议上做什么多大的改进,主要是在流操作方面,让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准,至于传输协议则通常都是可选的,在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,来具体的看看这些远程通信的应用级协议:

RMI

RMI是个典型的为java定制的远程通信协议,我们都知道,在single vm中,我们可以通过直接调用java object instance来实现通信,那么在远程通信时,如果也能按照这种方式当然是最好了,这种远程通信的机制成为RPC(Remote Procedure Call),RMI正是朝着这个目标而诞生的。

来看下基于RMI的一次完整的远程通信过程的原理:

◆ 客户端发起请求,请求转交至RMI客户端的stub类;

◆ stub类将请求的接口、方法、参数等信息进行序列化;

◆ 基于socket将序列化后的流传输至服务器端;

◆ 服务器端接收到流后转发至相应的skelton类;

◆ skelton类将请求的信息反序列化后调用实际的处理类;

◆ 处理类处理完毕后将结果返回给skelton类;

◆ Skelton类将结果序列化,通过socket将流传送给客户端的stub;

◆ stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者。

根据原理来回答下之前学习应用级协议带着的几个问题:

◆ 传输的标准格式是什么?

是Java ObjectStream。

◆ 怎么样将请求转化为传输的流?

基于Java串行化机制将请求的java object信息转化为流。

◆ 怎么接收和处理流?

根据采用的协议启动相应的监听端口,当有流进入后基于Java串行化机制将流进行反序列化,并根据RMI协议获取到相应的处理对象信息,进行调用并处理,处理完毕后的结果同样基于java串行化机制进行返回。

◆ 传输协议是?

Socket。

XML-RPC

XML-RPC也是一种和RMI类似的远程调用的协议,它和RMI的不同之处在于它以标准的xml格式来定义请求的信息(请求的对象、方法、参数等),这样的好处是什么呢,就是在跨语言通讯的时候也可以使用。

来看下XML-RPC协议的一次远程通信过程:

◆ 客户端发起请求,按照XML-RPC协议将请求信息进行填充;

◆ 填充完毕后将xml转化为流,通过传输协议进行传输;

◆ 接收到在接收到流后转换为xml,按照XML-RPC协议获取请求的信息并进行处理;

◆ 处理完毕后将结果按照XML-RPC协议写入xml中并返回。

同样来回答问题:

◆ 传输的标准格式是?

标准格式的XML。

◆ 怎么样将请求转化为传输的流?

将XML转化为流。

◆ 怎么接收和处理流?

通过监听的端口获取到请求的流,转化为XML,并根据协议获取请求的信息,进行处理并将结果写入XML中返回。

◆ 传输协议是?

Http。

——————————————————————

Binary-RPC

Binary-RPC看名字就知道和XML-RPC是差不多的了,不同之处仅在于传输的标准格式由XML转为了二进制的格式。

同样来回答问题:

◆ 传输的标准格式是?

标准格式的二进制文件。

◆ 怎么样将请求转化为传输的流?

将二进制格式文件转化为流。

◆ 怎么接收和处理流?

通过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入XML中返回。

◆ 传输协议是?

Http。

SOAP

SOAP原意为Simple Object Access Protocol,是一个用于分布式环境的、轻量级的、基于XML进行信息交换的通信协议,可以认为SOAP是XML RPC的高级版,两者的原理完全相同,都是http+XML,不同的仅在于两者定义的XML规范不同,SOAP也是Webservice采用的服务调用协议标准,因此在此就不多加阐述了。

CORBA

Common Object Request Broker Architecture(公用对象请求代理[调度]程序体系结构),是一组用来定义“分布式对象系统”的标准,由OMG(Object Menagement Group)作为发起和标准制定单位。CORBA的目的是定义一套协议,符合这个协议的对象可以互相交互,不论它们是用什么样的语言写的,不论它们运行于什么样的机器和操作系统。

CORBA在我看来是个类似于SOA的体系架构,涵盖可选的远程通信协议,但其本身不能列入通信协议这里来讲,而且CORBA基本淘汰,再加上对CORBA也不怎么懂,在此就不进行阐述了。

JMS

JMS呢,是实现java领域远程通信的一种手段和方法,基于JMS实现远程通信时和RPC是不同的,虽然可以做到RPC的效果,但因为不是从协议级别定义的,因此我们不认为JMS是个RPC协议,但它确实是个远程通信协议,在其他的语言体系中也存在着类似JMS的东西,可以统一的将这类机制称为消息机制,而消息机制呢,通常是高并发、分布式领域推荐的一种通信机制,这里的主要一个问题是容错(详细见ErLang论文)。

来看JMS中的一次远程通信的过程:

◆ 客户端将请求转化为符合JMS规定的Message;

◆ 通过JMS API将Message放入JMS Queue或Topic中;

◆ 如为JMS Queue,则发送中相应的目标Queue中,如为Topic,则发送给订阅了此Topic的JMS Queue。

处理端则通过轮训JMS Queue,来获取消息,接收到消息后根据JMS协议来解析Message并处理。

回答问题:

◆ 传输的标准格式是?

JMS规定的Message。

◆ 怎么样将请求转化为传输的流?

将参数信息放入Message中即可。

◆ 怎么接收和处理流?

轮训JMS Queue来接收Message,接收到后进行处理,处理完毕后仍然是以Message的方式放入Queue中发送或Multicast。

◆ 传输协议是?

不限。

基于JMS也是常用的实现远程异步调用的方法之一。

当然,在上面的原理中并没有介绍到所有的java领域可选的远程通信协议了,例如还有EJB采用的ORMI、Spring自己定义的一个简单的Http Invoker等等。

看完原理后我们再来看看目前java领域可用于实现远程通讯的框架或library,知名的有:JBoss-Remoting、Spring- Remoting、Hessian、Burlap、XFire(Axis)、ActiveMQ、Mina、Mule、EJB3等等,来对每种做个简单的介绍和评价,其实呢,要做分布式服务框架,这些东西都是要有非常深刻的了解的,因为分布式服务框架其实是包含了解决分布式领域以及应用层面领域两方面问题的。

当然,你也可以自己根据远程网络通信原理(transport protocol+Net IO)去实现自己的通讯框架或library。

那么在了解这些远程通讯的框架或library时,会带着什么问题去学习呢?

◆ 是基于什么协议实现的?

◆ 怎么发起请求?

◆ 怎么将请求转化为符合协议的格式的?

◆ 使用什么传输协议传输?

◆ 响应端基于什么机制来接收请求?

◆ 怎么将流还原为传输格式的?

◆ 处理完毕后怎么回应?
————————————————————

JBoss-Remoting

Jboss-remoting是由jboss编写的一个java领域的远程通讯框架,基于此框架,可以很简单的实现基于多种传输协议的java对象的RPC。

直接来回答问题:

◆ 是基于什么协议实现的?

JBoss-Remoting是个通讯框架,因此它支持多种协议方式的通信,例如纯粹的socket+io方式、rmi方式、http+io方式等。

◆ 怎么发起请求?

在JBoss-Remoting中,只需将需要发起的请求参数对象传入jboss-remoting的InvocationRequest对象即可,也可根据协议基于InvocationRequest封装符合需求的InvocationRequest对象。

◆ 怎么将请求转化为符合协议的格式的?

JBoss-Remoting基于Java串行化机制或JBoss自己的串行化实现来将请求转化为对象字节流。

◆ 使用什么传输协议传输?

支持多种传输协议,例如socket、http等。

◆ 响应端基于什么机制来接收请求?

响应端只需将自己的处理对象注册到JBoss-Remoting提供的server端的Connector对象中即可。

◆ 怎么将流还原为传输格式的?

JBoss-Remoting基于java串行化机制或jboss自己的串行化实现来将请求信息还原为java对象。

◆ 处理完毕后怎么回应?

处理完毕后将结果对象直接返回即可,jboss-remoting会将此对象按照协议进行序列化,返回至调用端。

另外,jboss-remoting支持多种通信方式,例如同步/异步/单向通信等。

Spring-Remoting

Spring-remoting是Spring提供java领域的远程通讯框架,基于此框架,同样也可以很简单的将普通的spring bean以某种远程协议的方式来发布,同样也可以配置spring bean为远程调用的bean。

◆ 是基于什么协议实现的?

和JBoss-Remoting一样,作为一个远程通讯的框架,Spring通过集成多种远程通讯的library,从而实现了对多种协议的支持,例如rmi、http+io、xml-rpc、binary-rpc等。

◆ 怎么发起请求?

在Spring中,由于其对于远程调用的bean采用的是proxy实现,发起请求完全是通过服务接口调用的方式。

◆ 怎么将请求转化为符合协议的格式的?

Spring按照协议方式将请求的对象信息转化为流,例如Spring Http Invoker是基于Spring自己定义的一个协议来实现的,传输协议上采用的为http,请求信息是基于java串行化机制转化为流进行传输。

◆ 使用什么传输协议传输?

支持多种传输协议,例如rmi、http等等。

◆ 响应端基于什么机制来接收请求?

响应端遵循协议方式来接收请求,对于使用者而言,则只需通过spring的配置方式将普通的spring bean配置为响应端或者说提供服务端。

◆ 怎么将流还原为传输格式的?

按照协议方式来进行还原。

◆ 处理完毕后怎么回应?

处理完毕后直接返回即可,spring-remoting将根据协议方式来做相应的序列化。

Hessian

Hessian是由caucho提供的一个基于binary-RPC实现的远程通讯library。

◆ 是基于什么协议实现的?

基于Binary-RPC协议实现。

◆ 怎么发起请求?

需通过Hessian本身提供的API来发起请求。

◆ 怎么将请求转化为符合协议的格式的?

Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。

◆ 使用什么传输协议传输?

Hessian基于Http协议进行传输。

◆ 响应端基于什么机制来接收请求?

响应端根据Hessian提供的API来接收请求。

◆ 怎么将流还原为传输格式的?

Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。

◆ 处理完毕后怎么回应?

处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。
————————————————————

Burlap

Burlap也是有caucho提供,它和hessian的不同在于,它是基于XML-RPC协议的。

◆ 是基于什么协议实现的?

基于XML-RPC协议实现。

◆ 怎么发起请求?

根据Burlap提供的API。

◆ 怎么将请求转化为符合协议的格式的?

将请求信息转化为符合协议的XML格式,转化为流进行传输。

◆ 使用什么传输协议传输?

Http协议。

◆ 响应端基于什么机制来接收请求?

监听Http请求。

◆ 怎么将流还原为传输格式的?

根据XML-RPC协议进行还原。

◆ 处理完毕后怎么回应?

返回结果写入XML中,由Burlap返回至调用端。

XFire、Axis

XFire、Axis是Webservice的实现框架,WebService可算是一个完整的SOA架构实现标准了,因此采用XFire、Axis这些也就意味着是采用webservice方式了。

◆ 是基于什么协议实现的?

基于SOAP协议。

◆ 怎么发起请求?

获取到远端service的proxy后直接调用。

◆ 怎么将请求转化为符合协议的格式的?

将请求信息转化为遵循SOAP协议的XML格式,由框架转化为流进行传输。

◆ 使用什么传输协议传输?

Http协议。

◆ 响应端基于什么机制来接收请求?

监听Http请求。

◆ 怎么将流还原为传输格式的?

根据SOAP协议进行还原。

◆ 处理完毕后怎么回应?

返回结果写入XML中,由框架返回至调用端。

ActiveMQ

ActiveMQ是JMS的实现,基于JMS这类消息机制实现远程通讯是一种不错的选择,毕竟消息机制本身的功能使得基于它可以很容易的去实现同步/异步/单向调用等,而且消息机制从容错角度上来说也是个不错的选择,这是Erlang能够做到容错的重要基础。

◆ 是基于什么协议实现的?

基于JMS协议。

◆ 怎么发起请求?

遵循JMS API发起请求。

◆ 怎么将请求转化为符合协议的格式的?

不太清楚,猜想应该是二进制流。

◆ 使用什么传输协议传输?

支持多种传输协议,例如socket、http等等。

◆ 响应端基于什么机制来接收请求?

监听符合协议的端口。

◆ 怎么将流还原为传输格式的?

同问题3。

◆ 处理完毕后怎么回应?

遵循JMS API生成消息,并写入JMS Queue中。

基于JMS此类机制实现远程通讯的例子有Spring-Intergration、Mule、Lingo等等。
————————————————————————

Mina

Mina是Apache提供的通讯框架,在之前一直没有提到网络IO这块,之前提及的框架或library基本都是基于BIO的,而Mina是采用 NIO的,NIO在并发量增长时对比BIO而言会有明显的性能提升,而java性能的提升,与其NIO这块与OS的紧密结合是有不小的关系的。

◆ 是基于什么协议实现的?

基于纯粹的Socket+NIO。

◆ 怎么发起请求?

通过Mina提供的Client API。

◆ 怎么将请求转化为符合协议的格式的?

Mina遵循java串行化机制对请求对象进行序列化。

◆ 使用什么传输协议传输?

支持多种传输协议,例如socket、http等等。

◆ 响应端基于什么机制来接收请求?

以NIO的方式监听协议端口。

◆ 怎么将流还原为传输格式的?

遵循java串行化机制对请求对象进行反序列化。

◆ 处理完毕后怎么回应?

遵循Mina API进行返回。

MINA是NIO方式的,因此支持异步调用是毫无悬念的。

EJB

EJB最突出的在于其分布式,EJB采用的是ORMI协议,和RMI协议是差不多的,但EJB在分布式通讯的安全控制、transport pool、smart proxy等方面的突出使得其在分布式领域是不可忽视的力量。

◆ 是基于什么协议实现的?

基于ORMI协议。

◆ 怎么发起请求?

EJB调用。

◆ 怎么将请求转化为符合协议的格式的?

遵循java串行化机制对请求对象进行序列化。

◆ 使用什么传输协议传输?

Socket。

◆ 响应端基于什么机制来接收请求?

监听协议端口。

◆ 怎么将流还原为传输格式的?

遵循java串行化机制对请求对象进行反序列化。

◆ 处理完毕后怎么回应?

直接返回处理对象即可。

在之前的分布式服务框架系列的文章中对于jndi有误导的嫌疑,在这篇blog中也顺带的提下jndi的机制,由于JNDI取决于具体的实现,在这里只能是讲解下jboss的jndi的实现了。

在将对象实例绑定到jboss jnp server后,当远程端采用context.lookup()方式获取远程对象实例并开始调用时,jboss jndi的实现方法是从jnp server上获取对象实例,将其序列化回本地,然后在本地进行反序列化,之后在本地进行类调用。

通过这个机制,就可以知道了,本地其实是必须有绑定到jboss上的对象实例的class的,否则反序列化的时候肯定就失败了,而远程通讯需要做到的是在远程执行某动作,并获取到相应的结果,可见纯粹基于JNDI是无法实现远程通讯的。

但JNDI也是实现分布式服务框架一个很关键的技术点,因为可以通过它来实现透明化的远端和本地调用,就像ejb,另外它也是个很好的隐藏实际部署机制(就像datasource)等的方案。

总结

由上一系列的分析可知,在远程通讯领域中,涉及的知识点还是相当的多的,例如有:通信协议(Socket/tcp/http/udp/rmi /xml-rpc etc.)、消息机制、网络IO(BIO/NIO/AIO)、MultiThread、本地调用与远程调用的透明化方案(涉及java classloader、Dynamic Proxy、Unit Test etc.)、异步与同步调用、网络通信处理机制(自动重连、广播、异常、池处理等等)、Java Serialization (各种协议的私有序列化机制等)、各种框架的实现原理(传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等),要精通其中的哪些东西,得根据实际需求来决定了,只有在了解了原理的情况下才能很容易的做出选择,甚至可以根据需求做私有的远程通讯协议,对于从事分布式服务平台或开发较大型的分布式应用的人而言,我觉得至少上面提及的知识点是需要比较了解的。
分享到:
评论

相关推荐

    基于Java的远程方法调用及其应用

    ### 基于Java的远程方法调用及其应用 #### 一、远程方法调用(RMI)概述 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一个强大工具,允许一个Java虚拟机(JVM)上的对象调用另一个JVM上的...

    io流写的远程通讯

    本文将深入探讨如何利用Java的IO流技术实现高效的远程通讯功能。 一、Java IO流概述 Java的IO流系统分为两大类:字节流和字符流。字节流处理的是8位的字节,而字符流处理的是16位的Unicode字符。它们又细分为输入流...

    用JAVA实现远程图片批量下载

    实现远程图片批量下载的核心在于理解HTML文档的结构,并利用Java提供的多线程机制、网络通讯库以及HTML解析器。具体步骤如下: 1. **HTML文档分析**:利用HTML文档之间的链接关系,从网站的一个页面开始,递归地...

    java远程调用kettle说明与代码.pdf

    Java远程调用Kettle是一种利用Kettle的分布式执行能力的...总结来说,Java远程调用Kettle主要是利用Carte组件构建一个分布式ETL执行环境,通过Java代码可以便捷地控制远程Kettle任务,实现灵活的ETL流程管理和调度。

    JAVAECLIPSE下配置WINDCHILL远程调试WINDCHILL学习笔记.pdf

    ### JAVAECLIPSE 下配置 WINDCHILL 远程调试详解 #### 一、配置概述 本文档旨在详细介绍如何在 JavaEclipse 环境下配置 Windchill 进行远程调试的过程。远程调试是指在一个主机上调试运行在另一台机器上的应用程序...

    java与plc通讯示例代码

    总结来说,这个Java与PLC通讯示例展示了如何使用Modbus4J库通过Modbus TCP协议与PLC进行数据交换,实现了读取和写入PLC寄存器的功能。对于实际的工业应用,你需要根据具体的PLC型号和通信需求进行相应的配置和调整。

    JAVA SOCKET通讯程序

    ### JAVA SOCKET通讯程序知识点 #### 一、Java Socket编程简介 在Java中,Socket编程是一种常用的网络通信方式,它允许程序之间通过TCP/IP协议进行数据交换。Java中的`java.net.Socket`类和`java.net.ServerSocket...

    java进程间通讯笔记

    RMI是Java的一种远程方法调用技术,允许一个Java对象调用位于远程服务器上的对象的方法。`java.rmi`包提供了RMI的实现,包括`java.rmi.server.UnicastRemoteObject`和`java.rmi.registry.Registry`等类。 下面是...

    Java与Flax通讯

    总结起来,Java与Flax通讯的关键在于使用BlazeDS作为中间件,它提供了远程控制和消息传递的能力,使得Java后端和Flex前端可以无缝协作。通过以上步骤,你可以成功地建立一个简单的Java-Flex应用程序,实现数据的双向...

    基于Java的SNMP 报文 通讯原理 实现

    总结来说,基于Java的SNMP报文通讯实现需要对SNMP协议的基本原理有深入的理解,掌握MIB的使用和网络编程技术,熟悉安全机制,并利用Java提供的类库和API来构建可靠的网络管理应用。通过上述步骤,开发者可以利用Java...

    modbus的读写java实现

    - 可以利用Modbus协议来远程控制工厂中的设备,例如调节电机速度或设置温度等。 2. **数据采集**: - 通过读取Modbus寄存器中的数据,可以实时监控设备状态和运行参数。 3. **故障诊断**: - 当设备出现异常时...

    plc.zip_java PLC_java和Plc通讯_plc 短信_串口 工具 java_短信猫 java

    总结起来,这个"plc.zip_java"压缩包提供了一套基于Java的解决方案,用于实现与PLC的串口通讯,并且可能支持通过短信猫进行远程监控。这在现代工业自动化环境中具有广泛的应用价值,可以帮助开发者构建灵活、可靠的...

    modbus rtu通讯

    总结一下,Modbus RTU通信是工业控制领域常用的一种协议,而"ModbusRtuConnect"可能是用于Android平台的Java源代码,帮助开发者实现与Modbus RTU设备的串行通信。学习和理解这部分代码,将有助于开发Android应用来...

    mina2 实例程序(socket通讯调用远程方法)

    总结,Apache Mina2提供了一套强大的工具,使得开发人员能够轻松构建高性能的网络应用,包括实现远程方法调用。通过理解Mina2的基本原理和使用方法,我们可以构建出稳定、高效且易于维护的分布式系统。提供的"mina2-...

    Java蓝牙无线通讯技术API

    ### Java蓝牙无线通讯技术API详解 #### 一、引言 随着移动互联网的快速发展,蓝牙技术作为一种低成本、短距离的无线通信技术,在个人局域网(PANs)的应用场景中变得越来越普及。通过蓝牙技术,可以实现蜂窝式电话...

    基于java开发环境的WebRTC 点对点视频通话系统

    总结来说,这个基于Java开发环境的WebRTC点对点视频通话系统是一个综合性的项目,涵盖了Java与WebRTC的集成、信令处理、媒体流管理等多个技术层面。开发者需要具备扎实的Java基础、良好的网络通信知识,以及对WebRTC...

    flex+java前后台通讯

    首先,我们将从创建Java项目开始,然后讨论Flex中的关键配置,包括设置远程服务对象、通道设置和事件监听,最后分析通信过程中的异常处理。 一、创建JAVA项目 在进行Flex与Java的通信前,我们需要建立一个基础的...

    Java rmi远程方法调用基本用法解析

    Java RMI 远程方法调用基本用法解析 Java RMI(Remote Method Invocation,远程方法调用)是一种Java语言中用于实现远程方法调用的技术。它允许在不同的Java虚拟机中运行的对象之间进行通信和交互。下面将对Java ...

Global site tag (gtag.js) - Google Analytics