【问题标题】:Java monitoring: JMX vs. ServletsJava 监控:JMX 与 Servlet
【发布时间】:2012-05-18 20:50:48
【问题描述】:

在过去的几年里,我学到了很多关于 JMX 的知识,并为我的 Web 应用程序构建了一些非常漂亮的 MBean。但是,我不确定我对一个非常基本的问题有一个好的答案:

为什么在简单的 HTTP servlet 上使用 JMX?

我当前的 Web 应用程序提供了冗余监控选项:我可以使用 JConsole 之类的客户端通过 JMX 访问需要监控的数据,或者我可以通过 servlet 访问 XML 格式的相同数据。我没有看到使用一种方法优于另一种方法的充分理由,但 servlet 方法确实具有可由简单的 http 客户端/网络浏览器读取的主要优势。

我可以看到 JMX 对于非 Web 应用程序的 Java 应用程序非常有用,但我看不出将 JMX 用于 Web 应用程序有什么好处。

【问题讨论】:

    标签: java servlets monitoring jmx


    【解决方案1】:

    为什么在简单的 HTTP servlet 上使用 JMX?

    在我看来,JMX 更好有 3 个原因:

    1. 启用监控点所需的代码更少。
    2. 它端到端处理 Java 序列化对象,因此具有更好的数据一致性。
    3. 它适用于不基于 servlet 的程序(如您所述)。

    JMX 为特定数据项提供了更简单的接口。您当然可以在多个 servlet 中编写相同的功能,但我更容易公开那些使用 JMX 的功能。

    例如,如果您使用 Spring,那么您可以使用 org.springframework.jmx.export 注释(@ManagedResource@ManagedAttribute 等)来标记您的类。我还发布了我的SimpleJmx framework,这样您就可以轻松地通过几个独立于 Spring 的注释来公开属性和操作。例如:

    @JmxResource(domainName = "j256", objectName = "lookupCache")
    public class LookupCache {
    
        // this can also be done as @JmxAttributeMethod on the getter/setters
        @JmxAttributeField(description = "Number of hits in the cache")
        private int hitCount;
        ...
    
        @JmxOperation(description = "Flush the cache")
        public void flushCache() {
           ...
        }
    }
    

    我有一个fully working example program 来看看它是如何工作的。因此,公开一个值或操作所需要做的就是为类以及每个属性和/或方法添加一个注释。使用 SimpleJmx 发布它的代码如下所示。 Spring 与 bean 类似:

    // create a new server listening on port 8000
    JmxServer jmxServer = new JmxServer(8000);
    jmxServer.start();
    // register our lookupCache object defined above
    jmxServer.register(lookupCache);
    

    要在 servlet 中获得类似的功能,将需要更多的代码,而不仅仅是注解。也就是说,可能存在在 servlet 领域提供类似功能的框架,但我不知道。

    还有一些注意事项:

    • 可能有更好的监控工具可以处理 HTTP/HTML,但也有大量的分布式 JMX 监控应用程序。可能是折腾。
    • 能够以编程方式从 JMX 服务器获取 对象 是一个优势,而不仅仅是来自 servlet 页面的字符串。 SimpleJmx 也支持一个简单的 JMX 客户端,尽管有更好的客户端。
    • 显然,JVM 已经默认发布了许多其他有价值的数据:VM 设置、线程详细信息、内存信息等。

    【讨论】:

      【解决方案2】:

      除了读取值之外,JMX 还可用于调用管理 Bean 上的方法。

      例如,我们经常使用它来对 Tomcat 实例远程强制进行 JVM 垃圾回收。

      另外,由于 JMX 是与 http/https 不同的端口,您可以通过防火墙在网络级别限制访问。 JMX 也有内置的用户名/密码认证。

      Web servlet 必须实现它自己的访问控制。

      【讨论】:

        【解决方案3】:

        在我看来,JMX 被高估了,配置起来可能很棘手。 如果您的应用程序已经是一个网络容器,我认为您绝对应该选择一个简单的 servlet。

        一个小小的servlet approach like nudge4j 会给你一切,甚至更多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-11
          • 1970-01-01
          • 2021-06-14
          • 2018-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多