跳到导航
dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare
dev2dev 首页 > 资源中心 > 技术文章
使用 WLST 和 BEA Workshop 在集群环境中开发Web应用程序

时间:2007-07-02
作者:Michael Meiner
浏览次数:
本文关键字:BEA SystemsBEA WebLogicWebLogic ServerWorkshop StudioBEA WorkshopJavaJ2EEWLSTWebLogic Scripting ToolCluster
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章

  典型的开发环境包括用来测试 Web和企业 J2EE应用程序的单服务器 J2EE容器。与之相比,生产环境则更复杂、更集群化。在生产层面的测试中所发现的问题常常需要追溯到开发团队,由其对 Web或企业应用程序做修改。通过让开发团队针对集群环境做单元测试,就可以在周期的早些时候发现这类问题。本教程为开发人员提供了一种直观的方式来利用WebLogic Scripting Tool (WLST)在集群中尝试将其应用程序自动化地供应至该环境。

  本教程的第1部分描述了如何使用 WLST在集群中部署 Web 应用程序。第2部分将引入BEA Workshop Studio,展示如何从开发IDE调用在第1部分创建的脚本。

需要的软件

  要运行本教程中的示例,需要如下软件。第1部分需要:

  1. WebLogic Server 9.0或9.1,使用定制安装来安装 Web server 插件
  2. Apache HTTP Server 版本 2.0 或更高

  第 2 部分需要:

  1. BEA Workshop Studio 3.0 (15天的免费试用版可供下载)或 BEA Workshop JSP Editor (免费)

  要使用示例中的脚本,请按如下设置安装BEA WebLogic Server:

  1. BEA HOME = wls9
  2. PRODUCT HOME = weblogic90

  使用默认端口80安装 Apache HTTP Server。

第 1部分:WLST的强大功能

  WebLogic Scripting Tool (WLST) 是一种命令行式的脚本界面,系统管理员和操作员可用它来监视和管理BEA WebLogic Server 实例和域。WLST 脚本界面基于Java 脚本解释器 Jython。除了WebLogic 脚本功能之外,您还可使用解释语言的通用特性,包括本地变量、条件变量和流控制语句。WebLogic Server 开发人员和管理员可按照Jython语法来扩展WebLogic 脚本语言以满足自身的环境需求。

  WLST 有两种模式:脱机和联机。使用 WLST 脱机,您可以不需要连接到运行的WebLogic Server即可创建新域或更新现有的域——支持Configuration Wizard同样的功能。而WLST联机模式则提供了到 Managed Bean (MBean) 的简单访问,MBean是一些能为底层资源(可通过JMX管理)提供管理接口的Java 对象。WLST 是一种 JMX 客户程序。所有能使用WLST 联机完成的任务也能通过JMX编程实现。

  让我们看看如何使用WLST 来创建集群以及如何将应用程序部署到此集群。我们假设您已经开发了应用程序(名为helloApp)并已经成功在单服务器实例上测试了该应用程序。使用WLST在集群中测试应用程序包括三个步骤:创建、启动和运行。在创建阶段,创建一个包含两个受管服务器的集群域。在开始阶段,则会启动这个域并将helloApp 部署到该域。在运行阶段,将使用浏览器运行此应用程序。

  首先,需要将 WLST-scripts.zip 解压缩到目录。本教程假设此目录为 c:\wlst-workshop。

步骤 1:创建

  创建步骤会涉及 createcluster.py WLST 脚本。该脚本首先创建 Admin Server,然后创建受管服务器,最后创建集群。

首先,创建 Admin Server

  为集群创建 Admin Server 与为单服务器实例创建完全相同。先是定义侦听地址(non-SSL 和SSL),然后定义admin 用户名和密码(可用来登录到 admin 控制台)。

#=========================================================
# Configure the Administration Server and SSL port.
#=========================================================
cd('Servers/AdminServer')
set('ListenAddress','')
set('ListenPort', 9001)
create('AdminServer','SSL')
cd('SSL/AdminServer')
set('Enabled', 'True')
set('ListenPort', 9002)
#=========================================================
# Define the password for user weblogic.
#=========================================================
cd('/')
cd('Security/base_domain/User/weblogic')
cmo.setPassword('weblogic') 

然后,创建受管服务器

  下面显示的是创建受管服务器的脚本的一部分。所创建两个受管服务器是:ms1 和ms2。侦听端口指的是受管服务器侦听进入流量时所处在的那些端口。在本例中,侦听端口是不同的,因为两个服务器运行在同一台机器上。若每个受管服务器各自有专用的机器,则侦听端口可以相同(但主机或侦听地址应该不同)。

#=========================================================
# Create two Managed Servers and configure them.
#=========================================================
cd('/')
create('ms1', 'Server')
cd('Server/ms1')
set('ListenPort', 9101)
set('ListenAddress', 'localhost')
cd('/')
create('ms2', 'Server')
cd('Server/ms2')
set('ListenPort', 9102)
set('ListenAddress', 'localhost') 

最后,创建集群

  现在从两个受管服务器(ms1 和 ms2)创建集群,称为 wlsCluster。注意 WeblogicPluginEnabled 属性已设置为真。如果集群会收到来自代理插件的请求,就将此属性设为真。由于我们稍候会使用WebLogic Apache 代理插件,所以也要这么做。

#=========================================================
# Create and configure a cluster and assign the Managed Servers
# to that cluster.
#=========================================================
cd('/')
create('wlsCluster', 'Cluster')
assign('Server', 'ms1,ms2','Cluster','wlsCluster')
cd('Clusters/wlsCluster')
set('MulticastAddress', '237.0.0.101')
set('MulticastPort', 9200)
set('WeblogicPluginEnabled', 'true') 

  所有这些片段都取自 createcluster.py WLST 脚本。要运行它,请打开命令窗口,转到 c:\wlst-workshop 并键入:

set PATH=c:\wls9\weblogic90\common\bin;%PATH%
wlst.cmd createcluster.py myclusterdomain

  注意myclusterdomain 与我为域所选择的是相同的。在:\wls9\user_projects\domains\myclusterdomain 之下,可看到域中的文件。

  至此,我使用 WLST 创建了管理服务器和两个受管服务器,并将受管服务器放到了集群。

步骤 2:启动

  在本步骤,将启动集群域,然后将应用程序部署到这个集群。

启动集群域

  要启动集群,需要使用称为 startcluster.py 的脚本。 由于WLST启动服务器需要利用 WLS Node Manager,所以首先启动节点管理器并连接。然后,启动Admin Server 并连接。最后,启动集群。

  如下所示代码取自 startcluster.py 脚本:

# set the following values if your installation is different
bea_home='c:\wls9'
weblogic_home='c:\\wls9\\weblogic90'
# nmhome and domaindir are based on the above settings
nmhome = weblogic_home + '\\common\\nodemanager'
domaindir = bea_home + '\\user_projects\\domains\\' + sys.argv[2]
# Start the node manager process
startNodeManager(verbose='true', NodeManagerHome=nmhome)
#Connect to the node manager
nmConnect(domainName='myclusterdomain',domainDir=domaindir)
# Start the Admin Server
nmStart('AdminServer')
# Connect to the Admin Server
connect('weblogic','weblogic', sys.argv[1])
# Start the cluster comprising of ms1 and ms2
start(sys.argv[3],'Cluster')
exit() 

  要运行脚本,键入:

wlst.cmd startcluster.py t3://localhost:9001
myclusterdomain wlsCluster

部署应用程序

  要部署应用程序,可使用称为deploy.py 的脚本。这里假设仍然使用的是演示应用程序helloApp,它是本教程随附的wlst-scripts.zip 下载文件的一部分(参见 helloApp 目录)。

  部署脚本内的键命令为:

deploy(appName='workshop_cluster_deployment',path=sys.argv[2],
targets=sys.argv[3])

  注意:由于 WLST 部署命令是一种联机命令,所以部署脚本首先要连接至Admin Server。deploy.py 脚本假设需要传递的是如下信息:

  1. 到应用程序的路径
  2. 目标服务器或集群
  3. 用来运行应用程序的URL

  appName 硬编码到 workshop_cluster_deployment中,以与 Workshop保持一致(稍后就会看到)。

  要运行脚本,键入:

wlst.cmd deploy.py t3://localhost:9001  /wlst-workshop/helloApp
wlsCluster http://localhost:9101/helloApp/hello.html

  注意:此外还提供了其他两个脚本(stopserver.py 和 startserver.py),分别用来停止和启动受管服务器。我在第 2 部分介绍故障转换时会使用到它们。

  至此,我们使用WLST启动了集群并将应用程序部署到此集群。现在我们来运行这个应用程序。

步骤 3:运行应用程序

  我们将从浏览器运行此应用程序。步骤 2 中的脚本将会使用如下URL调用浏览器,或者您也可用单击链接http://localhost:9101/helloApp/hello.html

  哈!您应该看到应用程序了吧。现在,可以键入自己的名字,然后单击“Submit name”。之后,调用名为 hello.jsp的 JSP,它会向您问好并打印出会话信息以供您稍后使用。

  您还可以转到http://localhost:9102/helloApp/hello.html 并查看在另一台受管服务器运行的相同的应用程序。当然,这种设置并无太大的实际意义;您所真正需要的是客户请求在两个服务器间进行自动的负载均衡,以便获得更好的可扩展性。要实现这个目的,需要引入负载均衡器。带WebLogic Apache 插件的Apache Web Server 就是一款这样的负载均衡器。

使用 Apache实现负载均衡

  首先需要下载和安装Apache Web server,然后 安装 Apache HTTP Server 插件。注意在安装WebLogic Server时,插件并不会默认安装,需要选择定制安装和相应的插件复选框。

  添加如下的代码片段到 Apache http.conf 配置文件来配置插件:

LoadModule weblogic_module    modules/mod_wl_20.so
<IfModule mod_weblogic.c>
   WebLogicCluster localhost:9101,localhost:9102
     MatchExpression /hello
</IfModule> 

  它告诉插件去查找带字符串/hello 的URL并将这些请求重定向到集群,分别由 localhost:9101 和 localhost:9102 表示。如果两个服务器都可用,HTTP Server就会对请求做负载均衡。如果只一个服务器可用,所有流量都会路由到服务器。

  现在,打开浏览器并键入:

  http://localhost/helloApp/hello.html

  请求现在会转到 Apache HTTP Server (使用默认端口 80设置),然后路由到可用的受管服务器。要了解是哪个受管服务器处理了请求,可以使用getstatus.py 脚本。注意,如果使用的是 WebLogic Server 9.1,需要将所提供的 getstatus.py.91 脚本复制到getstatus.py 来解决两个发布版本间的运行时 MBeans 变更。 此脚本为每个受管服务器上的hello.jsp服务使用运行时 MBean InvocationTotalCount 来报告hello.jsp 服务被调用的次数。结果类似于:

  ms1 count: 1

  ms2 count: 0

  这表明 ms1 服务了该请求。

  至此,您使用WLST 创建了功能完善的集群环境以便测试应用程序。现在,可以更改此应用程序,重新将其部署到集群并测试。WLST 和此处提供的脚本会负责所有的工作,这就使开发人员能更集中于应用程序的开发和更加轻松地测试集群环境。

  让我们再回顾一下这三个步骤:创建、启动和运行,这次是直接从BEA Workshop IDE 执行上述步骤。我将主要在本例中使用 JSP 功能。Workshop 提供了专业的 JSP 源代码编辑器、代码完成、定制标签库支持、同时的双向源和 visual JSP 编辑器、JSP 2.0(包括 EL)、 JSTL 、TLD的图形编辑器,以及 web.xml 的图形编辑器。

  首先,需要将 workshop-scripts.zip 解压缩到Workshop 工作区,metadata\.plugins\org.eclipse.debug.core\.launches 之下。

  现在,需要将helloApp 应用程序放入Workshop。为此,执行File->New->Web Application Project,然后选择 Existing Web Application。会看到如图 1 所示的屏幕。

使用 WLST和 BEA Workshop在集群环境中开发Web应用程序 图-1

  图 1:将现有应用程序放入 Workshop

  现在,转到helloApp 目录的这个位置(c:\wlst-workshop之下),然后单击 Finish。系统会询问是否创建默认源文件夹,单击 Yes。

  在Workshop 内运行Web 应用程序的传统方式是针对单服务器环境进行部署。为此,需要首先使用Configuration Wizard创建空域,配置向导可由Start Menu->All Programs->BEA Products->Tools->Configuration Wizard 启动。除了用户名和密码(两个都使用weblogic)之外,接受所有默认设置,并将服务器命名为 singleserver。

  注意,您也可用使用WLST创建此域。但对于类似本例中这样的基本的域来说,Configuration Wizard 完全可以出色地完成任务。

  创建域之后,回到 Workshop 并调用 Run 命令:

使用 WLST和 BEA Workshop在集群环境中开发Web应用程序 图-2

  图 2:调用 Run命令

  图 3 显示了结果屏幕

使用 WLST和 BEA Workshop在集群环境中开发Web应用程序 图-3

  图 3:使用Workshop Run命令运行helloApp

  选择 helloApp 项目,并在Run with server处单击New来指定 Server Configuration。现在需要填充服务器配置。图 4 显示了您所需的值。

使用 WLST和 BEA Workshop在集群环境中开发Web应用程序 图-4

  图 4:为 Weblogic Server 输入配置信息

  现在在之前的那个屏幕单击 Run。由于helloApp 没有weblogic.xml 文件,Workshop 会询问是否希望创建该文件,选择Yes。helloApp部署后,服务器实例就会由此启动。脚本会使用如下的URL调用浏览器,或者您也可用单击 http://localhost:7001/hello.html。注意,您无需在URL中包括 helloApp,因为 weblogic.xml 文件已指定了此应用程序属于root上下文 (/)。

  当Workshop 部署此应用程序时,它使用硬编码的应用程序名__nitrox_autoconfig_deployment。若转到 Admin Console 并在部署上单击,就会看到这个名字。您可以遵循类似的集群部署范式,但为了避免冲突,请使用workshop_cluster_deployment。

步骤 1:创建

  现在我们从Workshop 部署集群。由于 Workshop Run命令假设部署是针对单服务器的,所以我们不使用Run 命令部署集群。相反,使用 Workshop 的 External Tools 特性来调用 WLST 脚本。

  要创建集群,转到如图 5 所示的 External Tools。

使用 WLST和 BEA Workshop在集群环境中开发Web应用程序 图-5

  图 5:调用 External Tools

  现在在左侧面板中选择 wlst-createcluster,如图 6 所示。

使用 WLST和 BEA Workshop在集群环境中开发Web应用程序 图-6

  图 6:External Tools中的 wlst-createcluster

  这个屏幕指定了要运行的程序名 (wlst.cmd)、Working Directory (wlst-workshop) 和将要传递给 WLST 的参数(createcluster.py 和 myclusterdomain)。第一个传递给 WLST的参数是脚本名,后续参数代表脚本预期接受的输入。在本例中,createcluster.py 脚本预期接受的是此域的名称(即myclusterdomain)。单击屏幕底部的 Run 按钮来创建域。

  至此,您使用Workshop 和 WLST 创建了管理服务器和两个受管服务器,并将受管服务器放入集群。

步骤 2:启动

  在本步骤,将启动集群域,然后再将应用程序部署到此集群。这些步骤与第1 部分描述的十分类似。

  要启动集群,在External Tools面板中选择名为 wlst-startcluster 的程序。这会调用与第1部分相同的那个脚本。

  类似地,要启动应用程序,首先单击hello.html ,在主窗口中打开它。这确保了部署的是正确的应用程序。然后,在External Tools面板中选择名为 wlst-deploy 的程序。这会调用 deploy.py 脚本,该脚本将 helloApp 应用程序部署到集群。

  在本例中,如果使用的不是默认设置,就需要在调整External Tools屏幕上的参数。注意部署参数的最后一个参数是 http://localhost/hello.html。这会自动使用此URL调用浏览器。如果没有使用带端口80的HTTP Server,您可以根据自己的设置加以更改。至此,您使用了 WLST 和 Workshop 启动了集群并将应用程序部署到了此集群。现在让我们运行此应用程序!

步骤 3:运行

  运行应用程序也与第1部分十分类似,只需向浏览器输入适当的URL (或使用在步骤 2末尾调用的浏览器)。使用 Apache 作为负载均衡器,键入:http://localhost/hello.html

  键入自己的名称,然后单击 Submit。现在,从External Tools运行 getstatus.py 命令。这会告诉您是哪个服务器(ms1 或 ms2)正在服务请求。在浏览器上单击刷新,然后再次运行 getstatus。请注意,调用了同一个服务器,使用了同样的会话。

  现在,让我们看看如果其中一个服务器故障了会发生什么情况。杀掉正服务请求的那个服务器(ms1 或 ms2),方法是从External Tools 运行 stopserver.py 命令。如果要将ms2停掉,请确保在参数窗口中将ms1 改为 ms2。现在,再次单击刷新按钮。注意如下两个情况:

  1. 请求已由另一个受管服务器服务(这一点可通过运行 getstatus 脚本看出)。
  2. 会话 ID 改变了!

  第一个结果是我们希望看到的,因为集群就应该具有高可用性。当其中一个服务器故障时,另一个服务器就应该能够承载其上的负载。但第二个结果并不是我们想要的,因为我们希望生存下来的受管服务器能够使用与故障服务器相同的会话。这就是所谓的会话复制。那么为何会出现这种情况呢?

  所需做的是配置应用程序使其使用会话持久性。在 Workshop 打开 helloApp 应用程序,并编辑位于WEB-INF目录下的 weblogic.xml 文件。添加如下代码片段来启用会话复制。

<session-descriptor>
    <persistent-store-type>replicated</persistent-store-type>
    </session-descriptor> 

  默认设置(内存的持久存储类型)并不会跨集群服务器复制会话。将上述参数设置为replicated 就可以让会话跨集群中的服务器复制。因而,若服务会话的那个受管服务器故障了,生存下来的服务器就会接管会话。终端用户仍然可以继续工作,就仿佛系统没有任何故障一样。

  现在,通过从External Tools运行wlst-startserver重启故障的受管服务器,然后执行wlst-redeploy重新部署 helloApp。

  现在,重试上述实践。您会发现,当服务器进行了故障转换后,它使用了相同的会话ID!

  至此,您使用 Workshop 和 WLST 创建了功能完善的集群环境以便测试应用程序。现在,您可以重复更改此应用程序,重新将其部署到集群并测试。Workshop和此处提供的WLST脚本会负责所有的工作,这就使开发人员能更集中于应用程序的开发和更加轻松地在集群环境中进行测试。

全景

  在本文中,我侧重介绍了开发人员的生产效率,具体来说就是开发人员如何在集群环境内轻松测试应用程序。开发人员一旦完成了开发阶段(借助充分的单元/集群测试),应用程序就会转交给负责不同阶段(比如集成、QA以及生产等)的不同团队。在这些阶段均可利用 WLST 来自动化域和应用程序供应并进一步缩短将应用程序交付生产所需的时间。要获得在这些阶段如何利用WLST 的更多信息,请参看 自动化WebLogic Platform应用程序供应:案例分析 (Dev2Dev中文版,2006年4月)。

结束语

  当应用程序经历从开发到生产的整个生命周期的不同阶段时,环境就会在每个阶段变得更加复杂。集群就其中一个复杂的因素。由于开发人员一般都会在单服务环境进行测试,因而很容易在后续阶段遇到问题。通过为开发人员提供在集群中用最小开销测试其应用程序的手段,许多这类问题都可以在项目生命周期的早期得以修复和解决。

  本教程为开发人员展示了这些手段,以使他们可用在集群域运行其应用程序。通过利用WLST 和Workshop,我展示了开发人员如何能从他们用来在单服务器域开发和运行应用程序的相同的环境创建、部署和启动其应用程序。为开发人员提供这样的能力不仅会缩短项目的生命周期,还能使项目能快速得到部署和生产。

下载

  本文中的示例代码可以从这里下载

参考资料

  1. CodeShare 上的 WLST 项目名称 —— 使用 WLST Offline 和/或 WLST Online 的脚本和实用程序。
  2. WLST Command and Variable Reference (产品文档)—— WLST 命令和变量的详细描述。
  3. Dev2Dev 的BEA Workshop Product Center 内有相关的资料和下载。
  4. Understanding Cluster Configuration and Application Deployment (产品文档)—— 有关集群的配置如何存储和维护的信息。
  5. Failover and Replication in a Cluster (产品文档) ——WebLogic Server 如何检测集群内的错误以及如何实现故障转换。
  6. Using Node Manager to Control Servers (产品文档)——描述了 Node Manager 的功能、架构和配置步骤。
  7. Apache HTTP Server —— 安全、有效和可扩展,并可提供与当前HTTP 标准同步的 HTTP 服务。
  8. WebLogic Apache HTTP Plug-in(产品文档)——描述了如何安装和配置 Apache HTTP Server 插件。
  9. 自动化WebLogic Platform应用程序供应:案例分析 (作者:Andy Lin)——给出了更复杂的一些供应场景(Dev2Dev中文版,2006年4月)。

原文出处:http://wldj.sys-con.com/read/312680.htm

 作者简介
Michael Meiner 是BEA Systems公司的工程部经理,负责领导Platform Engineering(平台工程)团队。
dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分