内容


了解 Geronimo 的部署架构

了解 Geronimo 配置和部署模型的底层概念

2003 年 8 月,许多开放源码开发人员聚集到 Apache J2EE Server Project 的 IApache Software Foundation 的旗帜之下,Apache Geronimo 诞生了。Geronimo 可以看作企业的操作系统。它将许多开放源码项目放入单个框架中,协同交付企业堆栈。

与 Linux 相比,Geronimo 是由开放源码社区开发的比较复杂的项目之一。(一些观察者认为, Geronimo 是对开放源码实践的可持续性及其处理高度复杂性的能力的一个测试。)此外, Geronimo 的主要目标之一是 J2EE 1.4 认证,这是一项耗时的工作。不过,Geronimo 已经发布了几个里程碑版本,而且正在朝着不可思议的 1.0 版本稳步前进。

Geronimo 的架构

与大多数其他企业操作系统一样,Geronimo 构建于 内核—— 一个为位于它上面的一切事物提供基础的微内核 —— 之上。Geronimo 的内核是 J2EE 不可知论者。它的惟一目的是管理 Geronimo 的构建块,这些构建块叫做 Geronimo Bean,简称为 GBean

几乎 Geronimo 中的一切事物,包括容器、连接器和应用程序,都是 GBean。GBean 的粒度随之变化。例如,运行于 Web 容器之上的小 servlet 是一个 GBean,而这个 Web 容器本身也是一个 GBean。GBean,尤其是大 GBean,可以聚集其他 GBean。

Geronimo 的内核管理 GBean 的生命周期和 GBean 之间的依赖关系。GBean 可以保存状态,定义它们自己之间的依赖关系,并对生命周期事件作出反应。GBean 的状态可以用 GBean 框架的支持保持持久性。因为运行着的 Geronimo 实例本质上是运行着的 GBean 的组合,该功能可用于存储 Geronimo 的当前状态,并在将来恢复该状态。该能力是惟一的,因为它不需要任何配置文件。相反,所有状态都保存在 GBean 中。此外,可以通过管理接口管理 GBean,使它们被动态启动、停止和编辑。

GBean 可以注册一个兴趣,以便知道遵守特定文件名模式的其他 GBean 何时运行。当与该模式匹配的 GBean 启动之后,对这个已经启动的 GBean 的引用会自动注入到已经注册该兴趣的 GBean 中。这叫做 依赖注入。依赖注入使 GBean 成为构建松散耦合系统的强大工具。

例如,代表 Enterprise JavaBeans (EJB) 容器的 GBean 可以对代表 EJB 的 GBean 注册兴趣。当代表 EJB 的 GBean 启动之后,内核将其通知给 EJB 容器。GBean 创建器不需要将它们的 GBean 与其他感兴趣的 GBean 相关联;注册兴趣就足够了。一个 GBean 启动之后,对它感兴趣的其他所有 GBean 立即就知道它了。

部署和配置

Geronimo 部署架构关心如何创建、启动、停止、存储、检索和删除代表部署在 Geronimo 中的 J2EE 和非 J2EE 组件的 GBean。

配置 是关键部署单元。配置是一个或多个 GBean 与一个类加载器的逻辑分组集合。配置可以存储在配置存储 中,配置存储是 Geronimo 标准存储机制。Geronimo 在配置级管理 GBean;配置用服务器启动,用户可以停止配置或取消部署配置。每个配置在 Geronimo 发行版中都有一个物理位置,位于叫做 config-store 的文件夹中。发行版随带的配置代表核心服务。部署的每个新应用程序创建一个新配置。

为 Geronimo 添加新组件需要四个步骤,不管该组件是核心组件还是应用程序:

  1. 构造捕获组件信息和行为的一个或多个 GBean
  2. 用关联的类加载器将这些 GBean 分组到配置中
  3. 将配置存储到配置存储中
  4. 启动配置

该过程完成之后,当服务器重新启动时,组件信息持久化。这解释了 Geronimo 独特的一面。Geronimo 发行版没有任何部署描述符,因为配置完全替代了它们。所有部署信息转换为 GBeans,分组为配置,存储在配置存储中。图 1 展示了在 Geronimo 中如何创建、运行和存储 GBean。

图 1. Geronimo 部署和配置架构
Geronimo 部署和配置架构
Geronimo 部署和配置架构

正如 图 1 中所看到的,GBeans 的构造方法有下列三种:

  • 从计划 —— 计划 是 GBean 的 XML 序列化。计划用于配置 Geronimo 的核心组件。Geronimo 的 配置构建器 根据计划构造 GBean,并将其存储在配置存储中。这些计划位于 Geronimo 源代码中,但当构建二进制发行版时,它们被当作配置来读取和存储。它们并不包括在二进制发行版中,因为它们已经完成了它们的目的。
  • 从 J2EE 部署模块 —— 要部署 Geronimo 中非 GBean 的任何事物,Geronimo 部署器 创建一个捕获该事物所代表的信息的 GBean。例如,包括 ejb-jar.xml 文件和一些类的 EJB 模块。Geronimo 部署器创建一个捕获该模块所代表的信息的 GBean,并将该 GBean 存储在配置存储中。
  • 编程 —— 如果 GBean 不能从计划和部署模块中创建,那么它应该通过编程来创建。这是最少用的选项。

集成示例

将项目集成到 Geronimo 中的一个好示例是 EJB 容器的集成。将 EJB 容器建模为一个或多个 GBean,将它们分组为一个配置,并将该配置表示为计划。Geronimo 读取该计划并构造、存储和启动该配置。

EJB 容器 GBean 不知道部署在它里面的 EJB。但它针对与 EJB 的 GBean 表示相匹配的 GBean,用内核注册一个兴趣。当 J2EE 部署器创建 EJB 模块并部署它时,Geronimo 部署器创建一个代表该 EJB 模块的 GBean,将其存储在配置存储中,并启动该 GBean。该 GBean 启动之后,内核将该 GBean 注入 EJB 容器 GBean 中,因为后者已经注册了对 EJB GBean 的兴趣。该注入将该 EJB 通知给 EJB 容器,并启用该容器以便为指向 EJB 的请求服务。

幕后

本节解释执行部署命令时内部发生的动作。展示的所有命令都从 Geronimo 安装目录中工作。下面这条命令启动 Geronimo 服务器:

$ java -jar bin/server.jar configuration1 ...

发出该命令之后,屏幕上的输出如 清单 1 所示:

清单 1. 服务器启动
.......
10:56:10,580 INFO [Configuration] Started configuration org/apache/geronimo/System
10:56:10,668 INFO [RMIRegistryService] Started RMI Registry on port 1099
10:56:10,836 INFO [ReadOnlyRepository] Repository root is
   file:/home/hemapani/drafts/dev-works/geronimo-1.0-M3/repository/
10:56:10,890 INFO [ConfigurationManagerImpl] Loaded 
   Configuration geronimo.config:name="org/apache/geronimo/SystemJMS"
...

Geronimo 从配置存储中选择配置,并逐个地存储和启动它们。每个配置启动与之关联的 GBean。

运行配置

启动配置的命令如下:

$ java -jar bin/server.jar configuration1 ...

该命令启动了配置及其所有依赖关系。可以在 config-store/index.properties 中找到可用配置,但一定不要更改该文件,因为这样可能破坏您的安装。该命令启动正在启动的每个配置中的所有 GBean。

部署模块

部署模块的命令如下:

$ java -jar bin/deployer.jar deploy YourApplication.ear

该命令从 J2EE 模块(比如企业档案 (EAR))创建 GBean。它创建配置并将其存储在配置存储中,该配置存储位于 Geronimo 在 Geronimo 发行版的 config-store 文件夹中创建的新文件夹中。新配置设置之后,就启动了。

取消部署模块

取消部署模块的命令如下:

$ java -jar bin/deployer.jar undeploy module-id

与模块关联的 GBean 被停止,然后从配置存储中删除。

部署服务

部署服务的命令如下:

$ java -jar bin/deployer.jar deploy YourService-plan.xml

可以使用该命令部署一个或多个自定义 GBean。XML 文件是 GBean 的 XML 序列化。该命令与 J2EE 无关,可用于在 Geronimo 中部署自定义服务。下一节介绍的示例应用程序将展示这种能力。

示例应用程序

为了展示到目前为止所介绍的概念,本文提供了一个使用 Geronimo GBean 架构编写的回显服务器示例。它使用 Geronimo 命令行部署来部署该服务器。该应用程序展示了如何在 Geronim 中部署自定义组件 —— 与 J2EE 无关。每个 J2EE 应用程序部署器使用与此相同的机制来将 J2EE 组件转换为 GBean,将其存储为配置,并启动它们。

开始

按照下列步骤为运行应用程序作准备:

  1. 下载 Geronimo 发行版(参阅 参考资料 以链接到 Apache Web 站点的下载页面),并将其解压到选择的目录中。从现在起,将该目录称为 Geronimo 主目录或 $GERONIMO_HOME。
  2. 下载示例代码(参阅 下载),并将其解压。这将创建一个包含 build.xml 文件的 samples 文件夹。将该 samples 文件夹复制到 Geronimo 主目录中。
  3. 安装 Apache Ant(参阅 参考资料 链接到 Web 站点)。
  4. 通过将目录更改为 samples 目录并键入 $ant 来构建示例应用程序。这将编译并构建 sample.jar 文件,并将其复制到 GERONIMO_HOME/repository/sample/jars 中。

了解示例

GERONIMO_HOME/sample/src/EchoServer.java 具有该回显服务器 GBean 的实现。该 GBean 的代码如 清单 2 所示。

清单 2. 回显服务器 GBean 代码
public class EchoServer implements GBeanLifecycle {
    private static final GBeanInfo GBEAN_INFO;
    private final String objectName;
    private int port;
    private ServerSocket serversocket;
    private boolean started = false;
    static {
        GBeanInfoBuilder infoFactory =
            new GBeanInfoBuilder(EchoServer.class.getName(), EchoServer.class);
        // attributes
        infoFactory.addAttribute("objectName", String.class, false);
        infoFactory.addAttribute("port", int.class, true);
        // operations
        infoFactory.setConstructor(new String[] { "objectName", "port" });
        GBEAN_INFO = infoFactory.getBeanInfo();
    }
    public EchoServer(String objectName, int port) {
        this.objectName = objectName;
        this.port = port;
    }
    public void doStart() throws WaitingException, Exception {
       //code to start the echo server 
    }
    public void doStop() throws WaitingException, Exception {
        //code to stop the echo server 
    }
    .....
}

清单 3 展示了 $GERONIMO_HOME/sample/echo-server.xml 文件,它是用于在 Geronim 中部署回显服务器的计划。

清单 3. 回显服务器部署计划
<?xml version="1.0" encoding="UTF-8"?>
<configuration
    xmlns="http://geronimo.apache.org/xml/ns/deployment"
    configId="deployment/echoserver"
    >
    <gbean name="geronimo.test:name=echoserver" 
           class="EchoServer" >
           <attribute name="port" type="int">2345</attribute>
       </gbean>    
        <dependency>
        <uri>sample/jars/samples.jar</uri>
        </dependency>
</configuration>

特别注意 port 属性和依赖关系,后者解释在何处可以找到回显服务器的类。路径是相对于 Geronimo 主目录的资源库目录给出的。配置 ID 是标识配置的惟一 ID。

启动 Geronimo 服务器

将目录更改为 $GERONIMO_HOME 并启动 Geronimo 服务器:

$ java -jar bin/server.jar

部署回显服务器

在单独 shell 中,将目录更改为 $GERONIMO_HOME,并部署回显服务器:

$  java -jar bin/deployer.jar deploy samples/echo-server.xml

部署服务

在部署器提示之后,输入 system 作为用户名,输入 manager 作为密码:

Username: system
Password: manager
Deployed deployment/echoserver

服务器窗口中的输出表明启动了 GBean。最后一行是回显服务器 GBean 的 System.out.println() 语句。现在回显服务器启动并运行了。要测试它,使用 telnet 客户机或下载提供的测试用例。

更多命令

还可以尝试下列命令来停止、启动和取消部署回显服务器:

 java -jar bin/deployer.jar stop deployment/echoserver
 java -jar bin/deployer.jar start deployment/echoserver
 java -jar bin/deployer.jar undeploy deployment/echoserver

在每个用例中,服务器窗口将指明发生了什么,其中包括哪些配置已经启动或停止。

结束语

已经学习了 Geronimo 部署模型,它将许多不同的开放源码项目置于一个保护伞下。Geronimo 用户不需要知道本文介绍的所有细节,但如果您非常有兴趣了解内幕,那么您已经获得了对 Geronimo 部署架构底层概念的深入了解。


下载资源


相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Java technology
ArticleID=93497
ArticleTitle=了解 Geronimo 的部署架构
publish-date=09052005