UML软件工程组织 |
J2EE与.NET在Web Services上的对抗 |
作者:柴晓路 本文选自:开放系统世界——赛迪网 2002年12月19日 |
本文就Web
Services领域的两个主要的应用框架:J2EE和.NET进行针对性的比较。主要从对Web
Services技术的支持、第三方厂商的支持、对Web Services规范的控制程度,以及它们的市场等方面展开讨论。J2EE和.NET是正面竞争的两个强大的平台,然而在Web
Services的技术支持下,同时它们也是能够互相融合和集成的应用部署环境,在文章的最后部分,通过一个应用实例简析了整合的方式。 Microsoft .NET与Sun J2EE是目前企业Web Services平台市场上两个最重要的应用框架(Application Framework)。它们都在针对分布式N-Tier应用的设计、集成、性能、安全性和可靠性等诸多方面,为用户提供了总体的指南和规范。基于这些指南和规范,技术提供商提供了相应的平台、工具和编程环境。在具体的应用框架中,包括了针对应用的表现层服务、服务器端进程、会话管理、商业逻辑框架、应用数据缓存、应用逻辑、持久化性、事务、安全和日志服务等内容。 技术提供商能够在应用框架的顶部构建应用程序的开发工具和应用服务器。应用框架的目标是提供一个统一的软件框架,以减少对企业软件产品的支持、维护和集成的代价。 Microsoft .NET是一个由Server、Client和Service组成的平台。.NET框架包括基本的运行库、用户接口库、CLR、C#、C++、VB.NET、Jscript.NET、ASP.NET,以及.NET框架API的各个方面。它由以下三个部分组成: ◆ .NET平台,包括构建.NET服务和.NET设备软件的工具和基础框架; ◆ .NET产品和服务,包括基于Microsoft .NET的企业服务器,如BizTalk Server 2002 和SQL Server 2000, 它们对.NET框架提供支持; ◆ 第三方软件开发商提供的.NET服务,构建在.NET平台上的第三方服务。 J2EE(Java企业版)是一组规范集,每一个规范规定了Java技术应当如何提供一种类型的功能。J2EE平台为基于多层分布式应用模型上的Java应用设计、开发、装配和部署提供了一个完整框架。J2EE规范为开发应用和企业系统集成定义了数目众多的应用编程接口(API)和多种应用编程模型。最新的J2EE规范包括EJB 2.0、J2EE Connector Architecture1.0、JDBC 2.0、JSP 1.2、Servlet 2.3、JTA 1.0.1、JMS 1.0.2、JNDI 1.2、Java RMI 1.0、RMI/IIOP 1.0、JAAS 1.0、JavaMail 1.1、JAXP 1.1等。 作为彼此竞争的应用平台,J2EE和.NET开发平台在目标和体系结构上极其相似,但在实现上又完全不同。平台的体系架构是支撑平台的基础,平台各方面的性能也会因平台架构实现的不同而有差异。对两个平台产生至关重要影响的三个方面是:系统平台基础构造、三层/多层体系结构和移植/性能/扩展。 类似的平台基础构造 一个平台往往会在语言编译、代码执行、编程支持等基础构造方面,对平台的可用性、生产性、移植性等因素产生重要的影响,这也是评判一个平台是否适合特定应用的重要依据。J2EE和.NET两个平台底层的执行引擎都源于虚拟机,但.NET的CLR(Common Language Runtime)在Java虚拟机(JVM)的基础上发展得更远。CLR在借鉴了JVM的自动垃圾收集、异常处理等机制的同时,又为.NET平台添加了多语言支持、组件自描述等新的特性。 在.NET和J2EE平台上,程序的编译都经过两个类似的过程。首先指定高级语言编译器将C#(或其它.NET语言)或Java源代码翻译成中间语言(IL)和字节代码(ByteCode)。.NET在中间语言设计时,通盘考虑了多个主流高级语言,在这一层面实现了.NET平台的跨语言承诺。J2EE的基石则是Java语言,它最典型的特征是一次编写,多平台运行。 其次,在执行时,中间语言被即时编译器(JIT)编译成特定平台的二进制代码,字节代码通过虚拟机解释执行,完成各自语言的指令功能。鉴于Microsoft在代码上的优化功底(专注于自己的平台),.NET代码的执行速度较之Java有明显的优势是不争的事实。但在Unix/Linux平台上,由于.NET尚未能实现其跨平台的承诺,J2EE几乎成了惟一的选择,执行效率的比较也就没有多大意义。在代码执行的同时,CLR和JVM也都提出了异常捕捉、类型安全、内存分配、垃圾收集等自动化内存管理工作,大大减轻了内存泄漏问题和程序员繁重的负担。 相同的三层/多层体系 基于三层/多层分布式计算结构已毋庸置疑地成为当今企业应用的主流模式,也是两个平台较量的着力点。 在客户端,表示层负责用户与系统的交互。对于不同的处理要求,.NET和J2EE都提出了基于桌面的应用程序和基于浏览器的Web应用的开发组件:Java Application与Windows Form、Java Servlet/JSP与ASP.NET。它们双双形成犄角之势。Windows Form依赖Microsoft桌面系统的天然优势,不管在交互速度还是在界面的表现性能上,都较Java Application稍胜一筹。Servlet/JSP与ASP.NET是目前企业在“瘦客户端”应用的重点,两者都基于HTTP请求/响应模型,通过HTML浏览器页面完成用户交互。虽然ASP.NET声称,在底层通过编译执行获得了相当高的处理速度,以及服务器方控件的浏览器自适应能力,但目前并没有这方面的硬性数据,很难据此而论高下。在缓存、状态优化等方面两者可谓旗鼓相当。另一个和客户端应用相关的技术是ActiveX与Applet,但从目前的趋势来看,它们在两个平台上的地位逐渐边缘化,也不为大多数企业所接受。 在中间层,分布式业务组件负责企业应用的商业逻辑部署。由于这些业务组件经常负责处理数据库连接、网络资源、线程等高昂的资源,所以一直是三层/多层架构的关键和企业应用的核心。J2EE的EJB是一个成熟的、得到业界广泛支持的大型企业级组件框架,而.NET组件则是建立在新型的Remoting和COM+服务之上的,两者在组件与操作系统的交互、客户端资源共享等方面都有很好的支持。EJB的核心是容器,容器是一个为组件提供服务的运行环境,负责为组件提供诸如事务处理、持久性、安全性、组建状态自动化管理等服务。它分离了商业逻辑和系统底层逻辑,从而使得开发人员的工作大为简化。.NET通过元数据支持自描述性的组件开发、XCOPY部署以及多版本共存,而无需注册表和描述文件,对企业客户有一定的吸引力。 在后端数据层,两个平台都为数据库连接量身定做了一套数据存取模型:J2EE的JDBC和.NET的ADO.NET。它们在支持传统SQL数据源的同时,也都支持新型的XML数据源。这方面由于更多地涉及到具体的数据库产品,很难说清哪种数据模型更有优势。 不同的移植、性能和扩展 在移植性方面,.NET通过CLR消除编程语言的差别,而J2EE则通过JVM来消除平台差别。跨平台是J2EE的一大卖点,也是在选择企业应用开发平台时的一个重要参考因素,几乎所有的主流操作系统都提供了对J2EE的支持。实际上如果要搭建跨Unix、Windows等多个操作系统平台,J2EE平台几乎是惟一的选择。J2EE更关注跨平台而不是跨语言。Microsoft认为,如果企业的应用都能通过标准协议以Web Services的方式发布,那么平台都是中立的。跨平台甚至是Microsoft所不想的。为了吸引更多的开发者和鼓励广大企业厂商转到.NET平台,Microsoft提出了多语言支持,希望用跨语言的交互性平衡跨平台的互操作。 性能是J2EE和.NET喋喋不休的话题。二者之间著名的论战是一个关于宠物店的范例应用。宠物店是Sun一直以来作为J2EE典型应用的展示范例。.NET在自己的平台上同样实现了该宠物店应用,且声称代码行是J2EE的1/3,效率却是J2EE的30倍。而Sun认为,这个范例根本不适合用来做性能比较,该范例实现也没有做针对性能的优化,并指责Microsoft通过后端数据库优化(诸如使用Store Procedure)等方法虚抬了.NET平台的效率。 在平台的成熟度方面,两者也有一拼。J2EE在1999年形成了其成熟的架构,并且到今天已经有相当成熟的、经过检验的企业应用系统。而.NET究其渊源是源自微软以前开发企业应用程序的平台DNA(Distributed Network Architecture),其中包括了许多已经被证实的技术,并且这些技术已经在产品中得到实现,包括Microsoft的事务服务器、COM+、消息队列、SQL Server数据库等。对于扩展性,广为业界接受的事实是.NET平台的扩展思想是基于软件的横向扩展,而J2EE平台的扩展思想则是基于硬件的纵向扩展。这也符合Microsoft和Sun各自的产品利益。 J2EE另一个重要特征就是它的架构开放性。它本身是一系列规范,而不是产品,任何符合这一规范的产品都是与J2EE兼容的。这使得J2EE从制定之初就得到了广泛的支持。BEA、IBM、Oracle等都相继开发了符合J2EE的应用服务器,它们的产品相互之间甚至可以兼容。而.NET在设计之初就紧紧地把平台规范与产品胶合在一起。不过随着.NET架构中的C#、CLI 等逐渐标准化,.NET也正在向J2EE的模式靠拢。 Web Services支持的比较
由于Web Services的各种技术都是先以规范的形式制定,然后再交付各大开发商进行实施的,所以如果某个开发商从一开始就参与某一种Web Services规范的开发,那么它的平台就能够以最快的速度支持这一种Web Services规范。在这一点上,Microsoft给人以非常积极进取的印象。在Web Services领域,Microsoft与IBM共同主推了大量的Web Services规范,在一段时间内,它们两家公司的Web Services技术的市场推广活动都是联合举行的,不难看出这两家公司在这个领域背后的战略合作。从最初的Web Services核心技术SOAP、WSDL主要由这两家制定,到后来的UDDI由这两家为首的多家核心企业共同制订,以及后来的一些不是很核心的Web Services规范,如WS-Inspecation、WSFL、WS-Security、WS-Routing、WS-License、WS-Referral完全由这两家来制定。我们不难看出,Microsoft和IBM对于Web Services的贡献,以及他们对Web Services规范的控制。 Sun自从在XML规范的制定中发挥了重要的作用之后,在其后的Internet规范,尤其是Web Services规范的制定中,声音变得非常地微弱,而且目前似乎并没有改善的趋势。最近,Web Services领域中的一件大事是WS-I.org的成立。WS-I.org是致力于为保证Web Services所承诺的互操作性而成立的一个组织,其主要的工作就是开发保障Web Services互操作性的相关规范,并进行规范实施的测试。WS-I.org的核心成员包括Accenture、Bea、HP、Intel、IBM、Microsoft、Oracle、SAP等,Sun不在其中。这是Sun发展战略的问题,还是其它原因我们不得而知。不过我们可以知道的是,Sun再一次在Web Services领域中落后了,从它控制的J2EE规范的状况就可以看出。 从技术的发展来看,大型的用户或是有着成功实施经验的用户,并不会因为新技术的推出,而盲目地否定旧技术,他们总是在保护投资的前提下,在不推翻现有架构的前提下有选择地挑选适合的技术。 J2EE已经是一个成熟的、成功的企业级应用解决方案,拥有大量的客户。那些已经实施了J2EE的企业不太可能在Web Services的时代中全面否定J2EE而去接收.NET,因为.NET毕竟是一个全新的架构。在.NET的开发语言中,包含了诸如VB、C++等传统开发语言,刚刚接触.NET的开发人员会以为能将以前使用VB开发的代码平滑地转移到.NET平台上来,其实不然。VB.NET的语法与VB 6.0已经有了根本性的差别,与其说VB.NET是VB 6.0的升级,不如说VB.NET是C#的Basic版。由于采用了CLI的结构,VB.NET将很难兼容以前的VB 6.0的代码,大量的VB代码无法顺利升级到.NET上来。虽然在原代码上的升级变得不是那么容易,然而开发人员仍然可以在.NET平台下将原有的COM组件进行重新包装,形成.NET平台下的Web Services组件。 虽然在继承原有技术上,.NET做得不是非常优秀,不过它的整个平台、开发工具的高集成性和友好的开发环境将给开发人员留下深刻印象。在Java领域中,无论是Borland的JBuilder 6,还是Sun的Forte for Java,或是IBM的WebShpere Application Developer及Visualage for Java都无法达到.NET的生产效率。开发工具是.NET的一大优势,同时.NET平台对Web Services规范的支持力度也仅有IBM的Java平台能够与之比拟。 因此,在企业级应用场合,如果已经采用了J2EE架构的,在Web Services的时代会继续使用J2EE架构。而原先就是采用Microsoft架构的,从技术的延续性考虑,大多数会选用Microsoft的.NET。那些采用其它技术的企业级应用,则会视开发效率、安全性、可靠性、维护代价都不同指标对两种架构进行考察。应该说机会是均等的,因为J2EE强在有大量的应用实例,而.NET强在整合集成的优秀开发部署环境。 在中小级别的应用领域,J2EE的占有率优势不再那么明显,因为一贯以来Microsoft特长于这个领域。但是Java解决方案已经是深入人心,即使是中小企业也会考虑J2EE架构,所以在这个领域,两者依然平分秋色。 在桌面应用(Web Service客户端)领域,除了一些管理客户端会采用Java开发以外,绝大多数的应用会在.NET平台上开发和部署。 虽然,J2EE和.NET在吸引用户的方面是在对抗,然而Web Services技术的精髓就是集成整合,即将不同平台框架上的应用整合在一起,形成一个更大的应用服务。因此,J2EE和.NET完全可以利用彼此的优势,在一个统一的Web Services层次上,进行广泛地应用协作和整合。 下面使用一个应用实例演示J2EE平台与.NET平台的整合,图1是一个认证考试申请应用的例子(这个案例纯属虚构),这里仅作为实例引用,也算是案例预览。 图1所示,Web Services认证机构WSTA开始向公众提供Web Services技术认证服务,一开始这个服务仅在机构内部工作,工作人员通过收取报名表格在桌面应用中为客户完成注册、上课和考试等申请,但这样整个机构的运行效率不高。随着学员的不断增多,WSTA不得不使用Web Services技术来改造应用。首先完成认证考试各项申请的逻辑被包装成EJB Web Service,然后部署在机构内部的Weblogic Application Server上。桌面应用也被升级以支持Web Services调用。为了使得这个认证申请Web Services能够被更多的人通过各种平台使用,这个Web Services被注册进了Public UDDI Registry,并发布了它的WSDL描述文档。同时,WSTA也积极与公共教育平台进行接触,并尝试合作可能。经过一番接触,国家教育信息门户(National Educastion Information Portal)同意与WSTA进行系统对接,以实现在NEIP平台上直接对WSTA提供的Web Services技术认证提供申请服务。NEIP采用的是Microsoft .NET的平台,因此在这里实施了J2EE和.NET平台的连接集成。由于将自身注册入了Public UDDI Registry,WSTA的认证考试申请服务有机会被更多的外部平台集成使用。图1中的Global IT Education Web Service就是一例。 下面,按照图1中序号标明的顺序,逐一讲解这个Web Services集成是如何实施和运作的: 1. 用户可以通过NEIP的界面申请Web Services技术认证的注册、课程和考试; 2. NEIP的Web站点把请求通过Internet发送给WSTA的认证管理Web Services; 3. WSTA的认证管理Web Services通过与机构数据的交互,完成申请事务,并响应NEIP的Web站点,并最终将响应返回终端用户; 4. WSTA认证服务的技术信息被注册入了Public UDDI Registry供公共查询; 5. Global IT Education的在线服务通过搜索Public UDDI Registry,寻找到了WSTA认证申请服务; 6. Global IT Education获得WSTA认证申请服务的技术信息,实现动态绑定; 7. Global IT Education建立与WSTA认证申请服务,此后,任何使用Global IT Education的应用(包括各种应用、Web站点、Web Services)都可以通过Global IT Education的Web Services使用WSTA认证申请服务; 8. WSTA内部的桌面应用同样是使用Web Services界面绑定技术来调用WSTA认证申请服务的。 最后一点,我们再来谈谈J2EE和.NET这两个Web Services平台的目前需要解决的问题。我们知道,要使Web Services真正获得成功,还会遇到许多技术挑战,其中有许多与它们赖以生存的开放不利的环境有关。以下是一些最显著的问题: ◆ 可靠性,某些Web Services主机可能比其它主机更可靠。那么如何测量和传递这个可靠性呢? 当Web Services主机暂时脱机时会发生什么情况? 是寻求和使用其它供应商拥有的替代服务,还是等待原来的那个重新可用呢? 怎么知道哪些供应商可以信赖? ◆ 安全性,某些Web Services将在公开情况下可用而没有保护措施,但大多数与商业相关的服务将使用带认证的加密通信。SSL上的HTTP往往能够提供基本的安全性,但有个别服务需要更高颗粒度级别。Web Services如何认证用户?服务需要在方法级别上提供安全性的能力吗?如果与在世界范围内提供服务的供应商签约,这些服务如何了解你的安全性特权呢? ◆ 事务,传统的事务处理系统使用两阶段提交方式,所有参与的资源都被集中起来,并在整个事务发生之前锁定,等到事务发生后,资源被最后释放。这种方式在事务生存时间很短的封闭环境中很有效,但在事务可能跨越几小时,甚至几天的开放环境中就不那么好用了。 ◆ 可伸缩性,因为目前能够将现有的组件系统,例如EJB当作Web Services,所以应该有可能利用已有的负载均衡和其它可伸缩性机制。但在进行的过程中有没有未预见的障碍? 需不需要一种新的Web Services应用服务器? ◆ 可管理性,管理高度分布式的系统需要哪种机制? 因为系统的特性是其各个部分特性的函数,所以每种不同Web Services的管理器是否需要以一种特殊的方式协调?是否可能将一些Web Services的管理“外包”给其它Web Services? ◆ 可计费性,如何定义一个用户可以访问和执行Web Services多久? 如何收取Web Services使用的费用? 占主导地位的模式是基于订阅的还是现购现付的? 如果销售Web Services,如何表明所有权的变更? Web Services是在使用时完全消费,还是可以作为采购协议的一部分多次重用该服务? 对于这两个平台而言,谁先解决了这些问题,谁解决得更好,将在这场Web Services平台的龙虎之争中占得先机。 前面我们已经就技术、厂商支持、规范以及市场几个方面对.NET和J2EE两个平台架构进行了介绍和论述,同时也给出了整合应用的实例。现在使用一张表格来概括两者的比较(见表2)。 表2 评价J2EE与.NET
|
UML软件工程组织 |