基于 JMX 的监控与管理

Java Management Extensions(JMX,Java 管理扩展)为监控和管理应用提供了标准机制。 默认情况下,该特性未启用。 你可以通过将 spring.jmx.enabled 配置属性设置为 true 来开启。 Spring Boot 会将最合适的 MBeanServer 作为名为 mbeanServer 的 bean 暴露。 所有带有 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 还会将管理端点作为 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: "*"