Spring Boot 怎么做监控?这篇总算整明白了。。。(2)

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: Spring Boot 怎么做监控?这篇总算整明白了。。。(2)

自定义监控端点

通过上面的介绍,可以看到 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/spring-boot-best-practice


①@Component 注解表示将该类交给 Spring 进行管理,或者也可以再定义一个 Configuration 类来加载该 Bean 也可以。


当然,如果我们需要提供给第三方使用,如果无法保证当前包名被扫描,则需要使用 SpringBoot 的自动装配机制将该类进行管理。


②@ReadOperation 方法可以返回 String 或者 JSONObject 或者 Map 集合等。


③参数上加了 @Selector 注解则表示访问断端点的时候可以直接访问子节点。


完成了上面的类,启动 SpringBoot 应用,接下来就可以直接通过 http://localhost:8080/actuator/myEndpoint 进行访问了:

image.png

同时,因为 test3_1 方法使用了 @Selector 注解,所以我们可以通过这个方法每一个指标的明细:

image.png

而带有 @WriteOperation 注解的方法可以用来修改指标,这个方法需要用 post 进行访问,访问的参数可以直接使用字符串传参,也可以直接使用 json 进行传参,修改之后再次查看就可以发现指标已经被动态修改:

image.png


| JMX 监控

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

通过 JMX 我们可以监控服务器中各种资源的使用情况以及线程,内存和 CPU 等使用情况。


打开 jdk 下提供的工具 jConsole:

image.png

打开之后这里会监控到我们已经启动的应用,双击进入:

image.png


如何手动注册一个 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:

image.png


同样的,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 的方法。





相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
8天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
19 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
81 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
43 1
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
61 2
消息中间件 缓存 监控
121 0
|
3月前
|
Java Spring 监控
Spring Boot Actuator:守护你的应用心跳,让监控变得触手可及!
【8月更文挑战第31天】Spring Boot Actuator 是 Spring Boot 框架的核心模块之一,提供了生产就绪的特性,用于监控和管理 Spring Boot 应用程序。通过 Actuator,开发者可以轻松访问应用内部状态、执行健康检查、收集度量指标等。启用 Actuator 需在 `pom.xml` 中添加 `spring-boot-starter-actuator` 依赖,并通过配置文件调整端点暴露和安全性。Actuator 还支持与外部监控工具(如 Prometheus)集成,实现全面的应用性能监控。正确配置 Actuator 可显著提升应用的稳定性和安全性。
128 0
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
291 6
|
4月前
|
监控 Java 微服务
Spring Boot微服务部署与监控的实战指南
【7月更文挑战第19天】Spring Boot微服务的部署与监控是保障应用稳定运行和高效维护的重要环节。通过容器化部署和云平台支持,可以实现微服务的快速部署和弹性伸缩。而利用Actuator、Prometheus、Grafana等监控工具,可以实时获取应用的运行状态和性能指标,及时发现并解决问题。在实际操作中,还需根据应用的具体需求和场景,选择合适的部署和监控方案,以达到最佳效果。