在本教程系列的前 3 个部分中,学习了如何将 Java™ Web 应用程序和独立 Java 应用程序迁移到 IBM® Bluemix®。在第 4 期中,将介绍如何将一个在 Bluemix 中运行的 Java Platform, Enterprise Edition 应用程序与一个在 Bluemix 外运行的关系数据库相连接。通常,将会使用该架构将托管在云中的企业应用程序连接到托管在私有数据中心中(内部部署)的企业记录数据库。您的 Java 应用程序可实现云计算的操作效率,并且数据库仍保留在数据中心中,以便其他应用程序可以在本地访问它。
本教程的练习是构建一个将现有 Bluemix 应用程序连接到模拟的内部部署数据库的简单解决方案:
将 Secure Gateway 安装在 Bluemix 和一个在 Bluemix 托管的虚拟机中运行的模拟企业数据中心中。然后配置该网关,将示例 Java 应用程序连接到在模拟的数据中心内运行的 MySQL 数据库。该 Java 应用程序提供了一个 UI 来处理数据库中的数据,它将在 Bluemix 中的 Liberty for Java 运行时中运行。
我们将重点介绍如何配置和使用 Secure Gateway,而不是介绍应用程序或数据库的复杂性。
ssh
连接到托管在 Bluemix 中的虚拟机。请安装此列表中的所有工具,然后再继续执行教程中的步骤。
“您的 Java 应用程序可实现云计算的操作效率,并且数据库仍保留在数据中心中,以便其他应用程序可以在本地访问它。 ”
在这一步中,您将设置示例应用程序和数据库,并将该应用程序部署在本地来测试它。对于 Java 应用程序,您将使用一个包含在 Bluemix Java DB Web Starter 样板 中的现有应用程序。您将在 Bluemix 中创建一个虚拟机 (VM) 来模拟私有数据中心,将 Docker 容器管理器安装在该 VM 中,然后将一个 MySQL 实例(使用该 Java 应用程序需要的数据库(包括示例数据)来初始化)安装在该 VM 中。然后,您将示例应用程序代码导入 Eclipse 中,并将 Eclipse 项目部署到本地 Liberty 服务器。
登录到 Bluemix 并单击右上角的 Account and Support 按钮:
您的所有 Bluemix 工件(一个虚拟机、一个 Java for Liberty 运行时和两个服务实例)都是在
hybrid-cloud
空间中创建的。在完成本教程并希望将这些工件的资源用于其他用途时,可以删除该空间。
将您的活动地区更改为 United Kingdom 地区。(默认的 Bluemix 地区是 US South 地区,但 IBM
Virtual Machines beta 环境只能用于 UK 地区。)创建一个名为 hybrid-cloud
的新空间。
阅读:在公共云中创建一个 VM
备注:这些指令将使用 UNIX®/Linux® 命令。在 Windows 中,可使用 Git Bash 运行 Linux 命令,或者使用 PuTTYgen 生成 SSH1 (RSA) 密钥,并使用 PuTTY 通过 SSH 连接到 VM。本教程将介绍 Bash 命令。
todo
的 SSH
密钥对(私钥文件:todo.key;公钥文件:todo.key.pub):ssh-keygen -t rsa -f
todo.key
属性 | 值 | 是否默认值 |
---|---|---|
Location | IBM Cloud Public | 默认值 |
Select image | (从 Existing 列表选择):Debian 8.0 | 默认值 |
Name | your_initials_To_Do | |
Type | Single | 默认值 |
Size | c1.m4.s20 | 默认值 |
Network | private | 默认值 |
Assign public IP address | 选择 (yes) | |
Security Key | todo | |
Security Group | allow_all | 默认值 |
todo
密钥。(在 UNIX 中,运行
cat todo.key.pub
来显示该密钥,以便可以将它复制并粘贴到 Bluemix 中。)ssh -i todo.key ibmcloud@虚拟机的 IP
地址
您现在已有一个正在运行的 Linux VM,您可以登录它。
稍后您会看到,Secure Gateway 包含一个必须安装在数据中心中的客户端。要安装的最简单的客户端实现是 IBM 打包为 Docker 容器的实现(在 Secure Gateway 中称为 Docker 客户端)。您的 VM 需要安装 Docker 运行时,以便您可以在以后安装这个 Secure Gateway 客户端。(您的 VM 需要运行 Docker 运行时的另一个原因是,这样做它才能运行 MySQL 容器。)
在 Debian 中执行必要的操作,您可能获得以下错误:E:The method driver
/usr/lib/apt/methods/https could not be found.N:Is the package
apt-transport-https installed?
要修复此问题,可运行 sudo apt-get
install apt-transport-https
。
sudo docker run hello-world
hello
world
成功运行(在输出中查找 Hello from Docker
),那么您的 VM 已安装并正确运行
Docker 运行时。保持登录到 VM 的状态。
要模拟一个企业记录数据库,可以使用包含一个小型的、简单的数据集的 MySQL 数据库。要初始化该数据库,需要一个模式文件和一个数据文件。首先让我们来创建这些文件,然后安装 MySQL。
mkdir ~/liberty-sql
cd
~/liberty-sql
DROP SCHEMA IF EXISTS todo; CREATE SCHEMA todo; USE todo; CREATE TABLE 'TODOLIST' ( 'L_ID' INT(8) DEFAULT NULL, 'C_NAME' VARCHAR(254) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
USE todo; INSERT INTO 'TODOLIST' ('L_ID','C_NAME') VALUES (1, "sample entry #1"); INSERT INTO 'TODOLIST' ('L_ID','C_NAME') VALUES (2, "sample entry #2"); INSERT INTO 'TODOLIST' ('L_ID','C_NAME') VALUES (3, "sample entry #3");
ls -l /home/ibmcloud/liberty-sql/
来确认您已将这些文件放在正确的目录中。您希望输出类似于:-rw-r--r-- 1 ibmcloud ibmcloud 227 Jan 1 12:00 todo-data.sql -rw-r--r-- 1 ibmcloud ibmcloud 190 Jan 1 12:00 todo-schema.sql
您现在已拥有在创建 Docker 容器时初始化数据库所需的模式和数据文件。保持登录到 VM 的状态。
sudo docker run -d --name
mysql-tutum -p 3306:3306 -v /home/ibmcloud:/home/ibmcloud -e
MYSQL_PASS=passw0rd -e
STARTUP_SQL="/home/ibmcloud/liberty-sql/todo-schema.sql
/home/ibmcloud/liberty-sql/todo-data.sql" tutum/mysql
-d
在后台运行容器,而不是交互式运行。mysql-tutum
是为从镜像创建的容器提供的名称。3306:3306
转发 MySQL 端口,以便可从主机 SO 的 IP 地址访问它。/home/ibmcloud:/home/ibmcloud
绑定该目录,已在容器中包含的主机 OS
中创建该目录。MYSQL_PASS
设置数据库的主要用户的密码,在本例中为 passw0rd
。STARTUP_SQL
告诉容器按照通过该空格分隔的列表指定的顺序运行 SQL 文件。tutum/mysql
是将用来创建该容器的 Docker 镜像的名称。sudo docker ps
来证明 MySQL
容器正在运行。查找以下类似输出:CONTAINER ID IMAGE STATUS NAMES dd1234567890 tutum/mysql Up 28 seconds mysql-tutum
您现在已有一个名为 mysql-tutum
的正在运行的 Docker 容器。该容器中运行着一个绑定到端口 3306 的 MySQL
数据库服务器。该数据库服务器包含一个名为 todo
数据库,其中包含一个名为 TODOLIST
的表,该表包含一个
To Do 列表中的一组项目的示例数据。
您需要一个连接到 SQL 数据库的 Java 应用程序。无需从头创建该应用程序,可使用通过 Bluemix 中的 Java DB Web Starter 样板创建的一个应用程序实例。
hybrid-cloud
空间。your_initials-java-sql
(或者不使用您的首字母,而是使用其他 ID
让应用程序的名称唯一)。保留其他设置的默认值并单击 CREATE。来自 Bluemix 的入门代码被轻松打包为一个 Eclispe 项目。按照前面的 “阅读” 链接中的 Eclipse 文档的指示将该项目导入 Eclipse 中,以便您可以检查示例应用程序的代码。选择 Select archive file 作为导入类型,然后浏览到并选择您下载到本地系统的入门代码 .zip 文件。
该导入会在 Eclipse 中创建 JavaDBApp
项目。
除了使用 Eclipse 编辑应用程序代码之外,还可以使用它将示例应用程序部署到您的 Liberty 服务器并运行该应用程序。
按照前面的 “阅读” 链接中的 Eclipse 文档操作,使用 JavaDBApp
作为要添加的项目,使用 wlp-8.5.5.8
defaultServer at localhost
作为用来添加它的服务器。
Servers 视图现在显示了与该服务器有关联的项目。
此刻,您可以启动该服务器并启动其中的应用程序,然后打开该应用程序的 GUI 来测试它。但这么做还没有太多意义,因为该应用程序未连接到数据库;您会看到 “Error” 而不是 To Do 列表。
在这一步中,将设置一个本地 Liberty 服务器来连接到 MySQL,并通过该连接测试该应用程序。
现在,在 Eclipse 中,修改 Liberty 服务器的服务器配置(WebSphere Application Server Liberty 配置文件),以添加 MySQL 数据库的数据来源和设置应用程序的上下文根:
<jta-data-source>java:comp/env/jdbc/mydbdatasource</jta-data-source>
<fileset>
被配置为查找 MySQL 驱动程序
JAR):<dataSource jndiName="jdbc/mydbdatasource"> <jdbcDriver libraryRef="mysql-connector"/> <properties URL="jdbc:mysql://hostname:port/todo?relaxAutoCommit=true" user="user" password="password"/> </dataSource> <library id="mysql-connector" name="MySQL Connector" description="MySQL JDBC Driver"> <fileset id="mysql-connector-jar" dir="${server.config.dir}/lib" includes="mysql-connector-java-*.jar"/> </library>
URL
属性的值中,替换以下变量:hostname
(托管 MySQL 数据库的 VM 的 IP 地址):虚拟机的
IP 地址
port
(您创建 MySQL 容器时设置的端口):3306
user
(MySQL 容器中的默认用户):admin
password
(您创建 MySQL
容器时设置的密码):passw0rd
<webApplication id="liberty-IRDS" name="liberty-IRDS" location="liberty-IRDS.war" context-root="/"/>
正如 Console 视图中所解释的,访问该应用程序的 URL 是 http://localhost:9080/。该服务器现在已配置了一个用于访问该数据库的数据来源,而且设置了应用程序的上下文根。
现在运行该应用程序,确认它已正确连接到 MySQL。在 Eclipse 中:
该应用程序现在正在本地运行,并使用虚拟机中的 MySQL 数据库。
在这一步中,将配置一个 Secure Gateway 来连接到 MySQL 数据库,并配置该应用程序来使用该网关。
在 Secure Gateway 服务中创建一个实例,然后使用它在该网关中配置一个网关和一个目标 — 在虚拟机中运行的 MySQL 数据库。
在 Bluemix 仪表板中:
hybrid-cloud
空间。My Data Center
。清除这些选项,以便使用令牌: 属性 | 值 |
---|---|
Destination name | To Do Database |
Hostname or IP address | 虚拟机的 IP 地址 |
Port | 3306 |
Transport | TCP |
属性 | 值 |
---|---|
Name | To Do Database |
Destination ID | aaaA0AAAA00_vfY |
Cloud Host :Port | cap-sg-prd-1.integration.ibmcloud.com:15000 |
Destination Host :Port | <虚拟机的 IP 地址>:3306 |
Created by | John Doe at 7/1/2015, 12:05:00 PM |
Last modified by | John Doe at 7/1/2015, 12:05:01 PM |
您已配置了一个用于访问该数据库的网关和目标。
网关需要一个部署在托管数据库的数据中心中的客户端。网关客户端需要具有访问数据中心中运行的数据库以及在 Bluemix 中运行的网关的网络访问能力。通常,网关客户端安装在连接到与数据库主机相同的网段(子网或 VLAN)的主机,而且该网段被连接到互联网(或与 Bluemix 的另一个网络连接)。
网关客户端可在主机本地、在 Docker 容器中或在 IBM DataPower® 中运行。您使用 Docker 容器并将它部署到模拟数据中心的 VM,该 VM 安装了 Docker 运行时。
首先,获得网关客户端的 Docker 连接命令。在 Bluemix 仪表板中:
docker run -it
ibmcom/secure-gateway-client gateway ID
其次,在 VM 中安装并运行网关客户端:
ssh -i
todo.key ibmcloud@虚拟机的 IP 地址
sudo docker run hello-world
sudo docker run -it
ibmcom/secure-gateway-client 网关 ID
网关客户端现在正在运行并显示它已连接,而且 Gateway 页面显示该网关已连接。用于运行客户端的 shell 现在被附加到容器上并运行网关客户端的 shell,后者会在建立连接和断开连接时显示。
网关客户端配置了一个访问控制列表 (ACL),用于指定允许和拒绝哪些主机名-端口组合。默认情况下,在新创建的网关客户端中,ACL 是空的,所以所有主机名-端口组合都会被阻止。这是一项安全功能:即使 Bluemix 中的网关的管理员决定开始访问某个新目标,该访问也会被阻止,除非该网关客户端的管理员将该目标的主机名-端口组合添加到客户端的 ACL 中。
配置网关客户端的 ACL,以便允许网关连接到目标:
cli> show acl [2016-01-01 12:00:00.000] [INFO] (Client PID 1) There are no Access Control List entries, the ACL Deny All flag is set to: true
cli> acl allow 159.122.240.100:3306 cli> show acl ------------------------------------------------------------------ -- Secure Gateway Client Access Control List -- hostname port value virtual machine's IP address 3306 Allow ------------------------------------------------------------------
网关客户端中的 ACL 现在已配置为允许网关连接到 虚拟机的 IP 地址:3306
上的目标。
现在,您的 Secure Gateway 服务实例已配置了一个网关和目标来连接到 MySQL 数据库,您需要修改该应用程序来使用该网关目标。如果检查目标的配置(单击 My
Data Center 网关页面上显示为包含 i 的圆圈的信息按钮),就会看到它包含 Cloud Host:Port 的值,在本例中为
cap-sg-prd-1.integration.ibmcloud.com:15000
。这是应用程序用于通过网关目标访问数据库的
URL。
在 Eclipse 中,就像您在 “针对 MySQL 配置服务器” 中所做的一样,修改 Liberty 服务器的服务器配置,以更新数据来源来使用网关目标的 URL:
hostname
(网关目标的云主机):cap-sg-prd-1.integration.ibmcloud.com
port
(网关目标的云端口)15000
user
(未更改):admin
password
(未更改):passw0rd
从 Console 视图可以看到,Liberty 服务器自动更新了新配置。
在浏览器中访问 http://localhost:9080/ 来运行该应用程序。将打开该应用程序的 Java DB Web Starter 窗口,并将显示 To Do 列表数据。在登录到虚拟机的 shell 中,查看网关客户端的 CLI 中的日志。如果日志显示打开了一个新连接,那么可以确认这个本地应用程序正通过网关连接到数据库。
现在本地应用程序在使用网关时已经能够正常工作,您已经准备好将应用程序部署到 Bluemix,并确认它能在这里正常工作。
要在 Bluemix 上运行应用程序,您需要部署应用程序(它的 JavaDBApp.war 文件)和它的服务器配置(服务器的 server.xml 文件和数据库驱动器 mysql-connector-java-5.1.35-bin.jar)。将服务器和应用程序打包在一起并部署这个包。可以从命令行或使用 Eclipse Tools for Bluemix 执行此过程。在这里,我展示如何通过命令行打包和推送服务器(这将帮助您理解 Eclipse 工具执行的步骤)。
阅读:创建 Web 应用程序:使用 Liberty for Java 创建应用程序:推送 Liberty 应用程序的选项(“打包应用程序” 部分)
阅读:CLI 和 Dev Tools:使用 IBM Eclipse Tools for Bluemix 部署应用程序:打包服务器支持
wlp/bin/server stop defaultServer
wlp/bin/server package defaultServer
--include=usr
cf login -a API_URL
-u username -o org -s
hybrid-cloud
API_URL
是 Cloud Foundry
提供程序的 URL,它是 Bluemix(https://api.ng.bluemix.net 表示 US
South,https://api.eu-gb.bluemix.net 表示 United
Kingdom)。username
和 org
通常都是您的电子邮件地址。cf push appname -p
wlp/usr/servers/defaultServer/defaultServer.zip
appname
是您希望应用程序在 Bluemix 中拥有的名称。该名称必须是唯一的,这样它的路由才会是唯一的。通常,需要花一两分钟的时间上传该应用程序,并花几分钟时间启动它。在 Cloud Foundry CLI 显示该应用程序已启动和 Bluemix 仪表板显示该应用程序正在运行时,部署就完成了。
应用程序在 Bluemix 中运行后,检查它来确认您的服务器配置已成功上传。在 Bluemix 仪表板中:
URL
属性包含在
cap-sg-prd-1.integration.ibmcloud.com
部分中。现在您已确认不仅应用程序已部署到 Bluemix 上,它的服务器配置也已部署。
在 Bluemix 中运行该应用程序,并确认它已通过网关正确连接到 MySQL。要运行该应用程序,请在您的浏览器中访问 http://应用程序名称.mybluemix.net。将打开该应用程序的 Java DB Web Starter 窗口,并显示 To Do 列表数据。在登录到虚拟机的 shell 中,查看网关客户端的 CLI 中的日志。如果日志显示打开了一个新连接,那么可以确认这个 Bluemix 应用程序能够通过网关连接到数据库。
在本教程中,您将一个 Java 应用程序和它的服务器配置部署到了 Bluemix,并使用 Secure Gateway 将该应用程序连接到一个在 VM 中运行的 MySQL 数据库。如果使用运行企业记录数据库的私有数据中心取代 VM,那么可以通过几乎完全相同的方式连接该应用程序和 Secure Gateway。
BLUEMIX SERVICES USED IN THIS TUTORIAL: