本系列文章的第1部分讨论了云计算的基本方面,包括云的层和不同的云类型及其优缺点,并解释了为何了解云对企业开发人员很重要。本文主要考察公共云,以及如何使用 IBM® WebSphere® sMash 和 IBM DB2® Express-C Amazon Machine Images (AMI) 交付宿主在 EC2 公共云基础设施上的 Web 应用程序。
简介
在 3 种类型的云中 —— 公共云、私有云和混合云 —— 公共云提供的产品是最出色、最成熟的。可访问性和廉价性是导致公共云日趋流行的两个关键特征。为了实现可访问性和廉价性,Amazon Elastic Compute Cloud (EC2) 基础设施提供了宿主 Amazon Machine Image 实例的公共云,AMI 可向用户交付各种功能。为了让用户能够利用 EC2,IBM 最近发布了 Amazon Machine Images (AMI),它包含了一些针对 EC2 平台的流行软件;这些 AMI 可以根据开发许可免费获得。此外,IBM 还支持运行在 EC2 基础设施中的特定 IBM 软件。
本文概述了公共云,并讨论了如何使用 IBM WebSphere sMash 和 IBM DB2 Express-C Amazon Machine Images 交付宿主在 EC2 基础设施上的 Web 应用程序。
企业和公共云
为了理解企业如何才能利用公共云计算解决方案,请从以下两方面考虑:
企业使用公共云提供的应用程序。这个应用程序可能用于处理雇员的工资数据,也可能是一个客户关系管理系统。通过利用以这种方式交付的应用程序,企业就不再需要在私有数据中心上安装和维护应用程序。企业还可能节省一部分与许可费用相关的成本,因为大部分云提供的服务都是根据使用量计费的。 企业利用基于云的宿主解决方案向用户交付应用程序。通过这种方式,企业就不再需要维护和更新产品系统,因为云供应商负责提供基础设施资源,以满足用户对应用程序的需求。这个模型还能促进企业服务的普及,因为任何连网的计算机都可以随时随地访问通过公共云交付的解决方案。
不管在什么场景下,一个常见的主题就是业务的底线价值。很明显,公共云能够帮助企业减少与拥有软件和数据中心基础设施组件相关的成本。虽然不是很直观,但是使用公共云能够让企业快速响应服务需求变更,从而使服务能够进入新的市场,并且让宝贵的人力资源集中于业务创新,而不是仅交付支持业务的技术基础设施。
IBM 和公共云
IBM 是公共云的积极贡献者,它提供的解决方案让企业能够从云获得应用程序,以及通过公共云交付自己的终端用户应用程序。从应用程序提供商的角度来看,IBM 提供了 IBM Lotus® Live、IBM Lotus Sametime® Unyte® 和宿主在公共云上的软件开发工具。这套工具让用户能够利用云提供的服务进行交流、讨论、协作和创新。除了提供这些服务之外,IBM 的 Global Business Services 部门还帮助组织实现利用公共云产品的解决方案,从而实现所需的云价值。
本文的剩余部分主要关注 IBM 如何使您通过利用公共云基础设施交付高效的应用程序。如前所述,IBM 在 Amazon Machine Images 中包含了几个企业级产品,因此可以在流行的 Amazon EC2 基础设施中使用这些软件。IBM AMI 包括:
IBM WebSphere Portal IBM Lotus Web Content Management Standard Edition IBM WebSphere sMash IBM Informix® Dynamic Server Developer Edition 11.5 IBM DB2 Express-C 9.5
通过在 Amazon EC2 基础设施上免费提供这些软件,IBM 实现了一个为超过 400,000 个用户提供服务的生态系统,并且吸引了 80% 以上的利用云计算开发服务的开发人员。
要更多地了解 IBM 关于开发人员和云计算的信息,请访问 developerWorks 空间云计算站点。本文分别阐述了 WebSphere sMash 和 DB2 Express-C AMI 的平台即服务(Platform as a Service,PaaS)和数据即服务(Data as a Service,DaaS)。
WebSphere sMash 和 DB2 Express-C
WebSphere sMash 和 DB2 Express-C 都是面向开发人员的强大工具。通过 WebSphere sMash,您可以使用流行的技术和模式(比如 Dojo、PHP、Groovy 和 REST 服务)创建 Web 2.0 式的应用程序。DB2 Express-C 提供高效、响应性好和可靠的企业数据,并且包含了纯 XML 处理功能。然而,通过综合利用这些技术交付响应性好、面向数据的富 Web 应用程序,甚至还能实现更大的价值。
本文包含的样例应用程序演示了一个餐馆座位应用程序,它粗略的展示了 WebSphere sMash Zero Resource Model (ZRM) 和 DB2 Express-C 数据库提供的功能。可以轻松地扩展这个应用程序使用的模式,以处理更加复杂的数据和数据关系。Zero Resource Model 通过与 DB2 Express-C 集成提供了丰富的前端体验,该前端由轻量级的高效、高响应性后端所支持。
IBM AMI 随一个免费的开发许可提供,但要记得在完成之后终止实例。否则,Amazon 将按小时继续收取宿主实例所需的费用。
设置 AMI
要使用 IBM AMI,必须遵循以下步骤,并且第一步是先决条件:
设置一个 Amazon Web Services (AWS) 帐户。这个帐户用于管理 EC2 使用。 获取并配置 WebSphere sMash AMI和 DB2 Express-C AMI。在配置 DB2 Express-C 实例时,为了进行演示请使用默认的用户名。现在还没有创建数据库;这些细节在下一小节描述。 根据提供的说明将 AMI 部署到您的 AWS 帐户。 创建并激活数据库
在将 DB2 Express-C 和 WebSphere sMash AMI 部署到 EC2 之后,配置正在运行的 DB2 Express-C 实例的数据库。这个数据库存储应用程序需要使用的表。
使用 SSH 登录并验证您的 DB2 AMI 实例。在登录之后,使用 su - db2inst1 命令切换到 db2inst1 用户。 使用 createDatabase 命令为应用程序创建数据库。在 /home/db2inst1/bin 目录中,输入 ./createDatabase RSTDB 命令。
图 1. 创建数据库
停止并重启 DB2 服务以激活新的数据库。使用 su 命令切换回根用户,然后运行 rcdb2 stop 和 rcdb2 start 命令。
图 2. 激活数据库
在重启服务之后,RSTDB 数据库就被激活,并且 DB2 Express-C 实例在端口 50001 上运行。现在,DB2 Express-C 实例的配置已经完成。WebSphere sMash 中的 ZRM 用于与后台集成,因此所有表都被自动配置好。
设置应用程序
WebSphere sMash AMI 实例设置完毕之后,从 http://<ec2_host>:8070/ 登录到 AppBuilder 应用程序。在这里,您将创建一个在样例中使用的 WebSphere sMash 应用程序。为此,单击 Create new application 在 AppBuilder 的左边面板中创建一个示例应用程序。当提示输入名称时,请输入 RestaurantSeating。在创建应用程序之后,在控制台的中央面板中单击应用程序名开始为应用程序添加内容。
利用 Zero Resource Model
受 WebSphere sMash 支持的 ZRM 的目的是大大简化通过 REST 访问后台数据存储。该模型支持通过少量代码和配置实现这种访问。仅需为您的数据和资源处理程序(用于处理与数据的 REST 交互)创建一个模型。资源处理程序仅包含少量代码,用于处理输入数据,并且 ZRM 完全隐藏了与后端数据库的交互。
为了开始在示例中使用 ZRM,需要为您的数据创建资源模型。这些资源模型定义应用程序中的数据的格式,并由 ZRM 用于访问存储在数据库中的数据。您现在应该已经登录到 AppBuilder,因此选择 New file => Zero Resource Model in app/models => New form。
图 3. 在 AppBuilder 中创建新的资源模型
为每个条目创建一个 JSON 数据模型。这些 JSON 模型定义组成资源的属性。这包括关于属性的数据类型的信息以及其他信息,比如默认值和数据长度等。因为您创建的是餐馆座位系统,所以需要为 4 个不同的条目创建资源模型: 正在等待的顾客 餐桌 座位 服务员
在 WebSphere sMash 中这些模型被声明为 JSON 格式。您可以使用 AppBuilder 中的设计编辑器,或直接输入资源模型的 JSON 声明。不管使用哪种方式,都应该有清单 1 中声明的 4 个 JSON 文件。
清单 1. 资源模型声明
// start patron.json (model for waiting customers){ "fields": { "name": { "label": "Name", "required": true, "type": "string", "description": "", "default_value": "", "max_length": 50 }, "capacity_requested": { "label": "Number needed", "required": true, "type": "integer", "description": "", "default_value": "" }, "seated": { "label": "", "required": true, "type": "string", "description": "", "default_value": "false", "max_length": 5 } }}// end patron.json// start rest_table.json (model for restaurant tables){ "fields": { "capacity": { "label": "Capacity", "required": true, "type": "integer", "description": "", "default_value": "" }, "table_type": { "label": "Type", "required": true, "type": "string", "description": "", "default_value": "", "max_length": 50 } }}// end rest_table.json// start waiter.json (model for waiters){ "fields": { "name": { "label": "Name", "required": true, "type": "string", "description": "", "default_value": "", "max_length": 50 } }}// end waiter.json// start seating.json (model for a seating in the restaurant){ "fields": { "table_id": { "label": "Table Id", "required": true, "type": "integer", "description": "", "default_value": "" }, "patron_name": { "label": "Patron Name", "required": true, "type": "string", "description": "", "default_value": "", "max_length": 50 }, "waiter_name": { "label": "Waiter Name", "required": true, "type": "string", "description": "", "default_value": "", "max_length": 50 } }}// end seating.json
现在,可以设置资源处理程序了。资源处理程序提供对资源模型定义的数据的 REST 访问,在这个示例中用 Groovy 语言实现它们。在 app/resources 中选择 New file => Resource handler 创建 4 个资源处理程序,每个资源模型一个。资源处理程序应该与资源模型同名,但其文件扩展名为 .groovy 而不是 .json。在 app/resources 中选择 Resource handler。每个资源处理程序内部中有一个 onList、onRetrieve、onCreate、onUpdate 和 onDelete 方法。每个方法分别对应于 HTTP 中的 GET、GET、POST、PUT 和 DELETE 方法。清单 2 显示了服务员资源模型的资源处理程序示例。
清单 2. waiter.groovy 文件
def onList(){ ZRM.delegate();}def onRetrieve(){ ZRM.delegate();}def onCreate(){ ZRM.delegate();} def onUpdate() { ZRM.delegate();}def onDelete(){ ZRM.delegate(); }
通过用 ZRM.delegate() 代替文件的所有内容,前面的 groovy 声明可以更加简洁。没有必要定义每个方法,但这样做可以在每个方法中插入定制代码(必要时)。
创建数据库表
在创建了资源模型和处理程序之后,您可以在 WebSphere sMash 中使用命令行工具和配置文件创建数据库表。
使用 SSH 登录到 WebSphere sMash AMI 实例,并更新 /home/smash/apps/RestaurantSeating/config/zero.config 文件。添加后端数据库的名称、位置和配置。
清单 3. 集成 ZRM 和 DB2 Express-C
/config/db/zero-resource = {"class" : "com.ibm.db2.jcc.DB2SimpleDataSource","driverType" : 4,"serverName" : "ec2-75-101-207-229.compute-1.amazonaws.com","portNumber" : 50001,"databaseName" : "RSTDB","user" : "db2inst1","password" : "passw0rd"}
将 db2cc.jar 和 db2cc_license_cu.jar 复制到 WebSphere sMash 应用程序库。在前面的步骤中,您已经提供了 ZRM 所需的信息,包括数据资源类名、数据库位置和数据库的访问信息。接下来,因为您指向的是 com.ibm.db2.jcc.DB2SimpleDataSource 数据源类,所以需要确保 WebSphere sMash 能够使用适当的 DB2 库。使用 SCP 程序从 DB2 Express-C AMI 实例获取 /home/db2inst1/sqllib/java/db2cc.jar 和 /home/db2inst1/sqllib/java/db2cc_license_cu.jar 文件。将这两个文件复制到 /home/smash/apps/RestaurantSeating/lib 目录。从 WebSphere sMash 实例的 /home/smash/apps/RestaurantSeating 目录运行 zero 模型,以将新的 JAR 文件添加到应用程序的类路径。 现在,您可以为数据库表定义初始数据,这是可选的。为了在创建表之后节省输入时间,您可以使用一个特性定义一些初始数据,从而在创建表时填充这些数据。这些数据在应用程序的 app/models/fixtures 目录下的 initial_data.json 文件中定义。这个文件中的条目是在先前步骤中定义的资源模型的实例。要生成表并用初始数据填充它们,请运行 zero 模型 sync 命令。最后,会在 DB2 Express-C AMI 实例上创建表,并且所有在 initial_data.json 文件中定义的数据都将在表创建之后插入到其中。 创建用户界面
现在,需要让系统的用户能够查看数据并与之交互。WebSphere sMash 提供定制的 Dojo 小部件,它们可以利用 ZRM 中的实用程序访问数据库中的数据。这些小部件提供开箱即用的功能。您可以将它们放置到 HTML 页面的任何位置,以提供必要的配置信息,结果将得到一个非常友好的界面,在其上,可以使用先前创建的资源处理程序创建、读取、更新和删除后端数据库中的数据。
定义一个与 ZRM 资源处理程序交互的 DataStore,并定义一个使用 DataStore 的 DataGrid。在餐馆座位系统中,引位员必须能够查看当前正在等待的顾客,添加新的顾客,以及查看当前的座位数。您可以使用 zero.resource.DataStore 和 zero.grid.DataGrid 显示顾客信息。(还可以将该技术应用到座位数据 —— 或任何配置为使用 ZRM 的数据)。
清单 4. 顾客 DataGrid 和 DataStore
// patron DataStore<span dojoType="zero.resource.DataStore" id="patronDataStore" jsId="patronDataStore" contextRoot="./resources" resourceCollection="patron"></span>// patron DataGrid<div dojoType="zero.grid.DataGrid" id="patronDataGrid" visibleFields="name,capacity_requested,id" store="patronDataStore" readonly="true" style="width: 348px; height: 271px;"> </div>
DataStore 引用顾客 (patron.json) 资源集,而 DataGrid 引用 DataStore。图 4 显示了输出的结果。
图 4. 顾客 zero.grid.DataGrid
除了显示数据的 DataGrid 之外,您还可以添加新的顾客或为现有的顾客找到座位。可以使用 ZRM 轻松地将新数据添加到后端数据库中。
清单 5. 添加新的客户数据
function addPatron() { dojo.xhrPost({ url: "resources/patron", form: "addPatronForm", load: function (data) { hideAddPatron(); displayWaitingPatrons(); }, // Call this function if an error happened error: function (error) { console.error ('Error: ', error); } });}
使用 HTML 和 JavaScript 与 ZRM 资源处理程序进行通信。前面的例子导致调用 patron.groovy 资源处理程序,该处理程序从内部委托 ZRM 使用新数据填充 DB2 数据库。图 5 扩展了先前描述的概念,从而解决了当前座位数信息的显示和更新。使用一些 HTML 和 JavaScript 代码生成如图 5 所示的用户界面。
图 5. 餐馆座位系统的用户界面
最后得到一个简洁、美观、易用的用户界面,它让引位员能够完全控制餐馆的座位情况。
结束语
您可以下载针对本文样例的完整 WebSphere sMash 应用程序的代码。您需要一些资源来试用这个应用程序,并且可以利用 AMI 和 EC2 驻留 WebSphere sMash 和 DB2 Express-C 平台。遵循本文提供的说明步骤,快速启动和配置 AMI 以在 Amazon EC2 中使用它们。
通过 WebSphere sMash 的 ZRM,您可以关注数据、数据关系以及如何更好地向用户显示这些关系,而不是关注数据库通信的低级方面。将这些优点和 DB2 Express-C 提供的健壮、响应性强并且全面的数据库功能结合起来,您就可以通过浏览器交付丰富的、面向数据的用户体验。