技术开发 频道

精通 Grails: 在企业中使用 Grails

  【IT168技术文档】常常有人问我 Grails 是否已经可以在企业中使用。简单的回答是 “是”。而我通常给出更加详细的回答:“只要您觉得 Spring 和 Hibernate(Grails 所依赖的底层技术)已经就绪;只要您觉得 Tomcat 或 JBoss(或 Java 企业版[Java EE])应用服务器已经就绪;只要您觉得 MySQL 或 PostgreSQL(或者您使用的数据库)已经就绪;只要您觉得 Java 编程已经企业就绪,那么 Grails 就已经企业就绪” 。

  British Sky Broadcasting Group 最近将它的 Web 站点迁移到了 Grails。他们现在每月的点击量达到 1.1 亿次。LinkedIn.com 在其站点的某些商业部分使用 Grails。Tropicana Juice 在英国有一个 Web 站点,该站点几年来一直在 Grails 上运行。Grails.org 本身就是用 Grails 编写的,每月支持 70,000 多次下载。而 SpringSource 最近有关 G2One(Groovy 和 Grails 所在的公司)的问卷调查结果完全可以打消 Groovy 和 Grails 是否适合企业使用的任何疑虑。

  Groovy 有时候看起来比较奇怪,最重要的是要记住,它完全是用普通的 Java 代码实现的。尽管 Grails 开发与其他典型的 Java Web 框架看起来很不一样,但最终您仍然会得到一个与 Java EE 兼容的 WAR 文件。

  在这篇文章中,您将探讨一些用于监控和配置的企业级工具。学习如何使用 JMX 调整 Grails 应用程序。本文将简要介绍 Grails 中的 Spring 配置。您还会看到如何在 Config.groovy 中首次指定 log4j 设置,以及如何使用 JMX 动态调整它们。

  实现 JMX 工具

  JMX 是 2000 年推出的。更确切地说,它是最古老的 JSR 之一 — JSR 3。随着 Java 语言在服务器上越来越流行,远程优化和配置实时运行应用程序成为平台的关键部分。在 2004 年,Sun 使用 JMX 实现了 JVM 并推出了支持工具,比如针对 Java 1.5 JDK 的 JConsole。

  JMX 通过一个统一的接口提供 JVM 内省机制、应用服务器和类。这些不同的组件通过受管 bean(简写为 MBean)呈现给管理控制台。

  MBeans 就像汽车仪表板上的各种仪表、刻度盘和开关。有些仪器是只读的,就像速度计一样;有些仪器是 “可写的”,就像加速器一样。但 MBean 是远程管理工具,所以这个仪表板比喻不是很不恰当。可以将其想象为远程打开汽车的转向灯或改变车里的电台频道。

  启用本地 JMX 代理

  要使用 JMX 进行监控,则必须先启用它。在 Java 5 中,您必须在运行时为 JVM 提供几个与 JMX 相关的标志(在 Java 6 中,这些设置已经就绪,不过您一定要自己设置的话,也是可以的)。在 JMX 中,要设置一个 JMX 代理。清单 1 显示了 JVM 参数:

  清单 1. 启用 JMX 监控的 JVM 参数

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=localhost

  一些教程建议创建一个全局 JAVA_OPTS 环境变量来保存 JMX 标志。其他教程则建议在命令行输入标志:java -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=localhost someExampleClass。

  两种方法都是可行的,但是对生产环境而言它们都不是最好的。我发现最好的方法是在服务器的启动脚本中设置这些值。如果每次重新启动服务器时都要输入这些复杂的标志,则表明这是一个不好的解决方案。应避免设置 CLASSPATH 和 JAVA_OPTS 等全局变量,原因有两个:在复制服务器(在服务器之间复制一个一致的启动脚本更容易)时增加了不必要的配置步骤,而且它们强制同一机器上的所有 Java 进程共享同一配置。是的,您可以创建一个详细的清单来提醒您这些琐碎的配置细节,但是记录复杂的东西远不如将复杂去掉有效。

  对于 UNIX®、Linux® 和 Mac OS X 系统,Grails 启动脚本是 $GRAILS_HOME/bin/grails。编辑这个文件,添加两个 JAVA_OPTS 行,如清单 2 所示:

  清单 2. 在 Grails 启动脚本中为 UNIX、Linux 和 Mac OS X 启用 JMX 监控

#!/bin/sh
DIRNAME
='dirname "$0"'
. "$DIRNAME/startGrails"

export JAVA_OPTS
="-Dcom.sun.management.jmxremote"
export JAVA_OPTS
="$JAVA_OPTS -Djava.rmi.server.hostname=localhost"

startGrails org.codehaus.groovy.grails.cli.GrailsScriptRunner
"$_cnnew1_cnnew1@"

  对于 Windows®,Grails 启动脚本是 $GRAILS_HOME/bin/grails.bat。在调用 startGrails.bat 之前,向 grails.bat 添加两行,如清单 3 所示:

  清单 3. 在 Grails 中为 Windows 启用 JMX 监控

set JAVA_OPTS=-Dcom.sun.management.jmxremote
set JAVA_OPTS=%JAVA_OPTS% -Djava.rmi.server.hostname=localhost

  在两个脚本中,注意第一个 JAVA_OPTS 变量赋值覆盖了全局环境变量(如果有的话)。这个设置只覆盖着一个进程 — 它不会对整个系统的全局变量进行赋值。我这样做的目的是防止全局设置影响本地设置。如果您依赖于已经正确设置的全局值,请确保在开始赋值时包含现有变量,像我在清单 2 和清单 3 的第二行中那样。

  现在,输入 grails run-app 启动 Grails。您看到的内容与控制台输出中的完全相同,不过应用服务器现在已经可以进行监控。

  使用一个 JMX 客户机来监控 JMX 代理。这是一个类似 JConsole 的桌面 GUI(包含在 Java 5 及更高版本中)或 Web UI(包含在大多数服务器中,比如 Tomcat 和 JBoss)。甚至可以编写代码来监控代理,在本文快结束时将提到。

  打开第二个命令行窗口,输入 jconsole。您将在本地 JML 代理列表中看到 Grails,如图 1 所示。单击 Grails,然后单击 Connect 按钮。

  图 1. JConsole 列出了本地 JMX 代理  

  出于安全考虑,只能在使用 NTFS 的 Windows 系统上访问本地 JMX。如果系统使用的是 FAT 或 FAT32,可能会出现问题。但不要担心。在接下来的部分中,我将说明如何设置 JMX 代理进行远程访问。就算代理和客户机刚好位于同一机器上,也不会遇到本地安全问题。

  连接之后,您应该看到类似图 2 所示的摘要页面:

  图 2. JConsole 摘要页面  

  单击 Memory、Threads、Classes 和 VM 选项卡。您可以实时查看 JVM 的内部情况。如果服务器是在物理内存上运行,那么您可以看到实时线程数,甚至能够看到服务器的已经运行时间。这些选项卡非常有趣,不过您马上要将注意力转向 MBeans 选项卡 — 这里将会出现您需要的类。

0
相关文章