手机是一种无处不在的工具,大部分人几乎总是将它带在身边。要在当今市场上保持竞争力,您的公司需要利用移动技术。在本系列中,学习如何使用 DB2 Adapter for z/OS Connect 和 IBM MobileFirst Developer Edition 构建一个 DB2 for z/OS 移动应用程序。在第 1 部分中,了解如何使用 DB2 Adapter for z/OS Connect 公开 DB2 for z/OS 功能。
这个由两部分组成的文章系列将介绍如何使用 DB2 Adapter for z/OS Connect 和 IBM MobileFirst Developer Edition 构建一个 DB2 for z/OS 移动应用程序。第 1 部分将介绍如何使用 DB2 Adapter for z/OS Connect 公开 DB2 for z/OS 功能。第 2 部分将演示如何通过使用您在第 1 部分中创建的 DB2 Adapter 服务,使用 IBM MobileFirst Developer Edition 构建一个移动应用程序。
DB2 for z/OS 常用于存储关键事务数据。银行、零售、保险和政府行业的大量数据交易都发生在 DB2 for z/OS 上,这离不开它的服务质量、高可用性、安全性和性能。
IBM MobileFirst Platform 为移动应用程序提供了一个集成的开发和测试环境。该开发环境将多组工具、框架和代码库组合到单个开发环境中,为用户提供了单一的代码库进行开发和维护。
z/OS Connect 提供了一种通用方法,使用 REST 和 JSON 技术与所有 z/OS 业务和基础架构资产进行交互。它使前端不需要知道访问后端系统所需的任何数据转换。与此同时,它还使后端系统不需要知道 RESTful URI 和 JSON。
图 1 是我们将要实现的移动解决方案的简化架构。该移动应用程序访问 MobileFirst 中的 HTTP Adapter,它调用一个 REST API(由 DB2 Adapter for z/OS Connect 公开)在 DB2 for z/OS 中执行 SELECT。
本文中的场景使用一个正则 SQL 语句从 SYSIBM.SYSXMLSTRINGS 表中的字符串 ID 检索一个字符串。SYSIBM.SYSXMLSTRINGS 是一个目录表,包含 XML 存储中使用的字符串与字符串 ID 之间的映射。清单 1 是 SYSIBM.SYSXMLSTRINGS 目录表的示例输出(您可能在自己的 DB2 系统中看到不同的值)。
SELECT STRINGID, SUBSTR(STRING,1, 35) AS STRING FROM SYSIBM.SYSXMLSTRINGS STRINGID STRING 1001 product 1002 description 1003 name 1004 detail 1005 http://www.w3.org/2000/xmlns/ 1006 space 1007 http://posample.org 1008 pid 1009 details 1010 price 1011 weight
图 2 演示了 z/OS Connect 的架构和一个对 z/OS Connect 的请求的工作流(修改自IBM 知识中心 中的一个图)。
简言之,z/OS Connect 是 WebSphere® Liberty 配置文件内的一个 servlet。它接受包含 JSON 有效负载的 RESTful URI,为后端系统(在本例中为 DB2 for z/OS)转换该数据,向 DB2 发送请求,然后将结果发送回客户端。它还提供了两项重要的服务:
DB2 Adapter for z/OS Connect 在 z/OS Connect 和 DB2 for z/OS 之间提供这些服务。它允许开发人员访问 DB2 for z/OS 来调用 SQI 语句和存储过程。
要运行此场景,您需要安装以下软件:
假设您已经使用 db2AdapterServer 模板在 WLP_USER_DIR(=/tmp/usr) 下创建了一个名为 test
的服务器。/tmp 目录是临时的,会在一次初始程序加载 (IPL) 后删除,但它对开发和单元测试用途很有用。如果您希望创建和配置一个持久性的 WebSphere Liberty Profile (WLP) 服务器,那么您可能希望使用以下类似设置:WLP_USER_DIR=/u/db2wlp/usr。
以下命令使用 db2AdapterServer 创建了一个名为 test 的新 Liberty 配置文件服务器。
server create test --template=db2zAdapterServer
在此场景中,我们使用
为了简便起见,我们使用用户 ID、密码列表和 Liberty 配置文件生成的一个服务器证书来实现 SSL 加密,以便完成身份验证。这里没有使用 SAF。
下面是 db2zAdapterDataSources.xml 内的 DB2 信息:
<db2zadapter_db2zAdapterDataSource id="db2zAdapterDataSource" databaseName="STLEC1" serverName="dtec207.vmec.svl.ibm.com" portNumber="446" driverType="4" user="sysadm" password="mypassword" trustedContext="false" maxPoolSize="40" maxStatements="0" accountingInterval="COMMIT" />
成功启动服务器后,您会在 /tmp/usr/servers/test/logs/console.log 中看到以下类似信息:
[AUDIT ] CWWKT0016I: Web application available (default_host): http://dtec207.vmec.svl.ibm.com:9180/
如果使用浏览器访问 http://dtec207.vmec.svl.ibm.com:9180/zosConnect/services,那么您可能看到以下类似信息。这是默认部署服务。记下部署服务 HTTPS 端口(在本例中为 9443),因为您将需要此信息来使用 IBM Data Studio Client 配置 Web 服务。
{"zosConnectServices":[{ "ServiceName":"DB2zAdapterDeploymentService", "ServiceDescription":"Deploy a new DB2 Adapter service or delete an existing DB2 Adapter service", "ServiceProvider":"db2zadapter-1.0", "ServiceURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/ DB2zAdapterDeploymentService"}]
IBM Data Studio 客户端提供了开发工具来创建、部署或解除部署 DB2 Adapter 服务。Data Studio 4.1.2(和更高版本)支持 DB2 Adapter for z/OS Connect。我在本文中使用了 Data Studio 客户端 4.1.2。
如果您希望使用您的浏览器启动或测试 DB2 Adapter 服务,则需要为您的浏览器安装 REST 客户端。
1. 启动 Data Studio 客户端,单击右上角的 Open Perspective 来打开 IBM SQL and Routine Development 透视图。
2. 单击 Open Perspective GUI 中的 IBM SQL and Routine Development 。
打开的透视图在 GUI 的左上角包含 Data Project Explorer (DPE) 视图,在 GUI 的左下角包含 Data Source Explorer (DSE) 视图。
3. 在 DSE 中,右键单击 Database Connections 并选择 New 。
4. 在 New Connection GUI 中,完成以下步骤:
5. 单击 Test Connection 按钮。您会看到一个显示 “Connection succeeded” 的弹出窗口。
6. 选择 z/OS Connect Server (位于 New Connection GUI 的底部),然后单击 Next 按钮。
7. 在图 6 中所示的 z/OS Connect Server Parameters GUI 中,完成这些步骤:
8. 在 Data Source Explorer 下,您会看到已经创建了一个新数据库连接(在本例中为 STLEC1)。
1. 在 Data Project Explorer 中,选择 Click to create a new data development project ,如下所示。
2. 在 New Data Development Project 中,指定一个项目名称 (Project1),然后单击 Next 按钮。
3. 在 Select Connection Profile 下,指定您刚创建的连接(也就是 STLEC1)。然后单击 Finish 按钮。
应在 Data Project Explorer 下创建一个名为 Project1 的新项目。
4. 右键单击 Web Services 并选择 New Web Service 来展开 Project1。
5. 在 New Web Service GUI 中,选择一个项目 (Project1) 并指定一个 Web 服务名称 (GetXMLString)。然后单击 Finish 。
应在 Web Services 文件夹下创建一个名为 GetXMLString 的新 Web 服务。
6. 在 Project1 下,右键单击 SQL Scripts 并选择 New > SQL or XQuery
7. 在 New SQL or XQuery Script 中完成以下步骤:
8. 打开编辑器。输入以下 SQL 语句:
SELECT SUBSTR(STRING, 1, 60) as STRING FROM SYSIBM.SYSXMLSTRINGS WHERE STRINGID= ?
9. 要运行此 SQL 语句,请右键单击 GetXMLSting.sql > Run SQL 。
10. 假设您想找到字符串 ID 等于 1006 的 XML 字符串,在 Specify Host Variable Values 中输入 1006 。单击 Finish 。
您会在右下侧的 SQL Results 标记下看到结果。在下面的屏幕截图中,字符串 ID 1006 对应的字符串为 “space”。请注意,根据 SYSIBM.SYSXMLSTRINGS 表中的映射,您可能看到不同的结果。
11. 要将 SQL 脚本与 Web 服务相关联,可将新 SQL 脚本 (GetXMLString.sql) 拖到 GetXMLString* 上(在 Web Services 下)。在执行此操作后,您会在 Web Services>GetXMLString* 下看到 GetXMLString,如图 15 所示。
要部署新服务,请右键单击 Web Services>GetXMLString* ,然后选择 Deploy on z/OS Connect Server 。
在成功部署后,您悔看到一个弹出窗口:The service 'GetXMLString' is deployed successfully。
您可能会在 /tmp/usr/servers/test 目录中找到以下条目。
-rw-r----- 1 SYSADM OMVSGRP 438 Dec 20 10:49 db2zAdapterUserDefinedServices.xml drwxr-x--- 2 SYSADM OMVSGRP 8192 Dec 20 10:49 db2zAdapterServicesBackup -rw-r--r-- 1 SYSADM OMVSGRP 1349 Dec 20 10:49 GetXMLStringConfig.xml
DB2 Adapter 使用 z/OS Connect 授权和验证用户执行特定任务的权限。如果使用浏览器或 REST 客户端测试和查询 DB2 Adapter 服务,系统会提示您提供一个用户名和密码。您可能还需要接受来自 DB2 Adapter Service 的 SSL 证书。
1. 在浏览器中访问 https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services。您会看到刚创建和部署的 GetXMLString 服务的信息(已在下方突出显示)。您可能还会看到一个弹出窗口,表明这是一个来自 DB2 Adapter 服务的无法识别的 SSL 证书。
{ "zosConnectServices": [{ "ServiceName": "DB2zAdapterDeploymentService", "ServiceDescription": "Deploy a new DB2 Adapter service or delete an existing DB2 Adapter service", "ServiceProvider": "db2zadapter-1.0", "ServiceURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/DB2zAdapterDeploymentService" }, { "ServiceName": "GetXMLString", "ServiceDescription": "Get XML string from string id", "ServiceProvider": "db2zadapter-1.0", "ServiceURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString" }] }
2. 要检索 GetXMLString 服务的细节,可使用浏览器访问以下 URL:https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString。
您可能看到以下输出(为了方便阅读,我们对部分内容进行了重新格式化)。
{"zosConnect":{ "serviceName":"GetXMLString", "serviceDescription":"Get XML string from string id", "serviceProvider":"db2zadapter-1.0", "serviceURL":"https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString", "serviceInvokeURL":"https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/ GetXMLString?action=invoke", "dataXformProvider":"DATA_UNAVAILABLE"}, "GetXMLString":{ "DB2zAdapterServiceName":"GetXMLString", "DB2zAdapterServiceStatus":"Stopped", "DB2zAdapterService":{ "RequestSchema":{ "$schema":"http://json-schema.org/draft-04/schema#", "type":"object", "properties":{ "1":{ "type":["null","integer"], "multipleOf":1, "minimum":-2147483648, "maximum":2147483647, "description":"Nullable INTEGER" } }, "required":["1"], "description":"Service GetXMLString invocation HTTP request body" }, "ResponseSchema":{ "$schema":"http://json-schema.org/draft-04/schema#", "type":"object", "properties":{ "ResultSet Output":{ "type":"array", "items":{ "type":"object", "properties":{ "STRING":{ "type":"string", "description":"CHARACTER" } }, "required":["STRING"], "description":"ResultSet Row" } }, "StatusDescription":{ "type":"string", "description":"Service invocation status description" }, "StatusCode":{ "type":"integer", "multipleOf":1, "minimum":100, "maximum":600, "description":"Service invocation HTTP status code" }, "DiagnosticsCodes":{ "type":"array", "items":{ "type":"integer", "multipleOf":1, "minimum":-99999, "maximum":99999, "uniqueItems":true, "description":"Service invocation diagnostic code" } } }, "required":["ResultSet Output","StatusDescription","StatusCode"], "description":"Service GetXMLString invocation HTTP response body" } } } }
3. 要查询 GetXMLString 服务的状态,可使用浏览器访问以下 URL:https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString?action=status
您可能看到以下输出:
{ "zosConnect": { "serviceName": "GetXMLString", "serviceDescription": "Get XML string from string id", "serviceProvider": "db2zadapter-1.0", "serviceURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString", "serviceInvokeURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/ GetXMLString?action=invoke", "dataXformProvider": "DATA_UNAVAILABLE", "serviceStatus": "Stopped" } }
4. 要启动 GetXMLString 服务,您需要通过 REST 客户端发送一个 POST 请求。
POST https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString?action=start
(请确保您使用了 https 和安全端口 9443,http 和端口 9180 无法启动 DB2 Adapter 服务。)
您可能看到以下输出:
{ "zosConnect": { "serviceName": "GetXMLString", "serviceDescription": "Get XML string from string id", "serviceProvider": "db2zadapter-1.0", "serviceURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString", "serviceInvokeURL": "https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/ GetXMLString?action=invoke", "dataXformProvider": "DATA_UNAVAILABLE", "serviceStatus": "Started" } }
5. 要调用 GetXMLString 服务,需要通过 REST 客户端发送一个 POST 请求,如所示。
POST https://dtec207.vmec.svl.ibm.com:9443/zosConnect/services/GetXMLString?action=invoke
指定以下 HTTPS 标头字段:
要找到字符串 ID 等于 1006 的 XML 字符串,可在 HTTPS 请求主体中指定该条件,如图 16 所示。
您可能看到以下输出(为方便阅读,我们进行了重新格式化)。从以下结果可以看到,字符串 ID 为 1006 的 XML 字符串为 “space”。
{"ResultSet Output": [{"STRING":"space"}], "StatusDescription":"Execution Successful", "StatusCode":200 }
如果您的 SSL 证书的 CN 名称为 localhost,那么您可能希望生成一个包含您的 DB2 服务器的实际主机名的 SSL 证书。可使用 securityUtility
命令完成此任务。
securityUtility
命令: securityUtility createSSLCertificate --server=<server_name> --password=<password> --validity=365 --subject=CN=<hostname>,O=<company>,C=<country>
在我的示例中,该命令类似于:
securityUtility createSSLCertificate --server=test --password=mypassword --validity=365 --subject=CN=dtec207.vmec.svl.ibm.com,O=IBM,C=US
您可能看到以下输出:
要启用 SSL,请将以下行添加到 server.xml 中。
<featureManager> <feature>ssl-1.0</feature> </featureManager> <keyStore id="defaultKeyStore" password="{xor}PG87Oiw3MC8=" />
4. 使用新密码更新 /tmp/usr/servers/test/sslServerCertificate.xml(在本例中为 {xor}PG87Oiw3MC8=)
本文介绍了如何创建、部署、查询、启动和测试 DB2 Adapter 服务。希望您能够理解本文中的内容。在第 2 部分中,我们将介绍如何从移动应用程序调用这个 REST API。
感谢 Tom Toomire 和 Xavier Yuen 为本文提供的评论和帮助。