Oracle JAVA Cloud 进阶系列 (01) — JBOSS 上应用迁移到 JCS


作者:Jerry (Oracle)

2016 年 5 月 30 日发布


右箭头 Oracle JAVA Cloud 进阶系列 (02) — WAS 上应用迁移到 JCS

Oracle JAVA Cloud 在云中以自助方式为应用系统和 Oracle SaaS 扩展快速,预配 Oracle WebLogic 服务器,依托开放标准构建,因而可以方便地部署和管理 Java 应用。为面向业务关键型应用提供企业级安全性、高可用性和性能。已经有不少以前使用开源应用服务器的客户开始把他们的业务系统迁移到 Oracle JAVA Cloud 之上。本文以图文的形式详细描述如何将 JBOSS 的应用系统迁移到 Oracle JAVA Cloud 之上。

前提条件


  1. 需要一个甲骨文公有云服务的凭据(云帐户、私钥及密码)
  2. 在本机安装并配置好 Maven
  3. 安装 Putty、puTTygen 和 WinSCP
  4. 需要有互联网连接,从中心仓库下载代码和 Maven 依赖的文件。
  5. 这里下载源代码,点击下载 ZIP
  6. 这里下载 H2 数据库 Jar 文件,下载安装文件或 zip 压缩包,或点击 Jar File 下面的 Maven.org 来下载 Jar 文件。用做环境部分使用。

测试和确认环境


1. 在浏览器里输入:https://cloud.oracle.com/sign_in 并且选择“Public Cloud Services”作为数据中心 然后点击“Sign In to My Service”。

 01-fig-01

2. 输入凭据并且点击 Sign in。

3. 点击右上角的 Consoles, 然后点击 Oracle Java Cloud Service。

 01-fig-02

4. 需要一个预分配的 JCS 服务实例。点击它并记录下服务实例的详细信息,参照下图

 01-fig-03

应用迁移


您已经下载了源代码,解压 ZIP,生成一个 demo 文件夹包含主要的源代码。所有的文件我们将引用的在这部分都在 demo 文件夹中

1. 我们必须添加库到 maven 配置文件 settings.xml,因此我们可以获得所有需要的依赖。将下面的内容粘贴到 settings.xml 文件适当的位置。

如果安装了Maven,settings.xml 放在 <Directory Where Maven Installed\conf\>

<profile>

<id>jboss-ga-repository</id>

<repositories>

<repository>

<id>jboss-ga-repository</id>

<url>http://maven.repository.redhat.com/techpreview/all</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>jboss-ga-plugin-repository</id>

<url>http://maven.repository.redhat.com/techpreview/all</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</pluginRepository>

</pluginRepositories>

</profile>

<profile>

<id>jboss-earlyaccess-repository</id>

<repositories>

<repository>

<id>jboss-earlyaccess-repository</id>

<url>http://maven.repository.redhat.com/earlyaccess/all/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>jboss-earlyaccess-plugin-repository</id>

<url>http://maven.repository.redhat.com/earlyaccess/all/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</pluginRepository>

</pluginRepositories>

</profile>

</profiles>

<activeProfiles>

<activeProfile>jboss-ga-repository</activeProfile>

<activeProfile>jboss-earlyaccess-repository</activeProfile>

</activeProfiles>

 

代理设置:您需要在 proxies 标签中添加代理信息,这取决于您在哪里执行实验。如果您在 Oracle 办公室,您需要将 active 标签设置成 true,Oracle 办公室以外的地方,设置成 false。

<proxies>

<proxy>

<id>optional</id>

<active>false</active>

<protocol>http</protocol>

<host> cn-proxy.cn.oracle.com </host>

<port>80</port>

<nonProxyHosts>local.net|some.host.com</nonProxyHosts>

</proxy>

</proxies>

 

2. 从 demo\src\main\webapp\WEB-INF 删除以下文件 files ticket-monster-ds.xml 和 jboss-deployments-structure.xml。我们将从管理控制台创建数据源,我们不需要在 weblogic 里面配置 jboss-deployments-structure.xml

 01-fig-04

如果在 Jboss 中运行这个例子,然后打包这个应用的话,需要把 Jboss.wfk.bom.version 从 2.6.0-redhat-1 改成 2.5.0-redhat-1 并且在 dependencies 标签中添加下面的依赖。

您可以把下面的内容粘贴在 pom.xml 那里。

文件名:demo\pom.xml

<jboss.wfk.bom.version>2.5.0-redhat-1</jboss.wfk.bom.version>

 

修改下面依赖:

<dependency>

<groupId>org.hibernate.javax.persistence</groupId>

<artifactId>hibernate-jpa-2.0-api</artifactId>

<!--scope>provided</scope-->

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-validator</artifactId>

<!--scope>provided</scope-->

<exclusions>

<exclusion>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-jpamodelgen</artifactId>

<!--scope>provided</scope-->

</dependency>

<!--Add the following dependency-->

<dependency>

<groupId>javax.activation</groupId>

<artifactId>activation</artifactId>

<version>1.1</version>

</dependency>

<dependency>

<groupId>aopalliance</groupId>

<artifactId>aopalliance</artifactId>

<version>1.0</version>

</dependency>

<dependency>

<groupId>commons-codec</groupId>

<artifactId>commons-codec</artifactId>

<version>1.4</version>

</dependency>

<dependency>

<groupId>dom4j</groupId>

<artifactId>dom4j</artifactId>

<version>1.6.1</version>

</dependency>

<dependency>

<groupId>org.hibernate.common</groupId>

<artifactId>hibernate-commons-annotations</artifactId>

<version>4.0.1.Final</version>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>4.2.7.SP1</version>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-entitymanager</artifactId>

<version>4.2.7.SP1</version>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-envers</artifactId>

<version>4.2.7.SP1</version>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-infinispan</artifactId>

<version>4.2.7.SP1</version>

</dependency>

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.1.2</version>

</dependency>

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpcore</artifactId>

<version>4.1.2</version>

</dependency>

<dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-core-asl</artifactId>

<version>1.9.9</version>

</dependency>

<dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-jaxrs</artifactId>

<version>1.9.9</version>

</dependency>

<dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-mapper-asl</artifactId>

<version>1.9.9</version>

</dependency>

<dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-xc</artifactId>

<version>1.9.9</version>

</dependency>

 

 01-fig-05

4. 在 WebLogic 环境中,如果不指定持久化提供商,默认为 EclipseLink. Ticket monster 使用 Hibernate 作为持久化提供商。所以我们必须指定持久化供应商并且添加 properties 文件来在 Weblogic 中使用 Hibernate。

文件名:demo\src\main\resources\META-INF\persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- JBoss, Home of Professional Open Source Copyright 2012, Red Hat, Inc.

and/or its affiliates, and individual contributors by the @authors tag. See

the copyright.txt in the distribution for a full listing of individual contributors.

Licensed under the Apache License, Version 2.0 (the "License"); you may not

use this file except in compliance with the License. You may obtain a copy

of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required

by applicable law or agreed to in writing, software distributed under the

License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS

OF ANY KIND, either express or implied. See the License for the specific

language governing permissions and limitations under the License. -->

<persistence version="2.0"

xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://java.sun.com/xml/ns/persistence

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

<persistence-unit name="primary" transaction-type="JTA"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider>   

<jta-data-source>jdbc/ticketmonsterDS</jta-data-source>

<!-- If you are running in a production environment, add a managed

data source, this example data source is just for development and testing! -->

<!-- The datasource is deployed as WEB-INF/ticket-monster-ds.xml, you

can find it in the source at src/main/webapp/WEB-INF/ticket-monster-ds.xml -->

<!--jta-data-source>java:jboss/datasources/ticket-monsterDS</jta-data-source-->

<properties>

<!-- Properties for Hibernate -->

<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>      
<property name="jboss.entity.manager.factory.jndi.name" value="jdbc/ticketmonsterDS"/>   

<property name="hibernate.transaction.manager_lookup_class"  
value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/>

<property name="hibernate.hbm2ddl.auto" value="create-drop" />

<property name="hibernate.show_sql" value="false" />

</properties>

</persistence-unit>

</persistence>

 

 01-fig-06

5. 我们需要添加 weblogic.xml,虽然我们可以为了额外特性来使用这个文件,但是这里我们使用它来提供上下文根。

文件名:demo\src\main\webapp\WEB-INF\weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>

<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">

<context-root>/ticket-monster</context-root>

</weblogic-web-app>

 

 01-fig-07

注解:使用 XML 编辑器创建这个文件。

打包应用


1. 在 Demo 文件夹按鼠标右键,然后选择“CMD Prompt here”。

 01-fig-08

2. 运行“mvn clean package”。

 01-fig-09

注解:

如果您是第一次运行这个命令,将从中心库下载一些依赖。

迁移环境:


这部分,我们在控制台将创建需要的数据源,这个应用使用 H2 内存数据库绑定在 JBoss 应用服务器上。我们需要复制需要的数据库 jar 文件件到域库文件夹。之后我们将能够创建 H2 的数据源

使用 SCP 客户端复制文件:

1. 在开始菜单里面找到 WinSCP。

 01-fig-10

2. 输入一下内容点击 Login。

File Protocol: SCP

Host Name: Public NAT IP of your JCS instance

User name: opc

Password: leave blank

Private Key file: location of your ppk file

 01-fig-11

3. 输入口令,你在生成 PPK 文件时使用的

4. 拷贝 H2 数据库的 jar 文件到 /tmp 文件夹

 01-fig-12

使用 putty 登录系统:


 1. 在开始菜单中找到 putty。

 01-fig-13

2. 导航到 SSH->Auth 并且制定 PPK 的位置。

 01-fig-14

3. 导航到 Session 并且输入 JCS 实例的 IP,然后点击 Open。

 01-fig-15

4. 输入 opc 作为用户名,然后输入口令,您在创建 PPK 文件时使用的

 01-fig-16

5. 输入下面命令,我们将复制 jar 到域的 lib 目录,然后重启动 Admin Server 才能够使 jar 设置生效。

sudo su

cp /tmp/h2-1.3.168-redhat-2.jar /u01/data/domains/TicketMo_domain/lib

chmod 777 /u01/data/domains/TicketMo_domain/lib/ h2-1.3.168-redhat-2.jar

ps -aef|grep ‘adminserver’

kill -9 <PID>

 

您将收到进程 id,关联着 admin server 的 java 进程。杀掉该进程。如果 admin server 像这样关闭(非正常关闭),Node manager 会重启 Admin Server。这里可能需要等待几分钟,确认 admin server 重启成功。

 01-fig-17

6. 在浏览器中进入服务实例的详细页面,点击“Open WebLogic Server Console”,参照下面图片。

 01-fig-18

7. 点击“I Understand the Risks”->”Add Exception”->”Confirm Security Exception”。

8. 输入您的 weblogic 用户名/密码,然后点击 Login。

 01-fig-19

9. 点击“Lock & Edit”

 01-fig-20

注解:在完成每个在 Admin console 上的修改之后, 激活这些修改,并且点击 click on Edit & Lock 在做任何修改之前。

注解: 因为我们添加了 H2 database 的 h2-1.3.168-redhat-2.jar,为了使 jar 文件在 managed 服务器中生效,我们需要重启相关的 managed server。

a. 导航到 Environment->Servers。

b. 导航到 control tab 然后勾选 managed server,点击 Shutdown-> Force Shutdown。

 01-fig-21

managed server 停止,再次点击 control tab,然后勾选 Managed Server,然后点击开始按钮。

 01-fig-22

创建数据源:

导航到 Services-> Datasource 然后点击 New-> Generic Data Source。

输入以下信息,点击 Next。

Name: jdbc/ticketmonsterDS

JNDI Name: jdbc/ticketmonsterDS

Database Type: Other

 01-fig-23

其他项按默认选择,然后点击 Next。

 01-fig-24

选择“Emulate Two Phase Commit”,然后点击 Next。

 01-fig-25

输入 sa/sa 作为用户名和密码,然后点击 Next。

 01-fig-26

输入以下信息,然后点击“Test Configuration”。

Driver Class Name: org.h2.Driver

URL: jdbc:h2:mem:ticket-monster

 01-fig-27

您应该看到“Connection test Succeeded”. 点击 Next。

 01-fig-28

选择“TicketMo_cluster”作为目标,然后点击 Finish。

 01-fig-29

部署应用


我们之前已经用 Maven 编译好目标包 ticket-monster.war,使用 Winscp 拷贝这个 war 文件到 JCS 实例的 /tmp 文件夹

War 路径:/demo/target/ticket-monster.war,目标路径 /tmp。

注意:部署 war 文件,也可以在 Weblogic 控制台页面上使用“上载文件”的方式来部署。

点击 Deployment。

 01-fig-30

点击 Install, 输入 path“/tmp/ticket-monster.war”,然后点击 Next。

 01-fig-31

选择“Install this deployment as an application”,点击 Next。

 01-fig-32

选择“TicketMo_cluster”作为 Target,然后点击 Next。

 01-fig-33

点击 Finish。

 01-fig-34

“Activate”修改。在 Summary of Deployments 中, 点击 Next 按钮直到您看到 ticket-monster 应用,然后勾选应用并选择 start->servicing all requests。

 01-fig-35

点击 Yes 在 Start Deployment 页面。

 01-fig-36

测试和确认应用迁移是否成功:


1. 在浏览器中输入 https://{PUBLIC NAT IP OF OTD SERVER}/ticket-monster/。

2. 如果浏览器出现证书安全警示,接受它们。

3. 点击 Event tab 然后 book a Ticket。

4. 点击 Monitor tab 然后点击“Start bot”, 将生成一些 booking 的例子在应用中,点击“Stop bot”来结束进程。然后观察 Current booking 在“Booking”tab。

5. 再次导航到 Monitor tab 然后点击 Delete all booking 然后确认 Current booking 在“Booking”tab。