乐趣区

关于java:Spring-Boot-怎么做监控这篇总算整明白了

作者:双子孤狼 \
起源:https://blog.csdn.net/zwx9001…

任何一个服务如果没有监控,那就是两眼一抹黑,无奈晓得以后服务的运行状况,也就无奈对可能呈现的异样情况进行很好的解决,所以对任意一个服务来说,监控都是必不可少的。

就目前而言,大部分微服务利用都是基于 SpringBoot 来构建,所以理解 SpringBoot 的监控个性是十分有必要的,而 SpringBoot 也提供了一些个性来帮忙咱们监控利用。

本文基于 SpringBoot 2.3.1.RELEASE 版本演示。

SpringBoot 监控

SpringBoot 中的监控能够分为 HTTP 端点和 JMX 两种形式来监控以后利用的运行状况和指标收集。

| HTTP Endpoints 监控

执行器端点容许您监督应用程序并与之交互。SpringBoot 包含许多内置的端点,并容许咱们增加本人的端点。能够通过 HTTP 或 JMX 启用或禁用每个端点,并公开(使其能够近程拜访)。

每个端点都有一个惟一的 id,拜访时能够通过如下地址进行拜访:http:ip:port/{id}(SpringBoot 1.x)。

而在 SpringBoot 2.x 版本中,默认新增了一个 /actuator 作为根本路,拜访地址则对应为:http:ip:port/actuator/{id}。

应用 HTTP 监控非常简单,在 SpringBoot 我的项目中,引入如下依赖:

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

Spring Boot 根底就不介绍了,举荐下这个实战教程:https://github.com/javastacks…

默认就能够通过地址 http:localhost:8080/actuator/health,拜访之后失去如下后果:

SpringBoot 中提供了十分多的默认端点监控,然而出于平安思考,默认状况下有些端点并不是开启状态,如 shutdown 端点就是默认敞开的。

内置端点

SpringBoot 中默认提供的罕用内置端点如下:

尽管说这里的大部分端点都是默认开启的,然而默认裸露(容许对外拜访)的只有 health 和 info 端点,所以如果须要容许端点对外裸露,能够通过如下配置(如果想要裸露所有的端点,则能够间接配置 “*”):

management:
  endpoints:
    web:
      exposure:
        include: [health,info,mappings] // 或者间接配置 "*"

另外,开启或禁用某一个端点,也能够通过通过如下配置进行动态控制:

management.endpoint.<id>.enabled=true

接下来咱们筛选几个重点的端点来介绍一下。

health 端点

health 断点默认只是展现以后利用衰弱信息,然而咱们能够通过另一个配置关上详细信息,这样不仅仅会监控以后利用,还会监控与以后利用相干的其余第三方利用,如 Redis。

management:
  endpoint:
    health:
      show-details: always

这个配置关上之后,咱们连贯上 Redis 之后再次拜访 health 端点,就能够展现 Redis 服务的衰弱信息了:

loggers 端点

拜访 http://localhost:8080/actuato… 能够查看以后利用的日志级别等信息:

这外面自身并不特地,然而有一个性能却十分有用,比方咱们生产环境日志级别个别都是 info,然而当初有一个 bug 通过 info 级别无奈排查,那么咱们就能够长期批改 log 级别。

比方上图中的 ROOT 节点是 info 级别,那么咱们能够通过 postman 等工具来发一个 post 申请批改日志级别。

批改之后就会发现,日志由原来的 info 变成了 debug:

metrics 端点

metrics 是一个十分重要的监控端点,其监控内容笼罩了 JVM 内存、堆、类加载、处理器和 tomcat 容器等一些重要指标:

能够看到这外面蕴含了十分多的指标,任意拜访一个指标就能够查看对应的指标信息:

自定义监控端点

通过下面的介绍,能够看到 SpringBoot 提供的监控十分弱小,然而就算再全面的监控也不可能满足所有人的需要,所以 SpringBoot 也反对自定义监控端点。

自定义一个监控端点次要有如下罕用注解:

  • @Endpoint: 定义一个监控端点,同时反对 HTTP 和 JMX 两种形式。
  • @WebEndpoint: 定义一个监控端点,只反对 HTTP 形式。
  • @JmxEndpoint: 定义一个监控端点,只反对 JMX 形式。

以上三个注解作用在类上,示意以后类是一个监控端点,另外还有一些注解会用在办法和参数上:

  • @ReadOperation: 作用在办法上,可用来返回端点展现的信息(通过 Get 办法申请)。
  • @WriteOperation: 作用在办法上,可用来批改端点展现的信息(通过 Post 办法申请)。
  • @DeleteOperation: 作用在办法上,可用来删除对应端点信息(通过 Delete 办法申请)。
  • @Selector: 作用在参数上,用来定位一个端点的具体指标路由。

来,一起写一个本人的监控端点,定义一个类,并应用 @Endpoint 注解标注标识,同时定义几个办法用 @ReadOperation 和 @WriteOperation 注解来标注:

@Endpoint(id="myEndpoint")
@Component
public class MyEndpoint {
    private String STATUS = "up";
    private String DETAIL = "一切正常";

//    @ReadOperation
//    public String test1(){
//        return "wolf";
//    }

//    @ReadOperation
//    public Map<String,String> test2(){//        Map<String,String> map = new HashMap();
//        map.put("status","up");
//        return map;
//    }

    @ReadOperation
    public JSONObject test3(){JSONObject jsonObject= new JSONObject();
        jsonObject.put("status",STATUS);
        jsonObject.put("detail",DETAIL);
        return jsonObject;
    }

    @ReadOperation
    public JSONObject test3_1(@Selector String name){JSONObject jsonObject= new JSONObject();
        if ("status".equals(name)){jsonObject.put("status",STATUS);
        }else if ("detail".equals(name)){jsonObject.put("detail",DETAIL);
        }
        return jsonObject;
    }

    @WriteOperation// 动静批改指标
    public void test4(@Selector String name,@Nullable String value){if (!StringUtils.isEmpty(value)){if ("status".equals(name)){STATUS = value;}else if ("detail".equals(name)){DETAIL = value;}
        }
    }
}

Spring Boot 根底就不介绍了,举荐下这个实战教程:https://github.com/javastacks…

@Component 注解示意将该类交给 Spring 进行治理,或者也能够再定义一个 Configuration 类来加载该 Bean 也能够。

当然,如果咱们须要提供给第三方应用,如果无奈保障以后包名被扫描,则须要应用 SpringBoot 的主动拆卸机制将该类进行治理。

@ReadOperation 办法能够返回 String 或者 JSONObject 或者 Map 汇合等。

参数上加了 @Selector 注解则示意拜访断端点的时候能够间接拜访子节点。

实现了下面的类,启动 SpringBoot 利用,接下来就能够间接通过 http://localhost:8080/actuato… 进行拜访了:

同时,因为 test3_1 办法应用了 @Selector 注解,所以咱们能够通过这个办法每一个指标的明细:

而带有 @WriteOperation 注解的办法能够用来批改指标,这个办法须要用 post 进行拜访,拜访的参数能够间接应用字符串传参,也能够间接应用 json 进行传参,批改之后再次查看就能够发现指标曾经被动静批改:

| JMX 监控

JMX 全称为 Java Management Extensions,即 Java 治理扩大。它提供了对 Java 应用程序和 JVM 的监控治理。

通过 JMX 咱们能够监控服务器中各种资源的应用状况以及线程,内存和 CPU 等应用状况。

关上 jdk 下提供的工具 jConsole:

关上之后这里会监控到咱们曾经启动的利用,双击进入:

如何手动注册一个 JMX MBean?

定义一个接口 SystemInfoMBean(留神名字必须要用 MBean 结尾):

public interface SystemInfoMBean {int getCpuCore();
    long getTotalMemory();
    void shutdown();}

再定义一个类实现 SystemInfoMBean 接口,实现类的明明形式为接口名去掉 MBean:

public class SystemInfo implements SystemInfoMBean {
    @Override
    public int getCpuCore() {return Runtime.getRuntime().availableProcessors();}
    @Override
    public long getTotalMemory() {return Runtime.getRuntime().totalMemory();}

    @Override
    public void shutdown() {System.exit(0);
    }
}

最初就是须要将该实现类进行注册:

public class JmxRegisterMain {public static void main(String[] args) throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, MalformedObjectNameException, IOException {MBeanServer mBeanServer= ManagementFactory.getPlatformMBeanServer();
        ObjectName objectName=new ObjectName("com.lonely.wolf.note.springboot.actuator.jmx:type=SystemInfo");
        SystemInfo SystemInfo =new SystemInfo();
        mBeanServer.registerMBean(SystemInfo,objectName);// 注册
        System.in.read();// 避免程序完结}
}

运行该 main 办法,再关上 jConsole 就能够看到胜利注册了一个 MBean:

同样的,Spring 当中只有咱们应用了 @Endpoint 或者 @JmxEndpoint 注解,就会主动帮咱们注册一个 MBean,其原理也是利用了主动拆卸机制。

除了 SpringBoot 自带的监控之外,也有其余第三方开源的弱小监控零碎,如 Prometheus,而且 SpringBoot 也将其进行了集成,应用 Prometheus 时只须要引入如下 jar 包即可:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

当然,如果应用 Prometheus 的话须要独自装置,而且个别会抉择 Prometheus + Grafana 来独特实现一个监控平台,在这里就不做过多介绍,如果感兴趣的敌人能够本人去理解下这两种软件的应用。

总结

本文次要讲述了 Spring Boot actuator 的应用,并别离介绍了其中两种监控类型 HTTP 和 JMX,最初通过一个例子来实现了自定义的端点,同时也实现了手动注册一个 MBean 的办法。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版