Enterprise JavaBean (EJB) 1.1 规范定义了开发和部署基于事务性、分布式对象应用程序的服务器端软件组件的体系结构。企业组织可以构建它们自己的组件,或从第三方供应商购买组件。这些服务器端组件称作 Enterprise Bean,它们是 Enterprise JavaBean 容器中驻留的分布式对象,为分布在网络中的客户机提供远程服务。
两层和三层环境
在两层客户机/服务器环境中,程序员编写与供应商特定软件紧密结合的应用程序。通常,两层应用程序直接从客户机访问数据库服务或事务服务。有时这种应用程序称作胖客户机,因为应用程序逻辑驻留在客户机上,这使客户机变得庞大和复杂。下图描绘了这一特性:
三层客户机/服务器应用程序使用一个中间或中间层,应用程序服务器,它在客户机应用程序和后端数据库之间操作。中间层存储了系统的商业逻辑,并协调客户机上与后端数据库交互的显示。
在两层模型上使用三层体系结构是出于以下两个动机:
改进的可伸缩性、可用性和性能
改良的商业系统灵活性和可扩展性
由于两层系统利用了客户机的处理能力,因而它具有良好的性能,但许多客户机对单一后端资源(如数据库)的特性会产生瓶颈,随着客户机数量逐渐增大,这会抑制可伸缩性、可用性和性能。三层系统试图通过更有效地管理后端资源来消除这个瓶颈。利用资源管理技术,如合用和集群中间层服务器,可以实现这个目标。合用允许许多客户机共享不充足的资源(如数据库连接),这样可以减少后端服务器的工作负荷,从而使三层系统更有效。由于多个服务器和资源可以支持故障恢复并均衡不断增加的客户机数量的负载,因此集群可以使三层系统变得更具可用性和可伸缩性。
三层系统比相应的两层系统更灵活且更可扩展,这是因为商业逻辑和服务(如安全性和事务)都驻留在中间层,并且基本上独立于客户机应用程序。如果正确实现了三层系统,那么在使用 Enterprise JavaBean 的情况下,服务会自动应用于客户机请求,因此服务是看不见的。由于服务对于客户机不可见,因此对服务的更改也不可见。如果正确实现了三层系统,那么中间层上对商业逻辑的更改和增强也可对客户机应用程序隐藏。
另外,如果客户机与中间件组件是以 Java 编程语言实现的,那么它们极有可能具有可移植性。可以非常容易地将实现客户机和应用程序服务器的类文件重新安置到当前最合适的主机上。
在最近二、三年中,一些供应商发布了基于 Java 的三层应用程序服务器,这些服务器全都可以与后端服务器操作交互,并管理这些操作。尽管这些中间件产品支持分布式体系结构,这些体系结构在两层设计上(以及 Java 之前的应用程序服务器)做了非常重大的改进。它们的主要限制是编程模块越来越趋向于特定于某个供应商。这意味着公司必须大量购买一家供应商的型号,而且系统是不可移植的,从而导致了供应商锁定。
随着面向对象编程范例日益普及,分布式对象系统已经逐渐壮大。现在已经存在一些分布式对象技术。最流行的是由 Object Management Group 创建的 CORBA、Sun Microsystems 的 Java RMI (JRMP) 和 Microsoft 的 DCOM 和 MTS(又名 COM+)。每种都有其自身的优缺点。Sun Microsystems 的 Enterprise JavaBean 是最新加入这个圈子的技术。在某些方面,它既是这些技术的竟争者,同时也是合作者。
由于在三层计算中使用了其它开放标准(如 LDAP),CORBA(公共对象请求中介体系结构)在解决供应商垄断问题方面取得了成功。不幸的是,虽然 CORBA 根本改变了分布式计算,但经验证编程模块太复杂,而且供应商不能一致地遵守规范。CORBA 有高级的分布式计算,但已证明太难而无法实现,并且其可移植性也比预期差。
Enterprise JavaBean (EJB) 是 Sun Microsystems 对 CORBA 的可移植性和复杂性的解决方案。EJB 引入了比 CORBA 更简单的编程模块,它可以让开发人员创建可移植分布式组件,称作 Enterprise Bean。EJB 编程模块可以让开发人员创建安全的、事务性的和持久的商业对象 (Enterprise Bean),该对象使用非常简单的编程模块和声明属性。与 CORBA 不同,例如访问控制(授权安全性)和事务管理等设施非常易于编程。CORBA 需要使用复杂的 API 来利用这些服务,而 EJB 则根据一种称作“部署描述信息”的特性文件中的声明将这些服务自动应用到 Enterprise Bean。这个模型确保了 bean 开发人员可以集中精力编写商业逻辑,而容器会自动管理更复杂但又必要的操作。
由于 EJB 规范颁布了一组明确的 EJB 容器(供应商服务器)和 EJB 组件(商业对象)之间的契约,因此 EJB 中实现了可移植性。这些契约或规则确切规定容器必须为 Enterprise Bean 提供什么服务,bean 开发人员需要使用什么 API 和声明属性来创建 Enterprise Bean。由于详细指定了 Enterprise Bean 的生命周期,因此供应商知道如何在运行时管理 bean,bean 开发人员确切知道 Enterprise Bean 在其存在期间可以做什么。
Enterprise JavaBean 简化了分布式对象的开发、部署和访问。EJB 分布式对象(一种 Enterprise Bean)的开发人员只需依照为 Enterprise JavaBean 建立的契约和协议实现对象。支持 EJB 的应用程序服务器可以,也确实,使用任何分布式网络协议,包括本地 Java RMI 协议 (JRMP)、专有协议或 CORBA 的网络协议 (IIOP)。不管在某个特定产品中使用的基本网络协议是什么,EJB 使用相同的编程 API 和语义以 Java RMI-IIOP 访问分布式对象。协议的细节对应用程序和 bean 开发人员隐藏;对于所有供应商来说,定位和使用分布式 bean 的方法是相同的。
注:Enterprise Bean 与 JavaBean 不同。JavaBean 是使用 java.beans 包开发的,它是 Java 2 标准版的一部分。JavaBean 是一台机器上同一个地址空间中运行的组件。JavaBean 是进程内组件。Enterprise Bean 是使用 javax.ejb 包开发的,它是标准 JDK 的扩展,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多台机器上跨几个地址空间运行的组件。因此 Enterprise Bean 是进程间组件。JavaBean 通常用作 GUI 窗口小部件,而 Enterprise Bean 则用作分布式商业对象。