- 浏览: 85749 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
honghu:
朋友能把你的demo分享下吗?谢谢,honghu616@gma ...
最近做的Web流程设计器雏形,支持BPMN2.0 -
dyllove98:
Here is a workaround. It uses i ...
MappedByteBuffer 之文件删除问题 -
hahalzb:
thank you
JPA 概述及下载 -
geek87:
我的安装成功了。。呵呵
尝试使用Visual Editor 1.4 -
geek87:
谢谢了,我在试试安装
尝试使用Visual Editor 1.4
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、 MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯的技术和原理的介绍。
基本原理
要实现网络 机器间的通讯,首先得来看看计算机系统网络通信 的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络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基本都是基于IO的,而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 (各种协议的私有序列化机制等)、各种框架的实现原理(传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等),要精通其中的哪些东西,得根据实际需求来决定了,只有在了解了原理的情况下才能很容易的做出选择,甚至可以根据需求做私有的远程通讯协议,对于从事分布式服务平台或开发较大型的分布式应用的人而言,我觉得至少上面提及的知识点是需要比较了解的
基本原理
要实现网络 机器间的通讯,首先得来看看计算机系统网络通信 的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络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基本都是基于IO的,而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并发的四种风味
2015-08-07 09:21 522刚看到这篇文章,讨论了Java应用中并行处理的多种方法,其中 ... -
使用Ant构建Maven3项目【更新】
2013-04-03 00:40 1491之前的转的帖子经过验证发现还是有点问题的,所以打算重写一遍 ... -
婚礼用--宾客席位搜索器
2013-01-04 13:21 1021前阵子事情多,又要准备结婚,所以博客好久没更新了。 2 ... -
Java 过滤文件的BOM头
2012-09-06 15:22 1386最近项目碰到一个小问题,配置文件如果用记事本改过,会因为解析错 ... -
nexus 初试笔记
2012-06-27 22:01 1258今天花了点时间研究了下Nexus,做个小笔记。 1.别 ... -
Java 阻塞队列
2012-06-21 14:13 1225项目中需要用到多线程处理,线程的任务最好是动态的负载均衡,自然 ... -
Vaadin 学习笔记
2012-03-22 22:50 0话说最近一个小项目,我实在是难以忍受不给力的美工MM,也受够了 ... -
开始试试Vaadin
2012-03-16 22:57 1380最近发现了一个比较有意思的Web Ria框架:Vaadin。官 ... -
Nutz中支持SLF4J
2011-11-15 14:08 2442Nutz是个不错的轻量级框架,小巧易用,不了解到同学可以 ... -
抛弃log4j改用logback
2011-11-04 14:09 8161公司的新平台最近日志总出问题: - 满容量后不自动备份,并且 ... -
JAVA 7 新特性
2011-08-02 17:25 1772Java 7 正式版已经发布,来看看新特性。(转载自OSC ... -
[转] DbUnit 入门
2011-05-19 10:35 933什么是dbunit以及为什 ... -
log4j 日志文件的相对路径
2011-03-31 20:36 1133日志文件生成在工程目录下经常可以省去很多麻烦。 网上参 ... -
Quartz 时间表达式
2011-03-15 17:55 1347最近用了下大名鼎鼎的quartz,基本能满足调度需求的变化了。 ... -
使用JXL(JExcelAPI)操作Excel
2011-02-28 15:27 1339原文链接:http://www.cnblogs.com/ray ... -
equinox web开发依赖包(jetty)
2010-11-06 19:07 1536今天尝试了下基于equinox的web开发,需要加入如下依赖包 ... -
Java游戏开发中应始终坚持的10项基本原则
2010-08-07 09:24 1266关于文章中涉及的两个杜撰概念:一、绘图器:众所周知,Ja ... -
Java游戏开发中怎样才能获得更快的FPS
2010-08-07 09:12 55众所周知,Java应用的 ... -
JPA 2.0 新特性
2010-06-28 15:04 981http://en.wikibooks.org/wiki/Ja ... -
获取bundle的绝对路径
2010-06-22 13:13 2145最近碰到个小麻烦,如何从bundle获取其绝对路径。 ...
相关推荐
8. 常用的Java远程通信框架和库: - JBoss-Remoting:一个轻量级的远程通信框架。 - Spring Remoting:Spring框架提供的远程方法调用支持。 - ActiveMQ:一个开源的消息代理和面向消息的中间件。 - Mule ESB:一...
在IT领域,远程控制技术是一种允许用户通过网络访问并操控另一台计算机的系统或应用程序的能力。Java作为一种跨平台的编程语言,提供了丰富的API和库,使得开发者能够实现远程控制功能,包括屏幕共享和双向通信。...
Java远程调用工具是开发过程中不可或缺的利器,尤其在处理分布式系统和服务之间的交互时。本文将深入探讨如何利用Java技术进行远程调用,特别是针对WebService和RESTful接口的调用,以及一个常用的工具——SoapUI。 ...
标题 "Java读取远程主机文件" 涉及的核心知识点主要集中在Java远程操作技术,特别是使用SSH(Secure Shell)协议来实现对远程主机的文件访问。在这个场景中,开发人员可能需要从远程服务器上下载文件或者实时读取...
对于初学者或希望转行到Java开发的人来说,了解并掌握以下关键技术和概念是至关重要的。 1. **Java基础**:首先,你需要理解Java的基础语法、变量、数据类型、流程控制语句、类和对象、封装、继承、多态等核心概念...
总的来说,Java远程调用Shell脚本客户端包简化了开发人员在Java应用程序中集成远程系统管理操作的过程,提高了开发效率并保证了安全性。通过理解和运用上述技术,开发者能够更好地利用这个工具包实现各种复杂的远程...
Java中的远程桌面协助主要是通过网络通信技术来实现的,它可以让一个应用程序获取并控制另一个应用程序的界面。在Java中,最常用的网络通信协议是TCP/IP,基于Socket进行数据传输。 二、Socket通信 Socket是Java...
Java远程数据传输程序是利用Java编程语言实现的一种技术,它使得在不同的网络环境中,数据能够安全、高效地进行传输。这种技术广泛应用于分布式系统、云计算、大数据处理等多个领域,为跨平台的数据交互提供了便利。...
标题中的“Flex与Java交互 远程调用方式”指的是在Adobe Flex应用程序中与Java后端进行通信的技术。Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA),而Java是后端开发的常用语言。两者之间...
本资源包"java远程进行telnet,ftp,ssh连接的方法及源代码.rar"就是针对这些功能的一个详细教程,包含说明文档和源代码示例。 首先,让我们来深入了解一下telnet。Telnet是一种协议,允许用户通过网络远程登录到另一...
RPC(Remote Procedure Call)是一种远程调用技术,允许不同的应用程序之间进行通信和数据交换。Java RPC技术可以应用于Web应用服务器集群系统中,以提高系统的可靠性、稳定性和性能。 在Web应用服务器集群系统中,...
Java 类库为开发者提供了丰富的工具集,涵盖了从基础的数据类型处理到高级的网络通信等多个方面。本文档旨在介绍 Java 中一些常用的类库,帮助初学者更好地理解和使用这些类库。尽管文档内容并不全面,但包含了...
Java Swing 远程桌面程序是一种基于Java编程语言的桌面应用程序,它允许用户通过网络连接远程控制另一台计算机的桌面环境。在这个项目中,开发者利用了开源库jrdesktop来实现远程桌面的功能。Java Swing是Java标准版...
在现代工业自动化领域,Java程序与PLC(可编程逻辑控制器)之间的通信是实现设备控制、数据采集和系统集成的关键技术。本资料包提供了一种详细的说明,旨在帮助你理解和实施这种通信方式。 首先,我们要了解Java...
Java蓝牙无线通讯技术API是Java平台提供的一种用于设备间无线通信的接口,它允许开发者创建能够与支持蓝牙协议的设备进行交互的应用程序。在Java中,蓝牙通信主要通过Java Communications API(JavaComm)或者Java ...
本地监听和远程端口扫描是网络编程中的两个重要概念,对于理解网络通信和安全至关重要。 首先,本地监听通常指的是一个进程(在本例中是Java程序)设置一个套接字(Socket)来监听特定的网络端口。当其他网络进程...
以上就是Java远程视频会议系统的主要知识点,涵盖Web开发、框架使用、音视频处理、并发编程等多个方面,对于学习和理解Java Web应用程序的开发具有很高的参考价值。通过深入研究这个项目,开发者不仅可以提升Java...
此外,远程方法调用(RMI)也是Java远程通信的一种技术,它允许Java对象之间相互调用方法,即便是这些对象分布在不同的虚拟机上。 远程监控系统的另一个核心部分是数据采集和处理。数据采集通常依赖于各种传感器和...
3. **远程端口扫描**:端口扫描是网络安全评估中常用的技术,用于检测远程主机上哪些端口是开放的,从而推断其可能的服务和漏洞。Java中可以使用Socket或DatagramSocket类实现TCP或UDP端口扫描。 4. **源代码分析**...
远程端口扫描则是网络安全领域的一个常用技术,主要用于检测远程主机上哪些端口是开放的,这可以帮助我们识别可能的服务暴露和潜在的安全风险。在Java中,可以使用`java.net.Socket`类尝试连接到远程主机的特定端口...