内容


使用 Bluemix 将 Java 应用程序迁移到混合云,第 1 部分

将 Tomcat 迁移到 Bluemix Cloud Foundry 运行时

您对 “在云中” 运行 Java™ 应用程序感兴趣?但是考虑到企业应用程序的现实,您不确定从何处开始?在本系列中,我们将讨论分层混合应用程序的不同选项,指导您逐步掌握几个示例。我们将解释如何迁移 Java 应用程序的各个部分,同时连接到最好留在您企业内的组件。此外,我们还将讨论 Java 运行时、服务和工具的不同选项。

本系列专注于 Java 应用程序和它使用的服务,以及您如何将 Java 应用程序和关系数据库层迁移到基于 Cloud Foundry 的平台。我们还会介绍将服务留在内部的场景,以及在迁移到云时,可能需要针对会话管理、扩展和日志记录而执行的应用程序更改。

Java 应用程序

在评估一个要迁移到云的应用程序时,通常的起点是应用程序本身。在整个过程中,您需要理解以下方面:

  • 您的应用程序使用了哪些 Java 功能?
  • 它需要哪些外部服务和依赖关系?
  • 您的应用程序是否是云就绪的?
  • 您愿意投入多大精力来为云更新您的应用程序?
  • 您愿意投入多大精力来更新管理过程?

简单的 Tomcat 风格的 servlet 和 jsp 应用程序通常很容易迁移到云中,而且您可以选择不同的运行时和服务选项。但是,即使是简单的应用程序,也有可能需要您考虑如何处理数据库等服务,以及在需要扩展时,如何处理会话亲缘性。我们的第一个示例是逐步迁移 Tomcat 应用程序,包括数据库。然后分析在云中运行 Java 工作进程的问题。在以后的教程中,我们将分析云中的扩展和会话亲缘性问题。

如果您的应用程序使用了 Remote EJB、2 阶段提交处理和其他更高级的特性,您的迁移选项可能更有限(或成本更高)。我们将讨论将应用程序迁移到云中的不同可用选项。

如果您不确定应用程序的准确用途和需求,这些逐步指导会帮助您使用一个迁移工具来进行分析。(即使您认为 自己知道应用程序的用途和需求,也推荐您使用此工具!)

本系列的第一篇教程将解释如何将示例 Java 应用程序迁移到云中,并连接到一个基于云的 SQL 数据库。

Java 运行时

在云中运行 Java 应用程序有多种选择。一种选择是使用平台即服务 (PaaS) 所提供的 Java 运行时,比如 IBM Bluemix™ 中的 Liberty for Java 运行时。这是一条容易实现的途径,因为您只需关心您的应用程序。使用此选项,您只需部署您的应用程序,无需安装或维护 Java 运行时。IBM Bluemix 支持 Liberty for Java buildpack,该 buildpack 包含 Java EE 7 和 Liberty 配置文件。Cloud Foundry 的 Java buildpack(包含 Tomcat 8.0.21)也可以用在 Bluemix 上。本教程包含使用两种 buildpack 的逐步指导。

如果想要更多地控制 Java 运行时,或者如果应用程序需要使用 Liberty for Java Bluemix 运行时目前不支持的功能,您可以选择不同的基础架构即服务选项,在这些选项中,您可以控制和管理所安装的 Java 语言版本。在 IBM Bluemix 中,您可以选择一个 Docker 容器或一个虚拟机来运行 Java 运行时。这些方法提供了对运行时和版本的更多控制权。但是,伴随该控制权的是,您需要在安装和管理上花费更多的精力。

有关这三种运行时和它们的独特功能的更多信息,请参阅 “Bluemix 即时运行时、容器或虚拟机”。

服务

除了运行时之外,还要考虑的其他关键决策包括如何处理外部依赖项,比如数据库、消息系统和 LDAP 身份管理器。您可选择为这些依赖项使用云资源(例如使用云中的数据库即服务,比如 IBM Bluemix 上的 SQL Database)。或者您可选择将外部资源保留在内部,并使用 Secure Gateway 服务从您的应用程序连接到您目前使用的相同的依赖项。本系列包含两种方案的分步指导。

云应用程序考虑因素

在应用程序迁移到云中时,还需要理解它的设计,如果它不是以云为中心的,是否至少是 “云就绪的”。在迁移到云时,我们讨论的迁移工具将会扫描潜在的问题区域,包括状态管理和日志记录,以及其他需要考虑的常见项。在我们的示例中,我们将演示我们的应用程序的迁移场景,该应用程序使用了一个 HTTP 会话。但是,我们不会过于深入地分析针对云的设计,我们推荐您查阅专门针对该主题的最佳实践文章,比如 “关于云应用程序的 9 条重要规则” 和 纯英文表述的 12 因素应用程序

工具

IBM Bluemix 支持通过 Cloud Foundry、Docker 和虚拟机来部署应用程序,因此,无论您如何开发 Java 应用程序或选择何种部署运行时路径,都可以通过编程方式将应用程序推送到云中。我们的第一个示例使用了 Cloud Foundry 命令行。

如果使用 Eclipse,有许多插件有助于将应用程序迁移并部署到 Bluemix 上。迁移工具包插件分析您的应用程序源代码,为您提供一份报告和迁移到 Bluemix 的建议。还有一个插件用于部署到 Bluemix。第一个示例仅使用了命令行,在这之后,我们的所有工作都在 Eclipse 中完成,从导入和分析应用程序到执行更改和部署。尽管 Eclipse 不是必要的,但我们推荐使用它来处理 Java 应用程序。

将 Tomcat 应用程序迁移到 Bluemix Java 运行时

让我们开始吧。我们使用了一个在 Tomcat 上运行的示例应用程序 RedbookLibrary。这个应用程序来自 WebSphere Application Server v8.5 迁移指南,其中详细分析了从 WebSphere Full Profile、Tomcat、JBOSS 或 WebLogic 迁移到 Liberty 配置文件所涉及的考虑因素。我们对 Redbook 版本的数据库访问实践进行了一些修改,我们将它设置为使用本地 Apache Derby 数据库,所以一定要使用与本教程相关的应用程序版本。

进行一些初步设置后,就可以开始运行迁移分析工具了。然后将应用程序迁移到 Bluemix 上的 Liberty for Java 运行时,使用 Bluemix 中的 SQL Database 服务作为数据库,如下图所示。

该图显示了迁移步骤
该图显示了迁移步骤

构建您的应用程序需要做的准备工作

运行应用程序获取代码

第 1 步. 下载应用程序

在全系列中,我们提供了要使用的示例应用程序,我们推荐使用它们来熟悉这些步骤和工具。然后您可以对自己的应用程序执行相同的步骤。

  1. 示例 Tomcat 应用程序代码,也就是(包含我们的增强的)RedbookLibrary 代码是以 GitHub 存储库 的形式提供的。
  2. 从命令行对此存储库执行 git clone。我们将在创建的目录中进行操作:
    git clone https://github.com/kgb1001001/RedbookLibrary

第 2 步. 安装 Cloud Foundry API 工具

IBM Bluemix 支持 Cloud Foundry API。因此,您在如何开发 Java 应用程序方面拥有很高的灵活性。在本教程中,我们将展示如何使用该命令行。(对于已使用 Eclipse 或想要一种更加一体化的 IDE 体验的读者,第 2 部分将介绍如何使用 Eclipse,还将介绍 Liberty for Java Bluemix 迁移插件和 Bluemix 部署插件。)

  1. 从 GitHub 网站下载并安装 Cloud Foundry 命令行接口

第 3 步. 安装并运行命令行迁移分析工具

IBM 提供了迁移分析工具来帮助确定将应用程序迁移到 Bluemix 的难易程度。第一个工具是二进制评估工具,在这里,我们将从命令行运行它。第二个工具提供了更深入的分析,但需要使用源代码和 Eclipse,这些将在第 2 部分中介绍。

  1. 下载 二进制评估工具
  2. 输入 java -jar binaryAppScannerInstaller.jar 来安装该工具。
  3. 在安装该工具后,转到 wamt 子目录。
  4. 输入以下命令从 wamt 子目录运行分析:
    java -jar binaryAppScanner.jar \directory-containing-war-file

    该目录将为 <git_clone_location>\RedbookLibrary,比如 c:\\users\ibm_admin\RedbookLibrary。

    运行分析程序的命令行的屏幕截图
    运行分析程序的命令行的屏幕截图
  5. 前面的命令提供了高级技术分析结果(HTML 格式)。该屏幕截图显示了应用程序评估报告
    该屏幕截图显示了应用程序评估报告
  6. 接下来,可以在 HTML 中运行详细的分析报告,这会突出显示您在迁移到云时的潜在问题、文件和行号。它还包含处理这些问题的参考材料。在 wamt 子目录中输入:
    java -jar binaryAppScanner.jar \directory-containing-war-file --analyzeMigrationDetails --targetAppServer=bluemix显示正在运行的详细分析报告的命令行屏幕截图
    显示正在运行的详细分析报告的命令行屏幕截图

第 4 步. 通过分析结果来选择您的部署拓扑结构

二进制扫描器的技术预览版提供了应用程序的重要分析信息。

  1. 在 Application Evaluation Report(如上所示)中的 “Web application technologies” 下,我们看到此应用程序使用了 Servlet 和 JSP。当然,这对 Tomcat 应用程序而言并不奇怪。所有技术都将迁移到 Bluemix 上的 Liberty for Java,如第 1 列所示。
  2. 在 “Java EE-related specifications in Java SE” 下,我们看到该应用程序使用了 Java Database Connectivity (JDBC)。此应用程序还将在 IBM Bluemix 上的 Liberty for Java 中运输。但是,此高级分析显示,该应用程序使用了 JDBC,这表明我们需要决定如何处理数据库。
  3. 详细的分析为我们提供了更多的信息。(参见接下来的几幅图。)事实上,第一次看到时此报告时,可能有点令人害怕。幸运的是,标记的大多数区域都来自我们用于 Tomcat 的本地 Derby 数据库,而且不会在我们迁移到云中时应用。通过查看 File name 细节,很容易看到从 Derby 文件标记的规则。该屏幕截图显示了文件名细节示例
    该屏幕截图显示了文件名细节示例
  4. 使用 Derby 消除了来自这些文件的问题后,我们在云迁移中需要关注的规则是 Capture log information、HTTP session persistence 和 Use SQL Database service。 各个规则的详细结果的屏幕截图
    各个规则的详细结果的屏幕截图
  5. 对于数据库,我们推荐使用 Bluemix 中的 SQL Database 服务(参见下图)。在第 1 部分中,这就是我们要做的事。我们将使用 Bluemix 中的 SQL Database 服务来展示如何使用云中的数据库。在本系列后面,我们将展示如何使用 Secure Gateway 功能连接到现有的数据库。该屏幕截图显示了推荐使用 SQL Database 服务
    该屏幕截图显示了推荐使用 SQL Database 服务
  6. 该报告还表明应为我们的应用程序选择 Capture Log Information。查看帮助时,我们会看到:

    “Applications can log to System.err/System.out so that Cloud Foundry's Loggregator component picks up the log entries.Using Loggregator, you can tail application logs and dump a recent set of application logs.”

    在我们的应用程序中,我们使用了标准 Java 日志工具并将日志记录到默认位置,也就是 System.out。所以日志条目会自动被 Loggregator 拾取。

    该屏幕截图显示了 Capture Log Information
    该屏幕截图显示了 Capture Log Information
  7. 最后,报告会标记云中的会话持久性。我们需要关注这一项,但不是在第 1 部分中,在这里,我们不会执行任何集群操作。本系列后面的一篇教程将介绍会话缓存和集群。

第 5 步. 创建数据库服务

我们选择使用云中的数据库,所以接下来我们需要创建要使用的数据库服务。这可以通过 IBM Bluemix 仪表板或通过命令行完成。本教程将继续使用命令行。创建数据库后,我们部署应用程序并绑定到数据库。但在创建数据库之前,我们需要先来讲讲如何部署应用程序,以及它将如何使用数据库。

Cloud Foundry 中的一种最佳实践是在部署应用程序时使用所谓的 manifest.yml 文件。manifest.yml 文件类似于 Java JAR 或 WAR 文件中的清单文件的想法。其中的信息可以帮助 Cloud Foundry 工具理解您的应用程序是如何构造的。

清单是使用 YAML 编写的。您只需知道 YAML 的两个方面,即可阅读此文件:

  • 键和值使用冒号和空格分开。
  • 列表中的新元素由一个连字符和一个空格表示。

我们看看示例应用程序中提供的 manifest.yml 文件。

  1. 在您的 RedbookLibrary 目录中,打开 manifest.yml 文件。
    applications:
    - name: redbooklibrary
      memory: 512M
      path: RedbookLibrary.war
      host: redbook-library
      buildpack: liberty-for-java 
      services:
      - library_db
  2. 该清单表明 services: 列表中只有一个名为 library_db 的服务。要在应用程序中使用服务,需要在 Cloud Foundry 中执行两个步骤:(1) 创建一个服务实例(每个空间仅创建一次)和 (2) 将该服务实例绑定到应用程序(需要对空间中的每个应用程序都执行一次)。所以,对于此应用程序,我们需要创建一个名为 “library_db” 的服务。我们可以从 Cloud Foundry 命令行创建此服务。在命令行中,键入:
    cf login
  3. 我们将使用的数据库服务是 sqldb。我们创建一个服务实例来使用免费试用版计划,并将应用程序需要的服务命名为 “library_db”。
    cf create-service sqldb sqldb_free library_db
  4. 现在服务已创建(但还未绑定),如果您愿意的话,可以查看 Bluemix GUI 并确认可以将它用在您的空间中,或者您可以键入
    cf services
    并确认 “library_db” 位于为您的空间定义的服务列表中。

第 6 步. 将应用程序部署到云中

清单很重要的原因是,我们刚介绍的元素是您需要通过命令行参数或对 Cloud Foundry 命令行工具执行的其他命令定义的所有内容。通过将所有这些信息放在清单中,就无需在每次部署时都输入包含 cf push 的所有参数的长长的命令。相反,您只需将该信息放在 manifest.yml 中一次,就可以在每次部署时重用它。

我们希望我们的应用程序使用在 Bluemix 上新建的 library_db 服务,这意味着我们的应用程序需要正确配置。Liberty for Java buildpack 的一些不错的功能之一是,它能自动配置绑定的服务。这使得将应用程序迁移到 Bluemix 上的 Liberty for Java Buildpack 变得容易得多。

我们特意设置了我们的应用程序来利用自动配置功能。导致难以理解一些为 Bluemix 编写的 Java 示例的因素之一是,许多示例偏离了 JEE 编码最佳实践,没有使用自动技术。相反,它们利用了 Bluemix 中的程序可通过 Cloud Foundry 传入到每个运行时中的 VCAP_SERVICES 变量,接收绑定的服务的服务信息(URL、用户和密码)。因此,许多 Java 程序包含 IF 语句来寻找这些环境变量,然后根据这些变量中的值,将合适的参数设置为必要的服务调用代码(比如数据库驱动程序)。但是,这损害了 JEE 的设计方式的目的。

JEE 将这种细节外部化到一个外部应用服务器配置文件中(比如 WebSphere Liberty 配置文件中使用的 server.xml 文件),以便程序代码只需一个对服务的抽象引用(通过 JNDI)。例如,我们假设我们有一个希望访问 JDBC DataSource 的 servlet。在 JEE 中,这通常使用以下格式的 Resource 注释来完成:
@Resource(name = "jdbc/library_db")

在不是 JEE 对象的类中(例如 servlet 或 EJB),您可使用标准 JNDI 查找来获取引用:
(DataSource) ic.lookup("java:comp/env/jdbc/library_db");

现在,此方法与 Liberty 配置文件的关联之处是,Liberty Profile Buildpack for Bluemix 会通过为它为您创建的 Liberty 服务器编写一个 server.xml 文件,自动配置这些引用。该 server.xml 文件包含合适的代码段来执行绑定,为绑定到您的 Liberty 应用程序的每个服务自动创建以下格式的 JNDI 绑定:
<type, e.g. "jdbc">/service_name
因为我们使用该清单文件将 SQL Database 服务实例 “library_db” 绑定到了我们的应用程序,所以 Liberty buildpack 自动将该实例绑定到任何 @Resource 语句,或者绑定到上述类型的查找特定 JNDI 名称的 JNDI 查找。

Liberty buildpack 会自动与大量服务建立此连接。这些服务包括 SQL Database(我们已在本示例中使用)、MYSQL、PostreSQL、MQLight、Cloudant 及其他许多数据库和服务。要获得完整列表,请参阅 Liberty Buildpack 文档

所以好消息是,对于大部分使用 Java 代码编写的程序,您物需担心这些服务中的绑定!这大大简化了运行程序必须完成的一些操作。

要查看 Bluemix 如何为 Liberty 创建 server.xml 文件,可以选择一个部署在 Bluemix 中的 Java Liberty 应用程序,在仪表板中选择 Files and Logs,然后导航到 app/wlp/usr/servers/defaultServer/server.xml。

现在您已准备好部署应用程序了。因为我们使用了清单,所以部署很简单!

  1. 从命令行键入 cf push -n <NEWHOST>,其中 <NEWHOST> 是您为将提供应用程序的 “路由” 的定义。(路由等效于子域。例如,如果您使用了 redbook-library-abc,其中 abc 是您的姓名的首字母,那么您的应用程序将可以在 http://redbook-library-abc.mybluemix.net 上获得。)屏幕截图
    屏幕截图
  2. 您的应用程序已部署并自动绑定到 library_db 服务实例。您可以通过浏览器访问 http://<NEWHOST>.mybluemix.net 来访问正在运行的应用程序。您的应用程序应该类似于:该屏幕截图显示了应用程序的欢迎页面
    该屏幕截图显示了应用程序的欢迎页面

第 7 步. 测试您的应用程序

在理想情况下,您拥有自动测试案例,可以运行它们来验证应用程序能否工作。对于此应用程序,我们没有这么奢侈的条件,所以以下是确保它正常工作的步骤。

  1. 在浏览器中访问您应用程序的主页(例如 http://redbook-library-abc.mybluemix.net)。单击 Build The Databases。使用浏览器的后退按钮返回到主页。
  2. 单击 Populate the Database with test data。使用浏览器的后退按钮返回到主页。
  3. 使用 user1 / password1 身份进行登录。
  4. 检查结果是否类似下图:该屏幕截图显示了应用程序的主页
    该屏幕截图显示了应用程序的主页
  5. 输入您为颜色模式选择的颜色,单击 Set。我们认为上面黑色和下面紫色的模式看起来很不错。该屏幕截图显示了颜色选择
    该屏幕截图显示了颜色选择
  6. 还可以通过用户界面来查看 Bluemix 和 SQLDB。登录到 http://bluemix.net
  7. 在仪表板中,找到您的 RedbookLibrary。您会看到它使用了 liberty-for-java buildpack 而且正在运行。 该屏幕截图显示了 Bluemix 仪表板
    该屏幕截图显示了 Bluemix 仪表板
  8. 单击 redbooklibrary。您会看到 SQL Database 服务已绑定到该应用程序。单击 Launch 打开 SQL Database UI 并单击 Work with Tables。然后就可以浏览这些表和数据了。该屏幕截图显示了表
    该屏幕截图显示了表

第 8 步:自行清理

关于 Bluemix 需要记住的是,(在30 天试用期之后)您会按 GB/小时进行付费!部署示例应用程序并尝试如何在自己的应用程序中应用一个新过程时,最好学习一下如何在自己的应用程序中应用自行清理功能。

  1. 停止应用程序:cf stop redbooklibrary
  2. 解除绑定服务:cf unbind-service redbooklibrary library-db
  3. 删除服务: cf delete-service library-db
  4. 删除应用程序:cf delete redbooklibrary。(请注意,在询问是否确实希望删除应用程序和服务时,回答 y。)

第 9 步(可选). 将您的应用程序部署到 Cloud Foundry Java buildpack (Tomcat)

我们之前已经提到过,IBM Bluemix 支持 Liberty for Java 运行时,还包含 Cloud Foundry Java buildpack 和 Tomcat 8.0.21。如果喜欢继续使用 Tomcat,那么可以轻松地使用 Java buildpack 部署应用程序。唯一的变化是更新清单文件中的 -b 目标 buildpack。为了方便起见,我们提供了另一个经过适当更改的清单文件。

  1. 从命令行登录到 Bluemix:cf login
  2. 删除现有的 manifest.yml 文件,并将 manifest.tomcat 文件重命名为 manifest.yml。(不用担心,manifest.liberty 与最初的 manifest.yml 相同。)manifest 文件的 Tomcat 版本与我们之前介绍的 Liberty 版本稍有不同。首先,该 buildpack 指向 Cloud Foundry java_buildpack(其中包含 Tomcat)。第二,该清单文件不包含服务节,因为 Tomcat 版本使用了内存中的 Derby 数据库,该数据库的 JAR 文件完全包含在 RedbookLibrary WAR 文件中。
  3. 将您的应用程序部署到 Java buildpack。例如:
    cf push -n NEWHOST-TOMCAT
  4. 像第 7 步中一样测试您的应用程序。还可以使用 Bluemix 用户界面,您会在该界面中看到应用程序已绑定到 java_buildpack。该屏幕截图显示了 Bluemix 用户界面
    该屏幕截图显示了 Bluemix 用户界面
  5. 使用以下命令清理应用程序:
    cf stop redbookLibrary
    cf delete redbookLibrary

如果想要将 SQL Database 用于您的 Tomcat 应用程序,还需要执行其他步骤来配置资源。java_buildpack 没有我们在 Liberty for Java buildpack 中使用的自动绑定数据库的功能。这是使用 Bluemix 上的 Liberty for Java buildpack 的优势之一。有关为什么可以选择 Liberty for Java buildpack 的更多信息,请参阅 “WAS 经典版还是 WAS Liberty:如何选择”,其中讨论了 Liberty 中现在提供的许多特性。

结束语

在本教程中,我们介绍了可用于将 Java 应用程序迁移到云的不同选择。我们还介绍了运行时服务以及工具的关键考虑因素。然后,我们逐步展示了如何使用命令行工具分析 Tomcat 应用程序,并将其迁移到 Liberty for Java 运行时或 Cloud Foundry Java buildpack。本系列的下一篇教程将介绍如何使用 Eclipse 迁移 Java 应用程序。


相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Java technology
ArticleID=1021815
ArticleTitle=使用 Bluemix 将 Java 应用程序迁移到混合云,第 1 部分
publish-date=11232015