通过 JMX 进行监控和管理

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

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

spring.jmx.enabled 只影响 Spring 提供的管理 Bean。启用其他库(例如 Log4j2Quartz)提供的管理 Bean 是独立的。

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

默认情况下,Spring Boot 还在 org.springframework.boot 域下将管理端点暴露为 JMX MBeans。要完全控制 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: "*"