通过 JMX 进行监控和管理

Java Management Extensions (JMX) 提供了一种标准的机制来监控和管理应用程序。 默认情况下,此功能未启用。 你可以通过将 spring.jmx.enabled 配置属性设置为 true 来启用它。 Spring Boot 将最合适的 MBeanServer 作为 ID 为 mbeanServer 的 bean 暴露出来。 任何使用 Spring JMX 注解(@org.springframework.jmx.export.annotation.ManagedResource、@ManagedAttribute 或 @ManagedOperation)的 bean 都会被暴露给它。

如果你的平台提供了标准的 MBeanServer,Spring Boot 会使用它,并在必要时默认使用 VM MBeanServer。 如果这些都失败了,则会创建一个新的 MBeanServer。

spring.jmx.enabled 仅影响 Spring 提供的管理 bean。 启用其他库提供的管理 bean(例如 Log4j2 或 Quartz)是独立的。

有关更多详细信息,请参见 JmxAutoConfiguration 类。

默认情况下,Spring Boot 还将管理端点作为 JMX MBean 暴露在 org.springframework.boot 域下。 要完全控制 JMX 域中的端点注册,请考虑注册你自己的 EndpointObjectNameFactory 实现。

自定义 MBean 名称

MBean 的名称通常从端点的 id 生成。 例如,health 端点被暴露为 org.springframework.boot:type=Endpoint,name=Health。

如果你的应用程序包含多个 Spring ApplicationContext,你可能会发现名称冲突。 要解决此问题,你可以将 spring.jmx.unique-names 属性设置为 true,以便 MBean 名称始终是唯一的。

你还可以自定义端点暴露的 JMX 域。 以下设置显示了在 application.properties 中执行此操作的示例:

  • Properties

  • YAML

spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp
spring:
  jmx:
    unique-names: true
management:
  endpoints:
    jmx:
      domain: "com.example.myapp"

禁用 JMX 端点

如果你不想通过 JMX 暴露端点,可以将 management.endpoints.jmx.exposure.exclude 属性设置为 *,如下例所示:

  • Properties

  • YAML

management.endpoints.jmx.exposure.exclude=*
management:
  endpoints:
    jmx:
      exposure:
        exclude: "*"