【IT168 文档】在本期 Java 开发 2.0 中,Andrew Glover 介绍如何针对 Amazon Elastic Compute Cloud (EC2) 进行开发和部署。了解 EC2 与 Google App Engine 的差异,以及如何使用 Eclipse 插件和简洁的 Groovy 语言在 EC2 上快速地建立和运行简单的 Web 应用程序。
您可能听说过 Standish Chaos Report,这份每年一次的报告研究成功和失败的 IT 项目(见 参考资料)。这份报告常常包含大量坏消息。(如果都是好消息,它就不应该称为 Chaos Report 了,对吗?)2009 年的报告指出,百分之 44 的 IT 项目由于各种原因出了问题。原因之一是项目超出预算。很容易想到导致项目超出预算的几个原因。例如,程序员的薪酬并不低。基础设施也是影响成本的因素之一。
正如本系列第一篇文章(“使用 Google App Engine”)中指出的,Java™ 开发 2.0 的关键方面之一是,软件生产者现在可以不必维护高成本的内部基础设施,而是采用另一种替代方法。几年前,几家明智的公司开始利用硬件(及相关软件)的 “商品化”,它们构建了由大量廉价机器组成的系统,在这样的系统中即使某些机器出现故障,整个基础设施仍然可以继续运转。这些公司(比如 Google 和 Amazon 等)拥有庞大的基础设施,可以借给你我这样的人(同时保持其核心业务运行顺畅)。因此,云计算的概念现在变成了现实。如果您正在为 IT 项目制订预算,那么为了自己(和公司的利益)着想,应该研究一下从 Google 或 Amazon 租借基础设施是否比自己购买硬件便宜。
EC2 的不同之处
Google 和 Amazon 的租借基础设施很不一样。正如在 前一篇文章 中看到的,Google App Engine 更像是用于开发 Java Web 应用程序的平台。无法使用 Java 领域中可用的任意工具和框架,比如 Hibernate。例如,只能使用 Google 的 Big Table。但好处是可以把驻留的解决方案扩展到您需要的任何规模。(请记住,当您的 Google App Engine 网站达到带宽或空间上限之后,Google 就会向您收费)。
Amazon EC2 提供的不像是开发平台,更像是通用的基础设施服务,它提供虚拟机器(可以是基于 Linux®、OpenSolaris 或 Windows® 的),可以在这些虚拟机器上运行任何程序。EC2 不是免费的,但是它比 Google App Engine 灵活得多。只要可以创建或租借虚拟机器,就可以运行任何 Java 应用程序(包括使用 Hibernate 的 Java 应用程序)。(Amazon 和它的社区提供完整的预配置虚拟机器目录,这种虚拟机器称为映像)。与 Google App Engine 一样,可以非常高效地把应用程序扩展到面向全球用户,但是部署应用程序的位置和扩展方式主要由 Amazon 控制。(Amazon 也允许选择几个地理区域来部署应用程序)。
Amazon 提供了相关的 Eclipse 插件,帮助创建可以使用这个平台的应用程序。与使用 Google App Engine 插件时的情况相反,EC2 的灵活性很容易导致情况复杂化。例如,通过使用 Amazon 的 EC2 Eclipse 插件,很容易把 Apache Tomcat Web 应用程序(不包括数据库)部署到使用 EC2 的可配置集群上。但是,如果要实现这种基本用例之外的其他解决方案,比如使用 EC2 上已经部署的 MySQL 实例或使用 Amazon 的 SimpleDB,就需要多费些精力了。
在本文中,我将讲解如何快速简便地创建一个简单的应用程序,它通过 Eclipse 在 Amazon 基础设施上使用 Groovlet。除了开发用的机器之外,您不需要任何硬件,也不需要为将使用的任何软件支付许可证费用。(必须为在 Amazon 的基础设施上驻留代码支付很少一部分费用)。
EC2 入门
要想使用 EC2,必须创建一个 Amazon Web Services (AWS) 账户。如果您还不是注册的 Amazon 客户,就需要提供信用卡号码 — EC2 不是免费的(但注册是免费的)。注册之后,您会收到一个 Access Key ID 和 Secret Access Key,这是安全地使用 EC2 所必需的。
对于使用 AWS for Eclipse 插件,Amazon 建议使用 Eclipse 3.5;否则,需要先安装一些组件,这些组件在这个最新 Eclipse 版本中是默认的。因为您要创建和部署 Web 应用程序,我建议使用 Eclipse IDE for Java EE Developers,它包含一个漂亮的 Java EE 透视图,支持构建 Web 应用程序。
安装 AWS 插件套件
与安装其他 Eclipse 插件一样,要想安装 Amazon 的 AWS 插件,必须在 Eclipse 中通过 Help > Install New Software 找到插件的最新版本。Install 对话框打开之后,在 Work with 文本框中输入 http://aws.amazon.com/eclipse。文本框下面会出现可用插件列表,见图 1。选择整个 AWS Toolkit for Eclipse 选项,然后单击 OK。接受许可协议之后,Eclipse 安装这个插件。很可能需要重新启动 Eclipse。
图 1. 下载 AWS 插件
这个 Eclipse 插件允许指定 Web 应用程序的目标运行时环境。对于本文,将使用 Tomcat 6,所以需要先 下载 并安装 Tomcat 6。尽管将把 Web 应用程序部署到 EC2 上,而 EC2 运行一个 Tomcat 服务器集群,但是仍然希望在本地测试和运行应用程序,因为这是免费的。
创建 Groovy Web 应用程序
在开始演示如何配置 EC2 之前,先用我最喜欢的快速开发语言 Groovy 创建一个简单的 Web 应用程序。正如我在 “使用 Google App Engine” 中提到的,Groovy 本质上是 Java 语言,但是语法没那么复杂(见 参考资料)。例如,典型的 Hello World servlet 大约有 6 到 10 行 Java 代码(取决于是否计算导入语句等)。无论如何计算代码行数,我可以保证用 Groovy 编写的 Hello World servlet(Groovlet)更短;实际上,可以用 Groovy 编写的最简单的 servlet 只有一行代码。
在 Eclipse Java EE 透视图中,在 project explorer 中右键单击并选择 New > Dynamic Web Project。如果您以前没有创建过项目,也不必担心 — Eclipse 可以区分静态的 Web 项目(使用 HTML 页面)和动态项目(有 servlet 等服务器端资源)。
选择 Dynamic Web Project 选项之后,出现一个对话框,可以在其中配置项目的各个方面,比如目标运行时环境和 Servlet 版本。一定要选择 Tomcat 6。(可能还需要告诉 Eclipse 安装 Tomcat 6 的位置)。配置选项保持默认设置。
可以选择保存源代码文件的位置。我通常保持其为 src 目录不变。最后,必须告诉 Eclipse 上下文根 — 也就是将在 Web 应用程序的 URI 中使用的名称。一定要选择一个简单的名称。还需要为 Web 内容文件夹选择名称,这里保存静态文件和 Groovlet。
单击 Finish,插件的安装就完成了。
设置 Groovy 依赖项
要想使用 Groovy,必须做两个修改。首先,在项目的类路径中添加 groovy-all JAR(到编写本文时版本是 1.6.4)。还需要更新 WEB-INF 目录中的 web.xml 文件。这个文件把 Web 请求映射到 Groovlet — 如果您按 Java 开发 2.0:使用 Google App Engine 实践过,应该执行过这个步骤。web.xml 文件应该像清单 1 这样:
清单 1. 支持 Groovlet 的 web.xml 文件
<servlet-name>GroovyServlet</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GroovyServlet</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>
现在,可以用 Groovy 编写一些东西了。
编写 Groovlet
最简单的 Groovlet 只有一行,它使用 println 输出 “Hello World”。我们将用一些 HTML 代码增加一些情趣。Groovy 支持 Builder 的概念,Builder 是用于定义层次化数据结构的逻辑机制(见 参考资料)。可以使用 Groovy 的 Builder 简便地模仿 XML 和 HTML 等标记语言,甚至是模仿 Swing 等框架的 GUI。可以快速地创建 HTML 标记,而不需要处理 HTML(不需要尖括号!)。最简单的使用 HTML 的 Groovlet 使用 Groovy 的 MarkupBuilder,在这种情况下 Groovlet 以 html 变量的形式存在。例如,清单 2 给出一个使用 HTML 的简单的 Hello World Groovlet:
清单 2. 非常简洁的 Groovlet
head {
title("Hello from EC2")
}
body {
p("Hello from EC2!")
}
}
代码就这么多。仅仅几行代码就会生成格式良好的 HTML,其中有一个 元素,后面是<title>,然后是 <body> 元素和一个段落,太简单了。创建文件 EC2Groovlet.groovy,在其中输入清单 2 中的代码。把这个文件也保存到 Web 内容目录中。
希望创建 XML?很容易。不想让视图与控制器混在一起?没问题,使用 GroovyServer Page (GSP) 或 JavaServer Page (JSP) 就可以。无论您喜欢哪种方式,用 Groovy 编写 servlet 都非常容易。现在看看在 EC2 上使用 servlet 是多么容易。
作为最后一步,在项目的上下文根中创建一个简单的 index.html 文件。这个文件会给以后提供方便,因为在 Eclipse 中访问 EC2 时,Eclipse 访问的 URL 是上下文根;如果没有找到 index.html 文件,就会收到来自 Tomcat 的错误页面。在 index.html 中创建 Groovlet 的相对链接。
例如,我的 index.html 像清单 3 这样:
清单 3. 指向 Groovlet 的简单 index.html
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert any old title here!</title>
</head>
<body>
<p><a href="EC2Groovlet.groovy">Groovy is slick!</a></p>
</body>
</html>
容易的工作完成了。现在看看 EC2。
配置 EC2
很容易通过 Eclipse 插件配置 EC2。首先,打开 Amazon EC2 透视图,输入您的凭证。接下来,打开 Window > View > Servers。需要定义至少一个服务器,但是我们将定义两个服务器:一个在本地用于免费测试,另一个在 Amazon 的基础设施上。右键单击并选择 New > Server。
在 Select the server type 文本框中输入 local。会看到几个选择(见图 2)。选择 Tomcat v6.0 Server 选项(假设您已经按照 EC2 入门 中的说明下载了 Tomcat 并在 Eclipse 中正确地配置了运行时环境)。单击 Next,会看到在这个实例中添加可用资源(即项目)的选项。选择您的项目并单击 Add 按钮。单击 Finish 就完成了。现在可以自动地把 Web 项目发布到 Tomcat 的本地实例。
图 2. 定义本地服务器
在 Servers 控制台上,选择本地 Tomcat 实例,右键单击并选择 Start。Tomcat 启动之后,Eclipse 会部署您的代码(即您的 Groovlet)。启动 Web 浏览器,访问 localhost:8080/your context name/EC2Groovlet.groovy,应该会看到 Groovy Builder 生成的 HTML 页面。如果一切正常,就该在 Amazon 的基础设施上试试它了。
用 AWS 进行部署和测试
现在,您可能对在 EC2 上部署这个应用程序有些畏惧。其实这差不多与本地部署一样容易。首先,回到 Servers 控制台,右键单击并选择 New。然后,输入 ec2,会看到图 3 所示的 Amazon EC2 Tomcat v6.0 Cluster 选项。选择它并单击 Next。
图 3. 定义 EC2 服务器
在下一个对话框中(见图 4),可以选择希望集群使用的实例数量。目前,保持 1 即可 — 以后随时可以扩展。可以选择一个定制的 Amazon Machine Image (AMI) 或接受默认映像。目前使用默认映像;选择另一个 AMI 可以增加其他软件包,比如数据库。对于实例类型,选择 Small — 如果愿意,可以选择更大的实例(但是要记住,您必须付费)。
图 4. EC2 首选项
Amazon 已经表明它很重视安全性,下两个选项(也见图 4)与 Tomcat 集群的安全性相关。目前,只需在 Key Pair 区域中右键单击并选择 New Key Pair,创建默认的安全设置。必须定义一个名称并选择在注册 EC2 时已经安装的密钥对。
接下来,可以在 Security Group 框中创建组。(这里仅仅是创建组;在另一个视图中,可以实际使用它们)。右键单击并添加一个新的组,指定它的名称。默认设置允许所有人访问端口 8080,目前可以采用默认设置。
最后,可以配置 IP 地址。如果您最终决定长期使用 EC2,这会很方便,因为 Web 应用程序的默认 URI 相当长,很难记住。目前接受 EC2 提供的地址即可。但是,不必担心 — 随时可以把自己的域名映射到 Amazon 提供的 IP 地址。
单击 Next 按钮,把您的项目(和 Groovlet)与 EC2 服务器联系起来。现在可以部署了!
与前面一样,右键单击刚才定义的 Amazon EC2 服务器并启动它,见图 5:
图 5. 启动和停止服务器
这一次,启动可能会多花些时间,因为启动在远程执行。服务器运行起来之后,选择您的 Web 项目并选择 Run as > Run on Server 选项。接下来,选择已经启动的 Amazon Tomcat 集群并单击 Finish。这么做会在 Eclipse 中打开嵌入的浏览器,它在默认情况下访问您的上下文根 — 这里有 index.html 文件,文件包含 Groovlet 的链接。
注意浏览器位置窗口中的 URL。可以在图 6 中看到我的 URL。随时可以把 URL 映射到更符合逻辑的地址。单击 Groovlet 的链接,Groovy 程序会再次显示 — 这一次,程序是在您完全不知道的某个地方的服务器上运行的!
图 6. EC2 是 Groovy!
单击链接几次,您会体会到在 Amazon 的基础设施上运行程序与在自己的本地机器上运行一样容易。然后,一定要停止服务器 — 如果不这么做,您就要一直付费。停止服务器与启动一样。在 Servers 控制台中右键单击您的实例并选择 Stop。
EC2 是 Java 开发 2.0
Java 开发 2.0 主要受到两个因素的影响:
充分利用开放源码工具和框架构建整个应用程序
租借(或借用)管理软件生命周期的各个阶段(包括运行应用程序本身)所需的应用程序基础设施
正如在本文中看到的,通过使用 EC2 可以实现 Java 开发 2.0 的这两个方面。可以在借来的基础设施上充分利用您喜欢的任何软件(请记住,Amazon 的虚拟机器可以运行任何东西),而其花费远远少于自己购买硬件资源。不仅如此,可以非常高效地设置 EC2,扩展到非常大的规模,远远超过您自己以同样的成本能够达到的规模。