Springboot监控

1. 监控的理解

什么是监控?就是通过软件的方式展示另一个软件的运行情况,运行的情况则通过各种各样的指标数据反馈给监控人员。例如网络是否顺畅、服务器是否在运行、程序的功能是否能够整百分百运行成功,内存是否够用,等等等等。
这里的监控就是对软件的运行情况进行监督,但是springboot程序与非springboot程序的差异还是很大的,为了方便监控软件的开发,springboot提供了一套功能接口,为开发者加速开发过程。
一般来说我们监控如下信息:

  • 监控服务状态是否处于宕机状态
  • 监控服务运行指标
  • 监控程序运行日志
  • 管理服务状态

2. Actuator

Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。可以使用HTTP的各种请求来监管,审计,收集应用的运行情况。Spring Boot Actuator提供了对单个Spring Boot的监控,信息包,含:应用状态、内存、线程、堆栈等等,比较全面的监控了Spring Boot应用的整个生命周期。特别对于微服务管理十分有意义。

Actuator监控分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根据自己的实际应用,定义一些比较关心的指标,在运行期进行监控。
原生端点是在应用程序里提供众多Web接口,通过它们了解应用程序运行时的内部状况。
原生端点又可以分成三类:

  1. 应用配置类:可以查看应用在运行期的静态信息:例如自动配置信息、加载的
    springbean信息、yml文件配置信息、环境信息、请求映射信息;
  2. 度量指标类:主要是运行期的动态信息,例如堆栈、请求链、一些健康指标、metrics信息等;
  3. 操作控制类:主要是指shutdown,用户可以发送一个请求将应用的监控功能关闭。
    Actuator提供了13个接口,具体如下表所示。
    在这里插入图片描述在这里插入图片描述

在这里插入图片描述

2.1 体验Actuator

使用Actuator功能与springBoot使用其他功能一样简单,只需要在pom.xml中添加如下依赖:

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

为了保证actuator暴露的监控接口的安全性,需要添加安全控制的依赖spring-boot-
start-security依赖,访问应用监控端点时,都需要输入验证信息。Security依赖,可以
选择不加,不进行安全管理。

配置文件

#展示细节,除了always还有when-authorized,never,默认值是never
management.endpoint.health.show-details= always
#开放所有接口
management.endpoints.web.exposure.include=*
# 自定义信息 和接口/info相对应 要求是以info开头  
info.app.name =spring-boot-actuator 
info.app.version =1.1.0
info.app.test = test
#改变监控指标的路径 将 /actuator/ 自定义为 /monitor
management.endpoints.web.base-path=/monitor

配置完成之后,启动项目就可以继续验证各个监控功能了。

2.2属性详解

在Spring Boot2.x中为了安全期间,Actuator只开放了两个端点/actuator/health和
/actuator/info。可以在配置文件中设置打开。

默认情况下
在这里插入图片描述
management.endpoint.health.show-details= always 可展示健康的详细信息
在这里插入图片描述
配置了以info开头的自定义信息之后显示如下

info.app.name =spring-boot-actuator 
info.app.version =1.1.0
info.app.test = test

在这里插入图片描述
可以打开所有的监控点

management.endpoints.web.exposure.include=*

也可以选择打开部分

management.endpoints.web.exposure.include= beans,trace

Actuator默认所有的监控点路径都在/actuator/*,当然如果有需要这个路径也支持定制。

management.endpoints.web.base-path=/monitor

设置完重启后,再次访问地址就会变成/monitor/*
Actuator几乎监控了应用涉及的方方面面,我们重点讲述一些经常在项目中常用的属性。

  1. health
    health主要用来检查应用的运行状态,这是我们使用最高频的一个监控点。通常使用此接口
    提醒我们应用实例的运行状态,以及应用不”健康“的原因,比如数据库连接、磁盘空间不够默认情况下health的状态是开放的,添加依赖后启动项目,:需要添加
management.endpoint.health.show-details= always 可展示健康的详细信息

访问 http://localhost:8080/actuator/health

health通过合并几个健康指数检查应用的健康情况。Spring Boot Actuator有几个预定义的健
康指标比如DataSourceHealthIndicator,DiskSpaceHealthIndicator,
MongoHealthIndicator,RedisHealthIndicator等,它使用这些健康指标作为健康检查的一部分。

举个例子,如果你的应用使用Redis,RedisHealthindicator将被当作检查的一部分;
如果使用MongoDB,那么MongoHealthIndicator将被当作检查的一部分。

可以在配置文件中关闭特定的健康检查指标,比如关闭redis的健康检查:

management.health.redis.enabled=false

默认,所有的这些健康指标被当作健康检查的一部分。

  1. info
    info就是我们自己配置在配置文件中以info开头的配置信息,比如我们在示例项目中的配置
    是:
info.app.name =spring-boot-actuator
info.app.version =1.1.0
info.app.test = test

启动示例项目,访问:http://localhost:8080/actuator/info返回部分信息如下:
在这里插入图片描述
3. beans
根据示例就可以看出,展示了bean的别名、类型、是否单例、类的地址、依赖等信息。
启动示例项目,访问:http://localhost:8080/actuator/beans
4. mappings
描述全部的uri路径,以及它们和控制器的映射关系 访问路径http://localhost:8080/actuator/mappings

  1. threaddump
    /threaddump接口会生成当前线程活动的快照。这个功能非常好,方便我们在日常定位问题
    的时候查看线程的情况。主要展示了线程名、线程D、线程的状态、是否等待锁资源等信
    息。http://localhost:8080/actuator/threaddump
    生产出现问题的时候,可以通过应用的线程快照来检测应用正在执行的任务

  2. heapdump
    返回一个GZip压缩的JVM堆dump
    启动示例项目,访问:http://localhost:8080/actuator/heapdump会自动生成一个
    Jvm的堆文件heapdump,我们可以使用JDK自带的Jvm监控工具VisualVM打开此文件查
    看内存快照。

  3. conditions
    Spring Boot的自动配置功能非常便利,但有时候也意味着出问题比较难找出具体的原因
    使用conditions可以在应用运行时查看代码了某个配置在什么条件下生效,或者某个自动配
    置为什么没有生效。查看路径 http://localhost:8080/actuator/conditions

  4. shutdown
    开启接口优雅关闭Spring Boot应用,要使用这个功能首先需要在配置文件中开启:

management.endpoint.shutdown.enabled=true

配置完成之后,启动示例项目,使用curl模拟post请求访问shutdown接口。
在这里插入图片描述

或者直接使用postman Post方式 请求 接口http://localhost:8080/actuator/shutdown

3.springboot Admin监控服务端

什么是Spring Boot Admin
Spring Boot Admin,这是一个开源社区项目,用于管理和监控SpringBoot应用程序。这个
项目中包含有客户端和服务端两部分,而监控平台指的就是服务端。我们做的程序如果需要
被监控,将我们做的程序制作成客户端,然后配置服务端地址后,服务端就可以通过HTTP
请求的方式从客户端获取对应的信息,并通过UI界面展示对应信息。

下面就来开发这套监控程序,先制作服务端,其实服务端可以理解为是一个web程序,
收到一些信息后展示这些信息。

3.1 服务端开发

  1. 导入springboot admin对应的starter,.版本与当前使用的springboot版本保持一致,并将其
    配置成web工程
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <!--Spring Boot Admin Server监控服务端-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.7.1</version>
        </dependency>
        <!--增加安全防护,防止别人随便进-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>
  1. application.yml中配置
server:
  port: 9111
spring:
  boot:
    admin:
      ui:
        #服务端标题
        title: 监控
      client:
        instance:
          metadata:
            tags:
              environment: local
          #要获取的client的端点信息 可写可不写
      probed-endpoints: health,env,metrics,httptrace:trace,threaddump:dump,jolokia,info,logfile,refresh,flyway,liquibase,heapdump,loggers,auditevents
      monitor: # 监控发送请求的超时时间
        default-timeout: 20000
  security: # 设置账号密码
    user:
      name: admin
      password: admin
# 服务端点详细监控信息
#management:
#  trace:
#    http:
#      enabled: true
#  endpoints:
#    web:
#      exposure:
#        include: "*"
#  endpoint:
#    health:
#      show-details: always
  1. 主启动类中配置
@SpringBootApplication
@EnableAdminServer
public class SpringbootServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootServerApplication.class, args);
    }

}

  1. 业务类
    springsecurity配置类
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    private final String adminContextPath;

    public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 登录成功处理类
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");

        http.authorizeRequests()
                //静态文件允许访问
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                //登录页面允许访问
                .antMatchers(adminContextPath + "/login", "/css/**", "/js/**", "/image/*").permitAll()
                //其他所有请求需要登录
                .anyRequest().authenticated()
                .and()
                //登录页面配置,用于替换security默认页面
                //.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                //登出页面配置,用于替换security默认页面
                //.logout().logoutUrl(adminContextPath + "/logout").and()
                .httpBasic().and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringAntMatchers(
                        "/instances",
                        "/actuator/**"
                );
    }
}

服务掉线的状态提醒

@Component
public class WarnNotifier extends AbstractStatusChangeNotifier {
    public WarnNotifier(InstanceRepository repository) {
        super(repository);
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        // 服务名
        String serviceName = instance.getRegistration().getName();
        // 服务url
        String serviceUrl = instance.getRegistration().getServiceUrl();
        // 服务状态
        String status = instance.getStatusInfo().getStatus();
        // 详情
        Map<String, Object> details = instance.getStatusInfo().getDetails();
        // 当前服务掉线时间
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(date);
        // 拼接短信内容
        StringBuilder str = new StringBuilder();
        str.append("服务名:【" + serviceName + "】 \r\n");
        str.append("服务状态:【"+ status +"】 \r\n");
        str.append("地址:【" + serviceUrl + "】\r\n");
        str.append("时间:" + format +"\r\n");

        return Mono.fromRunnable(()->{
            // 这里写你服务发生改变时,要提醒的方法
            // 如服务掉线了,就发送短信告知
        });
    }
}

3.2客户端的配置

  1. 依赖
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.7.1</version>
        </dependency>
        </dependencies>
  1. 配置
server:
  port: 9222

spring:
  application:
    name: demo5
  boot:
    admin:
      client: # spring-boot-admin 客户端配置
        url: http://localhost:9111 #服务端连接地址
        username: admin # 服务端账号
        password: admin # 服务端密码
        instance:
          prefer-ip: true

# 服务端点详细监控信息
management:
  # health:  # 检测服务状态是通过http://localhost:9111/actuator/health接口,可去掉不用检测项
  #  mail: # 健康检测时,不要检测邮件
  #   enabled: false
  trace:
    http:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"

  endpoint:
    health:
      show-details: always
    logfile: # 日志(想在线看日志才配)
      external-file: ./logs/client-info.log # 日志所在路径

配置完成启动服务即可
之后访问http://localhost:服务端端口号/applications

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jordan 引理

See https://wuli.wiki/online/JdLem.html#ex_JdLem_1

嵌入式工作岗位未来会不会越来越少?

今日话题&#xff0c;嵌入式工作岗位未来会不会越来越少&#xff1f;未来的嵌入式岗位机会将会逐渐增多&#xff0c;因为嵌入式技术是万物互联的基础&#xff0c;从智能手表到智能汽车&#xff0c;嵌入式都扮演着关键角色。虽然相比计算机科学CS&#xff0c;嵌入式领域的天花板…

libgdx播放视频、libgdx播放MP4、libgdx播放动画(二十二)

libgdx播放视频、libgdx播放MP4、libgdx播放动画 转自&#xff1a;https://lingkang.top/archives/libgdx-bo-fang-shi-pin 转自&#xff1a;https://lingkang.top/archives/libgdx-bo-fang-shi-pin 转自&#xff1a;https://lingkang.top/archives/libgdx-bo-fang-shi-pin 最…

(C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。

要求&#xff1a;原始数组的数据从键盘随机输入&#xff0c;新数组以4行4列的方式输出。 #include<stdio.h> int main() {int matrix[4][4],matrix2[4][4];int count;for(int i 0;i < 4;i )for(int j 0;j < 4;j )scanf("%d",&matrix[i][j]);for(i…

Day40 Advanced Docking System使用方法

1.ads简介 Qt自带的铆接部件是QDockWidget&#xff0c;也被称为浮动窗口部件。QDockWidget可以用来创建可停靠的面板&#xff0c;它能够与QMainWindow、QDialog或任何具有centralWidget的QMainWindow派生类进行连接。QDockWidget提供了一个框架&#xff0c;允许用户将内容面板放…

C 语言指针怎么理解?

今日话题&#xff0c;C 语言指针怎么理解&#xff1f;让我用更简洁的方式来表达这个内容&#xff1a;就像桌面上的快捷方式一样&#xff0c;指针也可以有多层引用。我们可以将指针比作快捷方式的图标&#xff0c;快捷方式可以指向游戏&#xff08;普通指针&#xff09;&#xf…

think5和fastadmin验证规则的使用

在fastadmin中使用验证规则只需要两步即可 第一步 首先在控制器中开启验证规则 protected $modelValidatetrue;//开启验证规则protected $modelSceneValidatetrue;//开启场景验证第二步 在 app\admin\validate 和控制器对应的 validate 中添加 验证规则以及场景验证 <?…

汽车SOA架构设计方法及关键技术

SOA概述 软件定义汽车时代&#xff0c;面向服务的软件架构&#xff08;Service Oriented Architecture, SOA&#xff09;为软件定义汽车提供了一套良好的解决方案。 Q&#xff1a;什么是SOA&#xff1f; SOA将车辆传统的面向信号的架构升级为面向服务的架构&#xff0c;面向…

Leetcode刷题详解——不同路径 III

1. 题目链接&#xff1a;980. 不同路径 III 2. 题目描述&#xff1a; 在二维网格 grid 上&#xff0c;有 4 种类型的方格&#xff1a; 1 表示起始方格。且只有一个起始方格。2 表示结束方格&#xff0c;且只有一个结束方格。0 表示我们可以走过的空方格。-1 表示我们无法跨越的…

主流接口测试框架对比,究竟哪个更好用

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 需求 1、接口编写…

Git 补丁使用

cmd进入到改目录 执行命令 比如tag1.11.4 到 tag 1.12.0 生成文件 the-patch.diff C:\code\Sandboxie>git diff v1.11.4 v1.12.0 -- > the-patch.diff 把这个the-patch.diff 拷贝到你的工程目录下 cmd到你的工程目录下 执行命令 git apply --reject the-patch.diff …

【溶解度工具】上海道宁为您带来了解溶解度、分散性、扩散、色谱等问题的强大而实用的软件集——HSPiP

高度参数化的UNIFAC技术 可以提供出色的预测 COSMO-RS方法的量子化学基础 可以在明确的公式中进行精确预测 Abraham参数和NRTL-SAC 也各有其独特的功能 优秀的配方师会使用 正确的工具来完成手头的工作 如果您必须只使用一种工具 那么它应该是 HSP 因为它可以很好地解…

MySQL锁机制详解

概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一…

看看高情商的CHAT如何写演讲稿?

问CHAT&#xff1a;以“世界问候日&#xff0c;关心你我他”为主题&#xff0c;小学生国旗下讲话稿400字 CHAT 回复&#xff1a; 尊敬的校领导、亲爱的老师、可爱的同学们&#xff1a; 大家好&#xff01; 今天&#xff0c;在这蓝天白云、红旗飘扬的校园里&#xff0c;我代表…

vue3配置导航栏和页脚(附代码)

一&#xff1a;前言 本文主要是针对刚上手 Vue3 的初学者所写。涉及内容比较简单&#xff0c;没有太过于复杂的逻辑。因此有想学神入知识的可以看一下别的文章。 本次实验的技术是 Vue3 TypeScript Element Plus 。因为这三个是在 Vue 开发中经常一起出现的。如果没有学过的话…

RT-DETR算法优化改进:Backbone改进 | VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

💡💡💡本文独家改进: VanillaNet助力RT-DETR ,替换backbone,简到极致、浅到极致!深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

安卓:打包apk时出现Execution failed for task ‘:app:lintVitalRelease

Execution failed for task :lintVitalRelease 程序可以正常运行&#xff0c;但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败&#xff0c;原因是执行lintVitalRelease失败了&#xff0c;存在错误。解决办法&#xff1a;在app模块的build.…

【原创分享】DC-DC电源PCB设计要点

DC-DC电源是一种用于将直流&#xff08;DC&#xff09;电压转换为不同电压级别的电源。它通过内部的电路和拓扑结构&#xff0c;将输入电压调整为所需的输出电压&#xff0c;并提供稳定的电力供应。 DC-DC电源通常包括输入端子、输出端子、开关元件&#xff08;如开关管&#…

神通MPP数据库的跨库查询

神通MPP数据库的跨库查询 一. 简介二. 系统表三. 跨库查询语法1. 创建外部数据存储服务器2. 删除外部数据存储服务器3. 授予普通用户访问外部数据存储服务器权限4. 回收普通用户访问外部数据存储服务器权限5. 加密函数6. 访问外部数据存储服务器 ★ 四. 跨库查询&#xff1a;统…