SpringBoot 使用Actuator 管理你的Spring

作者: 右耳菌 | 来源:发表于2022-07-20 09:59 被阅读0次

一、Actuator介绍

  • Spring Boot Actuator提供http (或JMX)端点来实现对应用程序的监视和管理、收集运行状况等功能。引入spring-boot-starter-actuator可启用这些功能

  • 默认情况下,通过访问/actuator可以看到所有启用的端点,也可以通过配置修改这个路径地址。例如修改为: management.endpoints.web.base-path = /manage

  • SpringBoot项目引入或者启用Actuator

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

二、端点配置

Spring Boot包含许多内置端点,允许添加自己的端点,可以配置端点是否对外开放或关闭。

  1. 设置默认关闭所有端点(默认开放启用了“health”和“info”)
    management.endpoints.enabled-by-default = false
  1. 启动指定的端点
    management.endpoint.info.enabled = true
  1. 数据缓存
    端点自动缓存对不带任何参数的读取操作的响应。要配置端点缓存响应的时间量
    management.endpoint.<name>.cache.time-to-live = 10s
    <name>需要使用对应的端点名称来代替。

三、Http端点配置

  • Http 配置
    通过HTTP公开除了env和beans端点之外的所有内容
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
  • CORS跨域支持(默认情况下禁用CORS支持)
management.endpoints.web.cors.allowed-origins = http://example.com
management.endpoints.web.cors.allowed-methods = GET,POST
  • 修改ManagerServer服务器配置
    management.server.port = 8081 (如果设置为-1代表禁用http端点)
    management.server.address = 127.0.0.1
    可以配置和web服务使用不同的端口,同时绑定指定IP。(不同端口,代表启动多个tomcat容器)

1. 端点讲解 - Health 健康检查

访问/actuator/health查看程序中组件检查项的运行状况信息,在出现故障时能及时发现。Spring Boot默认提供了对Redis、RabbitMQ、DataSource、MongoDB等组件的检查项。

  • 展示更详细内容(默认never)
    management.endpoint.health.show-details=never (或者when-authorized | always)
  • 返回结果
    如果有检查项处于非检查状态,Http状态码为503,返回值为DOWN或者OUT_OF_SERVICE如果没有检查初问题,返回Http状态码200,返回值UP或者UNKNOWN
  • 自定义健康检查项
    实现HealthIndicator接口,通过spring实例化一个对象,Spring Boot会自动触发健康检查,并归入health的结果。
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * 自定义检查项
 */
@Component
public class MyHealthcheck extends AbstractHealthIndicator {
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        // 测试,具体怎么检查,看你的业务细节
        int i = new Random().nextInt();
        if (i % 2 == 0) {
            builder.withDetail("细节", "1").up();
        } else {
            builder.withDetail("细节", "2").down();
        }
    }
}

结果
2. 端点讲解 - 日志配置
  • SpringBoot日志配置
  • logging.level.root = WARN
  • logging.level.org.springframework.web= DEBUG
  • logging.level.org.hibernate = ERROR
  • 通过/actuator/loggers也可查看日志配置信息

  • 运行时修改配置

curl -X POST -H 'Content-Type: application/json' -i 'http://127.0.0.1:8081/manage/loggers/ROOT' --data '{
"configuredLevel": "DEBUG"
}'

3. 端点讲解 - metrics

Metrics是生产应用中很重要功能,简单可理解为对运行时具体功能的监控。Spring Boot中集成micrometer实现

  • 支持查看哪些数据?
    通过/actuator/metrics查看所有支持的信息,/metrics/{requiredMetricName}查看指定某一项指标JVM内存、线程、GC信息、类加载情况、CPU指标、Http请求统计、Tomcat信息…等等
  • 与监控系统的集成
    支持将数据导出到:AppOptics、Atlas、Datadog、Dynatrace、Elastic、Ganglia、Graphite、Humio、Influx、JMX、KairosDB、New Relic、Prometheus、SignalFx、Simple (in-memory)、StatsD、Wavefront
  • 自定义监控指标
    代码中注入MeterRegistry对象,然后进行手动注册
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@Component
public class MyMetrics {

    private final List<String> words = new CopyOnWriteArrayList<>();

    public MyMetrics(MeterRegistry meterRegistry) {
        meterRegistry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
    }
}

四、自定义端点

可以理解为“概念上类似SpringMVC的controller写法,却又是完全不同的一套APl。”

  • 端点定义:@Endpoint 或@WebEndpoint或@JmxEndpoint
  • 端点操作:@ReadOperation、@WriteOperation、@DeleteOperation
  • 参数接收: web环境下添加@Selector
import org.springframework.boot.actuate.endpoint.annotation.*;
import org.springframework.stereotype.Component;

@Endpoint(id = "myEndpoint")
@Component
public class MyEndPoint {

    String name = "default";

    @ReadOperation
    public String getName() {
        // spring http端点的json格式
        return "{\"name\":\"" + name + "\"}";
    }

    @DeleteOperation
    public void delName() {
        name = "";
    }

    @WriteOperation
    public void setName(@Selector String name) {
        this.name = name;
    }

}

五、快速理解JMX机制

Java Management Extensions (JMX)提供了一种监视和管理应用程序的标准机制。tomcat、kafka、druid都是用的JMX技术来实现对外暴露管理接口和监控信息。

  • 如何Jconsole工具通过JMX技术实现对应用的监控和管理?
  • 通过Spring框架快速增加自定义Mbean
    默认情况下,Spring Boot将管理端点公开为org.springframework.boot域下的JMX MBean。
  • 通过JMX公开所有端点并仅显示端点health和info端点
    management.endpoints.jmx.exposure.exclude=*
    management.endpoints.jmx.exposure.include=info, health

例子

  • JMXTestMBean
public interface JmxTestMBean {
    public String getName();
    public void setName(String name);
    public String printHello();
    public String printHello(String whoName);
}
  • TESTMBean
import org.springframework.stereotype.Component;

@Component
public class JmxTest implements JmxTestMBean {
    private String name;
     
    @Override
    public String getName() {
        return name;
    }
  
    @Override
    public void setName(String name) {
        this.name = name;
    }
  
    @Override
    public String printHello() {
        return "JmxTest "+ name;
    }
  
    @Override
    public String printHello(String whoName) {
        return "JmxTest  " + whoName;
    }
}
  • TestJMXRegListener
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/7/20 9:47
 */
public class TestJMXRegListener implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    JmxTest jmxTest;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        try {
            // create mbean server
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            // create object name
            ObjectName objectName = null;
            objectName = new ObjectName("jmxBean:name=testJM1X");
            // 注册
            server.registerMBean(jmxTest, objectName);
            /**
             * JMXConnectorServer service
             */
            // 这句话非常重要,不能缺少!注册一个端口,绑定url后,客户端就可以使用rmi通过url方式来连接JMXConnectorServer
            Registry registry = LocateRegistry.createRegistry(1099);

            // 构建JMXServiceURL
            JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi://jndi/rmi://localhost:1099/jmxrmi");
            // 创建JMXConnectorServer
            JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, server);
            // 启动
            cs.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 打开jdk自带的jconsole
  • 选中对应的正在运行的程序,然后选中MBean


  • 然后可以看到这里可以对我们的MBean进行一些操作


  • 这里可以动态修改bean里边的值



如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

相关文章

网友评论

    本文标题:SpringBoot 使用Actuator 管理你的Spring

    本文链接:https://www.haomeiwen.com/subject/hlfeirtx.html