当前位置: 首页 > news >正文

[第十三篇] Spring Boot监控

简介

        本文介绍了基于SpringBootAdmin的微服务监控方案。主要内容包括:1. 监控意义和实施方式,强调服务主动上报机制;2. SpringBootAdmin平台搭建,包含服务端和客户端的配置步骤;3. 监控内容配置,详细说明健康信息、端点控制等监控项的配置方法;4. 监控原理分析,基于Actuator实现端点数据采集;5. 端点扩展应用,包括Info、Health、Metrics等端点的自定义实现。该方案通过可视化界面集中展示服务运行状态,支持自定义监控指标,为微服务系统提供全面的监控管理能力。

目录

一、监控意义

二、监控实施方式

三、可视化监控平台

1、创建Admin服务端

2、引入Web依赖

3、开启Admin服务端功能

4、启动项目

四、监控服务

1、被监控服务引入依赖

2、引入Web依赖

3、配置Admin服务端信息

4、启动被监控服务

五、被监控内容

1、监控服务的健康信息

2、endpoint端点

(1)简介

(2)开放端点

3、监控指定的请求

六、Admin服务端监控原理

1、Actuator

2、示例

(1)获取所有被监控服务的端点的信息

(2)访问端点详细信息

七、端点的相关配置

1、控制端点是否显示在web端页面

2、控制端点信息是否开启

3、扩展:通过JMX查看端点信息

八、端点的使用

1、Info端点

(1)简单配置

(2)复杂实现

2、health端点

(1)简介

(2)设置health端点自定义信息

3、metrics端点

4、自定义端点


一、监控意义

  • 监控服务状态是否宕机
  • 监控服务运行指标(内存、虚拟机、线程、请求等)
  • 监控日志
  • 管理服务(服务下线)
  • ... ...

二、监控实施方式

        需要有一个服务统一管理被监控服务的信息,并且被监控服务是否决定被监控是由被监控的服务自己配置的,需要被监控哪些信息也是由被监控的服务自己配置的。

  • 显示监控信息的服务器:用于获取服务信息,并显示对应的信息
  • 运行的服务:启动时主动上报,告知监控服务器自己需要收到监控

三、可视化监控平台

        Spring Boot Admin,开源社区项目,用于管理和监控SpringBoot应用程序。客户端注册到服务端之后,通过HTTP请求方式,服务端定期从客户端获取对应信息,并通过UI界面展示对应信息。客户端就是被监控的服务,服务端就是Spring Boot Admin项目用于统一管理客户端被监控的信息。

1、创建Admin服务端

        创建一个新项目,并引入Admin服务端的依赖即可。值得注意的是,Admin服务端的依赖版本一定要与当前SpringBoot项目的版本保持一致。

<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>与SpringBoot项目版本保持一致</version>
</dependency>

        修改一下Admin服务端项目的端口号,防止同时起多个服务时发生端口冲突。

server:port: 8888

2、引入Web依赖

        当前服务需要成为一个Web服务启动项目,接收被监控服务上报的信息,并提供网页的监控信息的可视化页面。

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

3、开启Admin服务端功能

        在Admin服务端项目的启动类上声明@EnableAdminServer注解,表示当前项目时Admin服务端项目,用于接收监控信息。

4、启动项目

        直接启动Admin服务端项目,然后访问IP:端口号,即可进入监控信息页面,因为当前并没有监控任何服务,所以信息都是空白的。

四、监控服务

1、被监控服务引入依赖

        在需要被监控的项目中引入Admin客户端依赖。值得注意的是,Admin客户端的依赖版本一定要与当前SpringBoot项目的版本保持一致。

<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.5.4</version>
</dependency>

2、引入Web依赖

        若是一个纯净的SpringBoot工程的话,直接启动是会直接停止的,所以需要引入Web依赖。再次启动,当前服务器就会一直运行,然后在Admin服务端就能看到服务的运行信息。

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

3、配置Admin服务端信息

        在被监控服务的配置文件中配置Admin服务端的Url即可被Admin服务端监控。这里是提供了很多的配置信息的,目前只需要关注Admin服务端地址配置即可,后续会对其他信息进行讲解。

spring:boot:admin:client:url: http://IP地址:端口号

4、启动被监控服务

        同时启动Admin服务端和Admin客户端,然后访问Admin服务端的监控页面,可以看到Admin客户端已经被监控。

五、被监控内容

        点击应用墙上的应用就会进入详情页面,被监控的应用的运行信息默认是不上报的,只要在被监控端配置之后才能在监控页面看到指定的详细信息。

1、监控服务的健康信息

        进入被监控服务,然后提供监控健康信息的配置,默认值是never,表示不提供健康信息,配置值含义如下:

  • never:不提供健康信息(默认)
  • always:提供全量健康信息
  • when_authorized:经过授权才提供
management:endpoint:health:show-details: always

        当配置为always之后,可以看到监控页面的健康标签多了详细信息。

2、endpoint端点

(1)简介

        在Admin服务端的监控页面的被监控服务的详情页面中,一个标签就是一个endpoint端点,在系统中默认就是只开放了一个“健康”endpoint端点,虽然开放了,但是健康的具体展示信息还是需要配置的。

(2)开放端点

        在被监控的服务的配置文件中通过endpoints的include配置可决定开放的端点,默认配置就是“health”,所以在页面上会有一个健康的标签,但是健康标签的具体展示信息还得单独配置。如果配置为“*”就代表展示所有。

management:endpoints:web:exposure:include: *

        配置成“*”之后,再次启动被监控服务,可以看到所有能开放的endpoint端点。

3、监控指定的请求

        被监控的服务如果是一个Web程序的话,还可以在Admin服务端的被监控服务的详情页面配置监控指定的请求。前提是需要开放性能的端点,然后在Admin服务端的性能页面,选择http.server.requests,然后在下方选择路径即可。若某请求路径不存在,则代表被监控服务在监控期间并未接收到某请求。

        下面的页面是因为刚开始监控了demo请求,然后我在代码里将demo请求删除了,然后发现其他正常请求也不出数据,后来发现在页面上将异常请求删除即可。

        正常监控页面

六、Admin服务端监控原理

1、Actuator

        Actuator功能提供了SpringBoot的生产就绪功能,通过直接向被监控服务发送http请求,得到端点的配置与访问信息。

        Actuator功能是SpringBoot的原生功能,并不是由SpringBootAdmin提供,所以普通的SpringBoot工程只需要开启Actuator功能,那么就会开放若干个http请求请求链接,通过这些链接就可以拿到系统对应的信息,这些信息就是叫做端点,比如系统是否健康的信息,就是健康端点。在普通的SpringBoot工程引入spring-boot-starter-actuator依赖即代表开启Actuator功能。SpringBootAdmin不过只是使用了这一功能特性。

  • 端点描述了一组监控信息,SpringBoot提供了多个内置端点,也可以根据需要自定义端点信息。
  • 访问当前被监控服务的所有端点信息:http://被监控服务的IP:端口/actuator
  • 访问端点详细信息:http://被监控服务的IP:端口/actuator/信息名称
  • Spring Boot Actuator详情官方文档

2、示例

(1)获取所有被监控服务的端点的信息

        向被监控服务发送http请求,路径就是/actuator,然后可以在返回的信息中看到每一个href就是一个端点,可直接通过href路径访问详细的端点信息。

(2)访问端点详细信息

        向被监控服务发送http请求,请求的“健康”端点的详细信息,可以看到返回的信息就是Admin被监控页面的“健康”标签的展示信息。

七、端点的相关配置

        端点的控制权是在被监控程序里的,所以针对于端点的控制配置是在被监控的程序中设置的,Admin服务端只起展示作用。

        使用默认配置,然后直接启动被监控服务,可以看到在控制台输出的信息提示“暴露出基础路径“/执行器”下方的13个端点”,也就是说默认是有13个端点信息共查看。然后在Admin服务端的web页面可以看到有端点的详细信息。

1、控制端点是否显示在web端页面

        在被监控的程序中,是可以通过配置来决定是否将端点信息展示到Admin服务端的web页面的,include配置指定“*”表示所有端点都展示在web端,如果只需要展示特点的端点,那么只需要在include配置指定即可。例如下面只需要将health和info端点信息展示到web页面。

        也可以在配置文件中使用exclude表示排除什么,一般不使用exclude。

2、控制端点信息是否开启

        上面仅仅只是控制了端点的信息不展示在Admin服务端的web页面,但是被监控服务的端点的信息还是能通过其他方式得到的。若设置了端点功能关闭的话,同时当前这个端点也不会在Admin服务端的web页面展示。设置端点功能关闭,只需要在 endpoint 配置中将 端点名称:enabled 的配置改成false即可,默认为true。

        另外在 endpoint 配置中healt时最基本的配置,不允许去掉。

        在 endpoints 配置中也是能够配置所有的端点是否启用或关闭,只需要配置enabled-by-default的值为false即可。

        例如将info功能关闭,调整为不暴露。可以看到在日志信息中的提示都变成了12个端点,默认13个端点。然后通过http请求查询被监控服务的端点信息,也可以发现已经没有了info端点的URL。同时Admin服务端的web页面也不在展示info(信息)端点的详情。

3、扩展:通过JMX查看端点信息

        在CMD控制台输入“jconsole”然后在弹出的页面选择监控的程序即可。这个是Java提供的,通过JMX的形式获取端点信息,同样项目也是支持JMX形式的配置的,与web配置相同。

八、端点的使用

1、Info端点

        Info端点也就是Admin服务端Web页面中的信息展示框,一般用于记录项目的详细介绍或者其他有关于项目的详细信息。默认是无展示内容的,可以在被监控对应的项目中进行配置展示信息。

(1)简单配置

        只需要在配置文件里面,以info开头然后在下面写一些需要展示的详细信息即可,键就是展示的名称,值就是展示的内容。例如展示项目的名称、版本、描述信息,这里使用占位符读取了pom.xml文件的内容:

(2)复杂实现

        在配置文件中写的展示信息都是固定的,无法通过程序动态获取或动态展示,若想实现动态获取或动态展示信息,那么按以下步骤即可。

        首先创建一个类并使用@Component注解声明,然后实现InfoContributor接口,然后重写contribute方法,contribute方法有一个形参,是一个Info的内部类Builder类型的对象,然后在方法里面使用Builder对象调用withDetail方法,withDetail方法接收两个参数,第一个参数是字符串类型,第二个参数是Object类型,其实也就对应着页面显示的标题和内容。withDetail也有其他重写方法,可以直接接收一个Map类型的形参。可以使用链式编程,一直调用withDetail方法填充数据。例如:

/*** 自定义信息端点展示信息类*/
@Component
public class InfoDemoPoint implements InfoContributor {@Overridepublic void contribute(Info.Builder builder) {builder.withDetail("nowTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));Map<String, Object> map = new HashMap<>();map.put("area", "北京");builder.withDetails(map);}
}

        自定义展示信息类和配置文件信息是能共存的,只不过重名的时候以自定义类的信息为准。

2、health端点

        health端点也就是健康端点。

(1)简介

        健康端点代表了一个应用里面的状态信息,例如数据库链接信息、磁盘信息等。所以说健康端点展示的就是当前应用内部工作的组件当前的工作状态。假如当前应用依赖十几个组件,那么在健康端点展示信息这里可以看到各个组件的工作状态,当所有的状态都是UP时,那么整个实例才是UP状态,有一个出问题,那么实例的状态就会跟随改变。

        例如在当前应用添加一个Redis组件,可以看到在健康端点展示信息里就多了一个Redis信息的框。如果没有连接Redis的话健康的状态就会显示为红色的DOWN。只有Redis正常连接才会显示为绿色的UP。

(2)设置health端点自定义信息

        健康端点,是不能通过类似于在配置文件里面配置Info端点一样配置自定义信息的,只能通过编码实现。

        首先创建一个类并使用@Component注解声明,然后继承AbstractHealthIndicator抽象类,重写doHealthCheck方法,doHealthCheck方法有一个形参,是一个Health的内部类Builder类型的对象,然后在方法里面使用Builder对象调用withDetail方法,withDetail方法接收两个参数,第一个参数是字符串类型,第二个参数是Object类型,其实也就对应着页面显示的标题和内容。withDetail也有其他重写方法,可以直接接收一个Map类型的形参。可以使用链式编程,一直调用withDetail方法填充数据。

/*** 设置健康端点的自定义信息*/
@Component
public class HealthConfig extends AbstractHealthIndicator {/*** 重写方法* @param builder* @throws Exception*/@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {// 添加自定义信息builder.withDetail("nowTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));Map<String, Object> map = new HashMap<>();map.put("area", "上海");builder.withDetails(map);}}

        重启项目,可以看到在health端点展示信息中多了一个自定义的展示详情。但是当前自定义的展示详情的状态却是UNKNOWN,因为默认的状态就是UNKNOWN,当然这个状态也是可以设置的。

        在doHealthCheck方法中使用Builder对象调用指定的状态方法,即可设置当前展示详情的状态信息。可以调用的有up(),down(),unknown(),outOfService(),直接调用指定的方法就可以设置自定义展示详情的状态信息。但是一般使用Builder对象调用status方法,然后传递Status类型对应的枚举值来设置状态。

        能够设置health端点自定义信息后,就可以在health端点中根据一些条件来添加一些组件或者其他的展示信息。

3、metrics端点

        metrics端点就是页面的性能指标信息。

        这里主要说明一下metrics端点怎么添加自定义信息。下面以统计查询操作次数为例,结合AOP实现。

        首先创建一个自定义的注解,创建一个AOP类,然后在AOP类中注入MeterRegistey类,然后编写切入方法,在切入方法里使用MeterRegistey类的对象调用counter统计方法得到Counter类型的统计对象,counter统计方法接收一个字符串类型的形参,这个形参就是当前这个自定义信息的名称,再使用Counter类型的统计对象调用increment方法进行递增。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CountAnnotation {
}@Component
@Aspect
@Slf4j
public class CountAop {@Autowiredprivate MeterRegistry meterRegistry;@Before("@annotation(com.xbb.annotation.CountAnnotation)")public void before(JoinPoint joinPoint) {Counter counter = meterRegistry.counter("查询学生次数");counter.increment();}
}@RestController
@RequestMapping("/students")
@Api(tags = "学生信息管理")
public class StudentController {@Autowiredprivate IStudentService studentService;@GetMapping("/{id}")@ApiOperation(value = "通过id查询学生信息")@CountAnnotationpublic Student getById(@PathVariable Integer id) {return studentService.getById(id);}
}

        重启项目,第一次是在性能的指标中看不到添加的自定义指标的,只有接收了一次请求之后,指标才会显示出来。于是在性能指标页面就可以看到刚刚添加的自定义信息,选择之后就可以在下面的页面中查看到监控信息,这样每次在调用查询方法的时候,统计功能就会加一。当然也可以通过MeterRegistry对象对自定义性能指标做大量其他操作。

4、自定义端点

        首先创建一个类并使用@Component注解声明,然后通过使用@Endpoint注解声明当前是一个端点类,并在@Endpoint注解里对id属性赋值来声明当前端点的名称,以及对enableByDefault属性赋值来声明是否启用,若不在这对enableByDefault属性赋值,那么就需要在配置文件的management.endpoint下声明当前端点启用。

        然后写一个方法,并使用@ReadOperation注解进行声明读取端点的操作,也就是当直接使用HTTP请求端点时程序会做什么操作,并且当前方法的返回值就决定了访问当前端点后返回的信息。

/*** 自定义端点*/
@Component
@Endpoint(id = "demo",enableByDefault = true)
public class DemoPoint {@ReadOperationpublic Object getMsg() {return "hello world!This is a custom endpoint.";}
}

        可以在Admin服务端页面的映射中查看到有了当前自定义端点的自定义方法。

        可以直接通过HTTP访问actuator得到的端点信息中,看到自定义端点已经存在,如果直接使用HTTP访问当前端点路径,就可以得到被@ReadOperation注解声明的方法的返回值信息。

http://www.dtcms.com/a/298357.html

相关文章:

  • 网络安全-机遇与挑战
  • leetcode 3487. 删除后的最大子数组元素和 简单
  • Java排序算法之<冒泡排序>
  • [python][flask]Flask-Principal 使用详解
  • SpringBoot学习路径--SpringBoot的简单介绍和项目搭建
  • Kafka运维实战 15 - kafka 重设消费者组位移入门和实战【实战】
  • Qt 数据库事务处理与数据安全
  • Qt OpenGL 集成:开发 3D 图形应用
  • 工程师实践出真知
  • 上位机知识篇---Jetson Nano的深度学习GPU推理
  • 基于springboot的小区车位租售管理系统
  • 代码随想录算法训练营第三十天
  • MySQL索引背后的B+树奥秘
  • 7月25日 农业农村部与中国气象局联合发布农田渍涝灾害风险预警
  • 标准电码本(修订本)
  • 搜索引擎简介
  • ZABBIX配置自动发现与自动注册,网易邮箱告警和钉钉告警
  • 如何高效通过3GPP官网查找资料
  • 解决electron+vue-router在history模式下打包后首页空白问题
  • 前端html使用svg实现弧线和圆点样式
  • 服务器托管:网站经常被攻击该怎么办?
  • 线段树学习笔记 - 练习题(3)
  • 查看网站证书有效期
  • 深度学习篇---归一化标准化颜色空间转化
  • Vue3中的标签 ref 与 defineExpose:模板引用与组件暴露
  • 【STM32】CUBEMX下FreeRTOS 任务栈管理与栈溢出检测(CMSIS_V2接口)
  • 【软件工程】构建软件合规防护网:双阶段检查机制的实践之道
  • 双非上岸985!专业课140分经验!信号与系统考研专业课140+上岸中南大学,通信考研小马哥
  • LeetCode51~70题解
  • 多模态大模型研究每日简报(2025-07-24)