返回顶部
首页 > 资讯 > 后端开发 > Python >聊一聊SpringBoot服务监控机制
  • 387
分享到

聊一聊SpringBoot服务监控机制

2024-04-02 19:04:59 387人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的。 就目前而言,大

前言

任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的。

就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 springBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用。

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

SpringBoot 监控

SpringBoot 中的监控可以分为 Http 端点和 JMX 两种方式来监控当前应用的运行状况和指标收集

HTTP Endpoints 监控

执行器端点允许您监视应用程序并与之交互。SpringBoot 包括许多内置的端点,并允许我们添加自己的端点。可以通过 HTTPJMX 启用或禁用每个端点,并公开(使其可以远程访问)。每个端点都有一个唯一的 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>

默认就可以通过地址 http:localhost:8080/actuator/health,访问之后得到如下结果:

在这里插入图片描述

SpringBoot 中提供了非常多的默认端点监控,但是出于安全考虑,默认情况下有些端点并不是开启状态,如 shutdown 端点就是默认关闭的。

内置端点

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

端点 id 描述
auditevents 公开当前应用程序的审计事件信息,需要 AuditEventRepository Bean。
beans 展示程序中所有的 Bean。
caches 公开可用的缓存
conditions 展示配置类或者自动装配类中的条件,以及它们匹配或者不匹配的原因。
configprops 显示所有 @ConfigurationProperties 中的配置属性。
env 显示 ConfigurableEnvironment 中的所有环境。
health 显示应用程序运行状况信息。
httptrace 显示 HTTP 跟踪信息(默认情况下统计最近 100 次请求),需要 HttpTraceRepository Bean。
info 显示任意程序信息。
integrationgraph 显示 Spring 集成图,需要依赖 spring-integration-core。
loggers 展示和修改应用中的 loggers 配置。
metrics 展示当前应用监控指标的度量。
mappings 展示所有 @RequestMapping 路径。
scheduledtasks 展示应用中的所有定时任务信息。
sessions 允许从 Spring 会话支持的会话存储中检索和删除用户会话。需要使用基于 Spring Session WEB应用程序。
shutdown 优雅的关闭程序,默认禁止了该端点的访问。

虽然说这里的大部分端点都是默认开启的,但是默认暴露(允许对外访问)的只有 healthinfo 端点,所以如果需要允许端点对外暴露,可以通过如下配置(如果想要暴露所有的端点,则可以直接配置 "*" ):


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/actuator/loggers 可以查看当前应用的日志级别等信息:

在这里插入图片描述

这里面本身并不特别,但是有一个功能却非常有用,比如我们生产环境日志级别一般都是 info,但是现在有一个 bug 通过 info 级别无法排查,那么我们就可以临时修改 log 级别。

比如上图中的 ROOT 节点是 info 级别,那么我们可以通过 postman工具来发一个 post 请求修改日志级别。

在这里插入图片描述

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

在这里插入图片描述

metrics 端点

metrics 是一个非常重要的监控端点,其监控内容覆盖了 JVM 内存、堆、类加载、处理器和 Tomcat 容器等一些重要指标:

在这里插入图片描述

可以看到这里面包含了非常多的指标,任意访问一个指标就可以查看对应的指标信息:

在这里插入图片描述

自定义监控端点

通过上面的介绍,可以看到 SpringBoot 提供的监控非常强大,但是就算再全面的监控也不可能满足所有人的需求,所以 SpringBoot 也支持自定义监控端点。

自定义监控端点常用注解

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

  • @Endpoint:定义一个监控端点,同时支持 HTTPJMX 两种方式。
  • @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;
      }
    }
  }
}

@Component 注解表示将该类交给 Spring 进行管理,或者也可以再定义一个 Configuration 类来加载该 Bean 也可以,当然,如果我们需要提供给第三方使用,如果无法保证当前包名被扫描,则需要使用 SpringBoot 的自动装配机制将该类进行管理。

@ReadOperation 方法可以返回 String 或者 JSONObject 或者 Map 集合等。参数上加了 @Selector 注解则表示访问断端点的时候可以直接访问子节点。

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

在这里插入图片描述

同时,因为 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 的使用,并分别介绍了其中两种监控类型 HTTPJMX,最后通过一个例子来实现了自定义的端点,同时也实现了手动注册一个 MBean 的方法。

到此这篇关于聊一聊SpringBoot服务监控机制的文章就介绍到这了,更多相关SpringBoot服务监控机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 聊一聊SpringBoot服务监控机制

本文链接: https://lsjlt.com/news/123021.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 聊一聊SpringBoot服务监控机制
    前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的。 就目前而言,大...
    99+
    2024-04-02
  • 一文聊聊Node中的内存控制
    3.内存指标会存在一些认为会回收但是却没有被回收的对象,会导致内存占用无限增长。一旦增长达到v8的内存限制,将会得到内存溢出错误,进而导致进程退出。3.1 查看内存使用情况process.memoryUsage()可以查看内存使用情况。除此...
    99+
    2023-05-14
    前端 Node.js 后端
  • 聊一聊Java的JVM类加载机制
    目录加载(Loading)连接(Linking)初始化(Initialization)类初始化的时机总结Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换...
    99+
    2023-05-16
    Java JVM JVM类加载机制
  • 一文聊聊php中的垃圾回收机制
    本篇文章带大家深入了解一下php中的垃圾回收机制,希望对大家有所帮助!一、引用计数基础知识每个php变量存在一个叫 zval 的变量容器中。一个 zval 变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是 is_ref,...
    99+
    2024-04-02
  • SpringBoot服务监控机制的原理是什么
    这期内容当中小编将会给大家带来有关SpringBoot服务监控机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。SpringBoot 监控SpringBoot 中的监控可以分为 HTTP 端点...
    99+
    2023-06-14
  • 浅聊一下Java中的锁机制
    目录synchronized关键字原理使用方法代码示例Lock接口原理使用方法公平锁与非公平锁可重入锁代码示例总结Java中的锁机制是保证多线程并发访问共享资源安全性的重要手段之一。...
    99+
    2023-03-01
    Java锁机制原理 Java锁机制使用 Java锁机制
  • SpringBoot服务监控机制原理解析(面试官常问)
    目录前言SpringBoot 监控HTTP Endpoints 监控内置端点自定义监控端点JMX 监控如何手动注册一个 JMX MBean其他监控总结前言 任何一个服务如果没有监控,...
    99+
    2024-04-02
  • 聊聊Go语言怎么构建一个简单的HTTP服务
    在如今的软件开发领域中,Go语言已经成为了极其活跃的语言之一。与其他语言相比,Go语言独特的并发模型和轻量级的线程架构使得它非常适合构建高并发的网络应用、分布式系统和云服务。本文将介绍如何使用Go语言构建一个简单的HTTP服务,并且涉及到如...
    99+
    2023-05-14
  • 基于小程序制作一个ChatGPT聊天机器人
    在AI技术日新月异的浪潮中,将ChatGPT与实战开发相结合,制作一个随身携带的聊天机器人,紧贴前沿的同时稳固基础。 一、前言 1.1、什么是ChatGPT 1.2、什么是文本完成 ...
    99+
    2023-08-30
    chatgpt 机器人 微信小程序 原力计划
  • 聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题
    前提 最近由于业务发展,需要调研一套完善和主流的基础架构,进行中台化(微服务)的实施,考虑到技术栈切换到SOFAStack。既然整个体系都切换到蚂蚁金服的技术栈,那么自然考虑一些基础...
    99+
    2024-04-02
  • 聊聊如何使用php swoole来搭建一个高性能的服务器环境
    随着计算机技术的不断发展,现在的服务器框架也变得越来越复杂了,你是否曾经遇到过访问量大、响应速度慢等问题?php swoole是一种新兴的服务器框架,它可以使用PHP语言来构建高性能的网络服务器和客户端。在本文中,我们将介绍关于如何使用ph...
    99+
    2023-05-14
  • 阿里云服务器监控与宝塔监控不一致
    如果您的宝塔监控和云服务器的监控数据不一致,可能会导致一些问题,例如: 云服务器监控不能提供准确的监控结果。云服务提供商通常提供了详细的监控功能,但是宝塔监控只能提供粗略的监控结果。 云服务器监控可能存在误报和遗漏。如果您在使用宝塔监控...
    99+
    2023-10-27
    阿里 宝塔 服务器
  • 实战网络监控Zabbix(1)—— 远程监控主机服务
    1. Zabbix 简介        Zabbix 是一个高度集成的网络监控解决方案,可以提供企业级的开源分布式监控解决方案...
    99+
    2024-04-02
  • 阿里云服务器监控与宝塔监控不一致吗
    首先,阿里云服务器监控是基于云端服务器的实时监测,通过分析服务器的各项指标数据,包括CPU使用率、内存使用情况、磁盘I/O、网络连接等,来判断服务器的运行状态。宝塔监控则是针对阿里云服务器中的宝塔进行监控,宝塔是一种特殊的结构,具有一定的稳...
    99+
    2023-10-28
    阿里 宝塔 服务器
  • Java SpringBoot快速集成SpringBootAdmin管控台监控服务详解
    目录1、初识SpringBootAdmin2、搭建服务端--POM文件中添加相关依赖3、修改服务端application启动类4、配置security安全信息5、启动server服务...
    99+
    2024-04-02
  • 一体云服务器怎么用手机控制
    使用手机控制智能手机的方法非常简单。首先,我们需要下载一款名为“云控”的应用,然后注册账号,安装后就可以使用了。在使用过程中,我们需要按照应用的提示操作,将手机连接到一体云服务器上,然后在应用的主页面中选择“控制”选项,接着点击“开始控制”...
    99+
    2023-10-28
    用手 服务器 一体云
  • 阿里云服务器监控与宝塔监控不一致怎么办
    加强服务器日志监控:定期对服务器的日志进行监控,及时发现异常情况并进行处理。宝塔监控可以实现对服务器各项指标的监控,包括CPU利用率、内存使用率、磁盘I/O、网络I/O等,可以及时发现异常情况并进行处理。 采用多种技术手段:加强对服务器系...
    99+
    2023-10-27
    阿里 宝塔 服务器
  • 阿里云服务器监控与宝塔监控不一致怎么解决
    首先,要明确的是,阿里云服务器监控和宝塔监控的数据来源和采集方式都是不同的。阿里云服务器监控是通过阿里云的云端应用服务,如ECS、RDS等来采集数据的。而宝塔监控则是通过宝塔网络设备(如交换机、防火墙等)来采集数据的。 因此,当两个监控系...
    99+
    2023-10-28
    阿里 宝塔 服务器
  • 聊城阿里云一级代理公司的选择与服务
    本文将介绍聊城地区的一些阿里云一级代理公司,帮助读者了解他们的服务和特点,为选择合适的代理公司提供参考。 1. 聊城某科技有限公司聊城某科技有限公司是一家专业的阿里云一级代理公司,他们提供全面的云计算解决方案。他们的服务包括云服务器、云数据...
    99+
    2023-12-30
    聊城 阿里 一级代理
  • 远程控制云服务器怎么用手机控制
    在使用远程控制云服务器之前,用户需要确保自己的设备已连接到网络。然后,用户需要使用手机或平板电脑进入云服务器的管理页面,并选择要控制的应用程序。在应用程序的操作过程中,用户需要输入相应的账户和密码,以确保账户的安全。 通过远程控制云服务器...
    99+
    2023-10-28
    用手 远程控制 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作