您对 “在云中” 运行 Java™ 应用程序感兴趣?但是考虑到企业应用程序的现实,您不确定从何处开始?在本系列中,我们将讨论分层混合应用程序的不同选项,指导您逐步掌握几个示例。我们将解释如何迁移 Java 应用程序的各个部分,同时连接到最好留在您企业内的组件。此外,我们还将讨论 Java 运行时、服务和工具的不同选项。
本系列专注于 Java 应用程序和它使用的服务,以及您如何将 Java 应用程序和关系数据库层迁移到基于 Cloud Foundry 的平台。我们还会介绍将服务留在内部的场景,以及在迁移到云时,可能需要针对会话管理、扩展和日志记录而执行的应用程序更改。
在评估一个要迁移到云的应用程序时,通常的起点是应用程序本身。在整个过程中,您需要理解以下方面:
简单的 Tomcat 风格的 servlet 和 jsp 应用程序通常很容易迁移到云中,而且您可以选择不同的运行时和服务选项。但是,即使是简单的应用程序,也有可能需要您考虑如何处理数据库等服务,以及在需要扩展时,如何处理会话亲缘性。我们的第一个示例是逐步迁移 Tomcat 应用程序,包括数据库。然后分析在云中运行 Java 工作进程的问题。在以后的教程中,我们将分析云中的扩展和会话亲缘性问题。
如果您的应用程序使用了 Remote EJB、2 阶段提交处理和其他更高级的特性,您的迁移选项可能更有限(或成本更高)。我们将讨论将应用程序迁移到云中的不同可用选项。
如果您不确定应用程序的准确用途和需求,这些逐步指导会帮助您使用一个迁移工具来进行分析。(即使您认为 自己知道应用程序的用途和需求,也推荐您使用此工具!)
“本系列的第一篇教程将解释如何将示例 Java 应用程序迁移到云中,并连接到一个基于云的 SQL 数据库。”
在云中运行 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 上运行的示例应用程序 RedbookLibrary。这个应用程序来自 WebSphere Application Server v8.5 迁移指南,其中详细分析了从 WebSphere Full Profile、Tomcat、JBOSS 或 WebLogic 迁移到 Liberty 配置文件所涉及的考虑因素。我们对 Redbook 版本的数据库访问实践进行了一些修改,我们将它设置为使用本地 Apache Derby 数据库,所以一定要使用与本教程相关的应用程序版本。
进行一些初步设置后,就可以开始运行迁移分析工具了。然后将应用程序迁移到 Bluemix 上的 Liberty for Java 运行时,使用 Bluemix 中的 SQL Database 服务作为数据库,如下图所示。
在全系列中,我们提供了要使用的示例应用程序,我们推荐使用它们来熟悉这些步骤和工具。然后您可以对自己的应用程序执行相同的步骤。
git clone https://github.com/kgb1001001/RedbookLibrary
。IBM Bluemix 支持 Cloud Foundry API。因此,您在如何开发 Java 应用程序方面拥有很高的灵活性。在本教程中,我们将展示如何使用该命令行。(对于已使用 Eclipse 或想要一种更加一体化的 IDE 体验的读者,第 2 部分将介绍如何使用 Eclipse,还将介绍 Liberty for Java Bluemix 迁移插件和 Bluemix 部署插件。)
IBM 提供了迁移分析工具来帮助确定将应用程序迁移到 Bluemix 的难易程度。第一个工具是二进制评估工具,在这里,我们将从命令行运行它。第二个工具提供了更深入的分析,但需要使用源代码和 Eclipse,这些将在第 2 部分中介绍。
java -jar binaryAppScannerInstaller.jar
来安装该工具。 java -jar binaryAppScanner.jar /directory-containing-war-file
。该目录将为 <git_clone_location>/RedbookLibrary,比如 c://users/ibm_admin/RedbookLibrary。
java -jar binaryAppScanner.jar /directory-containing-war-file --analyzeMigrationDetails --targetAppServer=bluemix
二进制扫描器的技术预览版提供了应用程序的重要分析信息。
在我们的应用程序中,我们使用了标准 Java 日志工具并将日志记录到默认位置,也就是 System.out。所以日志条目会自动被 Loggregator 拾取。
我们选择使用云中的数据库,所以接下来我们需要创建要使用的数据库服务。这可以通过 IBM Bluemix 仪表板或通过命令行完成。本教程将继续使用命令行。创建数据库后,我们部署应用程序并绑定到数据库。但在创建数据库之前,我们需要先来讲讲如何部署应用程序,以及它将如何使用数据库。
Cloud Foundry 中的一种最佳实践是在部署应用程序时使用所谓的 manifest.yml 文件。manifest.yml 文件类似于 Java JAR 或 WAR 文件中的清单文件的想法。其中的信息可以帮助 Cloud Foundry 工具理解您的应用程序是如何构造的。
清单是使用 YAML 编写的。您只需知道 YAML 的两个方面,即可阅读此文件:
我们看看示例应用程序中提供的 manifest.yml 文件。
applications: - name: redbooklibrary memory: 512M path: RedbookLibrary.war host: redbook-library buildpack: liberty-for-java services: - library_db
cf login
cf create-service sqldb sqldb_free library_db
cf services
清单很重要的原因是,我们刚介绍的元素是您需要通过命令行参数或对 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。
现在您已准备好部署应用程序了。因为我们使用了清单,所以部署很简单!
cf push -n <NEWHOST>
,其中
<NEWHOST>
是您为将提供应用程序的 “路由”
的定义。(路由等效于子域。例如,如果您使用了 redbook-library-abc
,其中
abc
是您的姓名的首字母,那么您的应用程序将可以在
http://redbook-library-abc.mybluemix.net 上获得。)在理想情况下,您拥有自动测试案例,可以运行它们来验证应用程序能否工作。对于此应用程序,我们没有这么奢侈的条件,所以以下是确保它正常工作的步骤。
user1
/ password1
身份进行登录。关于 Bluemix 需要记住的是,(在30 天试用期之后)您会按 GB/小时进行付费!部署示例应用程序并尝试如何在自己的应用程序中应用一个新过程时,最好学习一下如何在自己的应用程序中应用自行清理功能。
cf stop redbooklibrary
。cf unbind-service redbooklibrary library-db
。 cf delete-service library-db
。cf delete redbooklibrary
。(请注意,在询问是否确实希望删除应用程序和服务时,回答
y。)我们之前已经提到过,IBM Bluemix 支持 Liberty for Java 运行时,还包含 Cloud Foundry Java
buildpack 和 Tomcat 8.0.21。如果喜欢继续使用 Tomcat,那么可以轻松地使用 Java buildpack
部署应用程序。唯一的变化是更新清单文件中的 -b
目标
buildpack。为了方便起见,我们提供了另一个经过适当更改的清单文件。
cf login
。cf push -n NEWHOST-TOMCAT
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 应用程序。
BLUEMIX SERVICE USED IN THIS TUTORIAL:Liberty for Java 运行时 可以帮助您轻松地开发、部署和扩展 Java Web 应用程序。