J2EE分布式方案的选择

J2EE的流行原因之一就是其分布式特性。在J2EE中,有以下分布式方案:

  1. RMI

  2. EJB

  3. Web Service

  4. Restful

  5. JMS

  6. JMX

  7. 借助HTTP或者TCP自己设计

如此多的方案。当设计一个网站时,应该使用哪种分布式方案呢?下面就一个一个的比较下每个远程调用的特性。

RMI

RMI为远程方法调用,它类似于远程调用协议,规定了java远程接口调用的实现方式。在网站开发中,一般不会直接开发RMI,因为它太基础,就像J2EE中的java语言一样,java可以实现很多功能,但脱离了框架和J2EE,用java实现一个网站是非常的困难。在RMI之上,是EJB和JMX两个易于RMI而生的标准。

EJB

J2EE平台独有的分布式框架。其底层是RMI。EJB中的Session Bean属于同步式远程调用。而Message Bean则和JMS相结合,属于异步式远程调用。EJB要求调用端和被调用端的耦合度比较高,调用端必须部署被调用端的EJB接口。所以,EJB适合大型网站内部J2EE系统之间的同步远程调用。

JMS

跟EJB相比,JMS提供了松耦合,异步式远程调用。且JMS可以被其它语言平台所使用。适合大型网站内部的各种平台之间的异步远程调用。

Web Service

Web Service的最大特点就是跨平台,松耦合。对于第三方而言,只需要下载其WSDL文件,便可以通过各种工具,生成Web Service client。Web Service以SOAP协议组织消息体,其复杂度不适合前端使用。所以Web Service适合网站外部第三方client调用。

Restful

Restful是通过Http传输XML, plain text或者JSON,其内容结构简单,易于分析。适合Web前端调用。而第三方,也可以使用跨域技术,通过前端调用Restful,从而进行集成。

JMX

JMX其实不属于分布式的选择范围,但它也具有远程调用的能力。但由于其重点在远程管理,而不在远程调用,所以它在性能,扩展,伸缩,安全等各方面,并不适合远程调用。所以大家还是使用JMX做远程管理。

自定义

对于一个严重依赖远程调用实时性的系统而言,以上方案对系统而言,还是觉得太慢。为了缩减传输数据大小,简化远程调用的开销,可以自定义开发一套远程调用程序,远程传输可以使用优化过的二进制流,通过TCP传输。这常见于游戏开发。

应用场景

下面通过一张图,来展示每种分布式方案应用的地方。当然,此方案并不是绝对。

J2EE分布式方案的选择

接下来,在几个维度来区分各种分布式

跨平台

Web Service, JMS为跨平台,EJB专属Java平台,JMX专属Java管理,而Restful大部分用于HTTP AJAX等网页内容发布平台。

同步异步

EJB(指sessionbean),Web Service,Restful均属同步调用。但它们可以通过另起线程,伪装成异步。例如AJAX。但传输过程还是同步。

JMS则属于异步调用。

耦合度

JMS<Restful<Web Service<EJB

性能

Restful最轻便,简单。只需要HTTP传输JSON或XML,然后又JS解析。

Web Service相比Resftul要复杂,SOAP消息的封装和解析,以及XML和java之间的转化,都消耗性能。

EJB中无状态的session bean性能比有状态的session bean性能要高很多。避免使用stateful。

JMS由于其异步特点,可以规避洪峰,性能平稳。

安全

HTTP以明文形式传输,安全最弱。尽管它可以使用SSL对传输加密,但当消息被解密以后,将再无安全保证。所以无法做消息中转处理。

Web Service有丰富的安全实现标准,可以对SOAP消息内容进行加密。

EJB和JMS如果作为系统内部使用,本身就不用太考虑安全问题。防火墙帮忙屏蔽外部的访问。




转载于:https://my.oschina.net/xpbug/blog/265723