十四、 ActiveMQ
ActiveMQ是JMS的实现,基于JMS这类消息机制实现远程通讯是一种不错的选择,毕竟消息机制本身的功能使得基于它可以很容易的去实现同步/异步/单向调用等,而且消息机制从容错角度上来说也是个不错的选择,这是Erlang能够做到容错的重要基础。
◆ 是基于什么协议实现的?
基于JMS协议。
◆ 怎么发起请求?
遵循JMS API发起请求。
◆ 怎么将请求转化为符合协议的格式的?
不太清楚,猜想应该是二进制流。
◆ 使用什么传输协议传输?
支持多种传输协议,例如socket、http等等。
◆ 响应端基于什么机制来接收请求?
监听符合协议的端口。
◆ 怎么将流还原为传输格式的?
同问题3。
◆ 处理完毕后怎么回应?
遵循JMS API生成消息,并写入JMS Queue中。
基于JMS此类机制实现远程通讯的例子有Spring-Intergration、Mule、Lingo等等。
十五、 MinaMina是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方式的,因此支持异步调用是毫无悬念的。
十六、 EJBEJB最突出的在于其分布式,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、DynamicProxy、Unit Test etc.)、异步与同步调用、网络通信处理机制(自动重连、广播、异常、池处理等等)、JavaSerialization (各种协议的私有序列化机制等)、各种框架的实现原理(传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等),要精通其中的哪些东西,得根据实际需求来决定了,只有在了解了原理的情况下才能很容易的做出选择,甚至可以根据需求做私有的远程通讯协议,对于从事分布式服务平台或开发较大型的分布式应用的人而言,我觉得至少上面提及的知识点是需要比较了解的。