Tomcat中的Grails应用集群

Grails生成的war文件可以很容易地部署到Tomcat上。那么如何在Tomcat中实现Grails应用的集群呢?本文参考Peter Ledbrook的博文给出了Linux和Windows环境下实现这一功能的方法。本站之前曾发布过《集群Grails应用》,本文与之区别之处在于,前者是基于Terracotta来实现集群,而本文利用的则是Tomcat自身的特性。

首先,准备用于集群的应用程序:

  • 给Grails应用打上“分布式”标记,即在工程的web.xml文件中添加:<distributable/>;请注意,不要直接去修改Grails工程下web-app\WEB-INF里的web.xml。要修改该文件,先运行“grails install-templates”,然后进入工程的src/templates/war/去修改。
  • 在DataSource.groovy中,你会看到Grails使用Ehcache作为Hibernate二级缓存的提供者。缺省情况下,Grails不会提供ehcache.xml,而是让其使用缺省配置,这对于单机和集群都是不推荐的。在scripts目录下创建一个事件处理器,在打包时,给应用复制一份ehcache.xml:
  • eventCreateWarStart = { name, stagingDir ->
        ant.copy(file: 'cluster_resources/ehcache_distributed.xml',
                 tofile: "$stagingDir/WEB-INF/classes/ehcache.xml", overwrite: true)
    }

    其中cluster_resources/ehcache_distributed.xml可以在这里获得。

  • 创建示例代码:创建一个包含有三个Action的Controller:arrive(给session添加counter变量),leave(删除session的counter变量),counter(counter递增并显示其结果)。它们的代码都很简单,这里就不再描述,有兴趣者可参见Peter的原文
  • 使用grails war打包应用。

应用程序准备好之后,就需要准备Tomcat了。Peter根据Burt Beckwith的博文提供了Linux平台下Tomcat集群管理的脚本文件,使用这些脚本文件创建两个Tomcat实例,并为之创建共享文件。具体步骤请参见原文,这里不再赘述。

至于Windows环境下,要实现该功能,就需对脚本进行修改。如下是笔者的修改方法:

  • 将clusterTasks.xml文件中的<echo file='${dir}/bin/setenv.sh' append='false'>的内容调整为bat文件认可的内容;
  • 在tomcatcluster\shared\conf\server.xml文件中的Membership添加bind属性,用于设置组播绑定地址;
  • 将tomcatcluster\tomcat中的内容更换成Windows平台下的Tomcat分发包;
  • 将原来的createCluster.sh(创建集群工作目录)、createIntance.sh(创建Tomcat实例)和run.sh(启动实例)修改成相应的bat文件。

上述修改后的示例文件,可从这里下载。整个脚本的目录结构如下图:

使用步骤和示例如下:

  • 运行“createCluster tomcatcluster E:\IntTest\cluster”,创建集群工作目录,其中的参数分别对应应用程序的名字(tomcatcluster)和集群的工作目录名(E:\IntTest\cluster);
  • 运行2次createIntance.bat创建两个Tomcat实例,参数从左至右依次为服务器号、实例号和工作目录:
    • createIntance 1 1 E:\IntTest\cluster
    • createIntance 1 2 E:\IntTest\cluster
  • 将应用程序的war文件解压至cluster/shared/webapps/ROOT下;
  • 运行两次“run start”,启动之前创建的两个Tomcat实例,参数分别是实例号和工作目录: start insNumber cluster-root”。
    • run start 1 E:\IntTest\cluster
    • run start 2 E:\IntTest\cluster

整个示例的目录结构如下:

这时,在浏览器中就能看到整个效果了:分别访问这两个Tomcat实例,应用会话的计数是不断递增的,而不是各自增加自己的。

本文讲述的方法,并不只限于Grails,对于运行在Tomcat上的war均适用。至于其他的集群方法,请参见:

By huwh - Posted on 31 八月 2010

好文!

也许很快就要用上了。谢谢