Java远程通讯可选技术及原理【学学学】

当然,在上面的原理中并没有介绍到所有的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 (各种协议的私有序列化机制等)、各种框架的实现原理(传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等),要精通其中的哪些东西,得根据实际需求来决定了,只有在了解了原理的情况下才能很容易的做出选择,甚至可以根据需求做私有的远程通讯协议,对于从事分布式服务平台或开发较大型的分布式应用的人而言,我觉得至少上面提及的知识点是需要比较了解的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章