【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的监控:使用 Actuator 实现健康检查

  <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、引子:监控这事儿,不能光靠“瞅”

咱们搞开发的,最怕的就是系统出问题,结果自己还蒙在鼓里。你说你写的代码,跑得好好的,突然就“拉胯”了,用户那边嗷嗷叫,你这边还一脸懵。这不就跟“瞎子摸象”似的,摸到哪儿算哪儿,最后还得靠运气。所以啊,监控这事儿,不能光靠“瞅”,得有点真家伙。

Spring Boot 里头有个叫 Actuator 的玩意儿,专门用来监控应用的健康状态。这玩意儿就跟“千里眼”似的,能让你一眼瞅见系统里头哪儿不对劲。今儿个咱就唠唠,咋用 Actuator 实现健康检查。

二、Actuator 是啥?能吃吗?

Actuator 是 Spring Boot 提供的一个模块,专门用来监控和管理应用。它提供了一堆端点(Endpoint),通过这些端点,你可以查看应用的运行状态、健康情况、内存使用情况等等。说白了,就是给你开了个“后门”,让你能随时“偷窥”系统的内部情况。

Actuator 的核心功能包括:

  • 健康检查(Health Check)
  • 指标收集(Metrics)
  • 环境信息(Environment)
  • 线程信息(Thread Dump)
  • 日志管理(Loggers)

这些功能就跟“工具箱”似的,里头啥都有,随用随取。今儿个咱主要唠唠健康检查这块儿。

三、健康检查:别等“病入膏肓”才想起来治

健康检查是 Actuator 里头最常用的功能之一。它能告诉你应用现在是“生龙活虎”还是“病入膏肓”。你可能会说,这不就跟“体检”似的吗?没错,就是体检。不过这个体检是实时的,随时都能做。

1. 咋启用 Actuator?

首先,你得在 pom.xml 里头加上 Actuator 的依赖:

XML Code

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

加完依赖,启动应用,Actuator 就自动启用了。默认情况下,Actuator 的端点是通过 HTTP 暴露的,你可以通过 /actuator 路径访问这些端点。

2. 健康检查端点

健康检查的端点是 /actuator/health。你可以在浏览器里访问这个端点,或者用 curl 命令:

bash Code

curl http://localhost:8080/actuator/health

返回的结果大概是这样的:

JSON Code

{

    "status": "UP"

}

这个 status 字段告诉你应用的健康状态。UP 表示应用正常,DOWN 表示应用挂了。

3. 自定义健康检查

默认的健康检查只能告诉你应用是不是还活着,但有时候你需要的不仅仅是“活着”。比如,你可能想知道数据库连接是不是正常,磁盘空间是不是够用,外部服务是不是能访问。这时候,你就得自定义健康检查了。

Spring Boot 提供了一个 HealthIndicator 接口,你可以实现这个接口,自定义健康检查的逻辑。比如,你想检查数据库连接是不是正常,可以这么写:

Java Code

import org.springframework.boot.actuate.health.Health;

import org.springframework.boot.actuate.health.HealthIndicator;

import org.springframework.stereotype.Component;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

@Component

public class DatabaseHealthIndicator implements HealthIndicator {

    @Override

    public Health health() {

        try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password")) {

            if (connection.isValid(1)) {

                return Health.up().build();

            } else {

                return Health.down().withDetail("Error", "Database connection is invalid").build();

            }

        } catch (SQLException e) {

            return Health.down(e).build();

        }

    }

}

这个 DatabaseHealthIndicator 类实现了 HealthIndicator 接口,检查数据库连接是不是正常。如果连接正常,返回 UP,否则返回 DOWN。

4. 健康检查的坑

自定义健康检查虽然好用,但也有坑。最大的坑就是健康检查的逻辑不能太复杂,否则会影响应用的性能。比如,你要是每次健康检查都去连接数据库,那数据库的压力可就大了。所以,健康检查的逻辑要尽量简单,别整得太复杂。

另外,健康检查的结果是缓存的,默认情况下,缓存时间是 10 秒。也就是说,你改了健康检查的逻辑,得等 10 秒才能看到效果。你要是觉得 10 秒太长,可以通过配置改:

Yml Code

management:

  endpoint:

    health:

      cache:

        time-to-live: 1s

这个配置把缓存时间改成了 1 秒。

四、其他端点:别光盯着健康检查

Actuator 里头不光有健康检查,还有其他一堆端点。这些端点就跟“工具箱”里的其他工具似的,各有各的用处。

1. 指标收集(Metrics)

指标收集的端点是 /actuator/metrics。这个端点能告诉你应用的各项指标,比如内存使用情况、CPU 使用情况、请求次数等等。你可以通过这个端点,实时监控应用的性能。

bash Code

curl http://localhost:8080/actuator/metrics

返回的结果大概是这样的:

JSON Code

{

    "names": [

        "jvm.memory.max",

        "jvm.memory.used",

        "jvm.threads.live",

        "http.server.requests"

    ]

}

你可以通过 /actuator/metrics/{metricName} 查看具体的指标。比如,查看内存使用情况:

bash Code

curl http://localhost:8080/actuator/metrics/jvm.memory.used

2. 环境信息(Environment)

环境信息的端点是 /actuator/env。这个端点能告诉你应用的环境变量、配置文件里的配置项等等。你可以通过这个端点,查看应用的配置是不是正确。

bash Code

curl http://localhost:8080/actuator/env

返回的结果大概是这样的:

JSON Code

{

    "activeProfiles": [],

    "propertySources": [

        {

            "name": "server.ports",

            "properties": {

                "local.server.port": {

                    "value": 8080

                }

            }

        },

        {

            "name": "applicationConfig: [classpath:/application.yml]",

            "properties": {

                "management.endpoint.health.cache.time-to-live": {

                    "value": "1s"

                }

            }

        }

    ]

}

3. 线程信息(Thread Dump)

线程信息的端点是 /actuator/threaddump。这个端点能告诉你应用的所有线程的状态。你可以通过这个端点,查看应用是不是有线程死锁、线程阻塞等问题。

bash Code

curl http://localhost:8080/actuator/threaddump

返回的结果大概是这样的:

JSON Code

{

    "threads": [

        {

            "threadName": "main",

            "threadId": 1,

            "blockedCount": 0,

            "blockedTime": -1,

            "waitedCount": 0,

            "waitedTime": -1,

            "lockName": null,

            "lockOwnerId": -1,

            "lockOwnerName": null,

            "inNative": false,

            "suspended": false,

            "threadState": "RUNNABLE",

            "stackTrace": [

                {

                    "className": "java.lang.Thread",

                    "methodName": "sleep",

                    "fileName": "Thread.java",

                    "lineNumber": -2,

                    "nativeMethod": true

                }

            ],

            "lockedMonitors": [],

            "lockedSynchronizers": [],

            "lockInfo": null

        }

    ]

}

4. 日志管理(Loggers)

日志管理的端点是 /actuator/loggers。这个端点能告诉你应用的日志配置。你可以通过这个端点,动态修改日志级别。

bash Code

curl http://localhost:8080/actuator/loggers

返回的结果大概是这样的:

JSON Code

{

    "levels": [

        "OFF",

        "ERROR",

        "WARN",

        "INFO",

        "DEBUG",

        "TRACE"

    ],

    "loggers": {

        "ROOT": {

            "configuredLevel": "INFO",

            "effectiveLevel": "INFO"

        },

        "com.example": {

            "configuredLevel": null,

            "effectiveLevel": "INFO"

        }

    }

}

你可以通过 /actuator/loggers/{loggerName} 修改某个 Logger 的日志级别。比如,把 com.example 的日志级别改成 DEBUG:

bash Code

curl -X POST http://localhost:8080/actuator/loggers/com.example -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}'

五、安全性:别让人“偷家”

Actuator 的端点虽然好用,但也有安全隐患。你要是把这些端点暴露在外网,那可就相当于“开门揖盗”了。所以,你得做好安全措施。

1. 只暴露必要的端点

默认情况下,Actuator 只暴露了 /actuator/health 和 /actuator/info 两个端点。你可以通过配置,暴露其他端点:

Yml Code

management:

  endpoints:

    web:

      exposure:

        include: "*"

这个配置暴露了所有端点。你要是觉得不安全,可以只暴露必要的端点:

Yml Code

management:

  endpoints:

    web:

      exposure:

        include: "health,info,metrics"

2. 启用安全认证

你可以通过 Spring Security 启用安全认证,保护 Actuator 的端点。比如,你可以配置一个简单的 HTTP Basic 认证:

Java Code

import org.springframework.context.annotation.Bean;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.security.core.userdetails.User;

import org.springframework.security.core.userdetails.UserDetails;

import org.springframework.security.core.userdetails.UserDetailsService;

import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http

            .authorizeRequests()

                .antMatchers("/actuator/**").authenticated()

                .and()

            .httpBasic();

    }

    @Bean

    @Override

    public UserDetailsService userDetailsService() {

        UserDetails user = User.withDefaultPasswordEncoder()

            .username("admin")

            .password("password")

            .roles("USER")

            .build();

        return new InMemoryUserDetailsManager(user);

    }

}

这个配置启用了 HTTP Basic 认证,只有用户名是 admin,密码是 password 的用户才能访问 Actuator 的端点。

专有名词解释

  1. Actuator:Spring Boot 提供的一个模块,用于监控和管理应用。
  2. HealthIndicator:Spring Boot 提供的一个接口,用于自定义健康检查的逻辑。
  3. Metrics:Spring Boot 提供的指标收集功能,用于监控应用的性能。
  4. Environment:Spring Boot 提供的环境信息功能,用于查看应用的环境变量和配置项。
  5. Thread Dump:Spring Boot 提供的线程信息功能,用于查看应用的所有线程的状态。
  6. Loggers:Spring Boot 提供的日志管理功能,用于查看和修改应用的日志配置。

写在最后

身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...

我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。

当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。

另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。

最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!

(来呀~↓↓↓~老铁)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类和对象(下篇)(详解)

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…

高精度算法

高精度加法 输入两个数&#xff0c;输出他们的和&#xff08;高精度&#xff09; 输入样例 111111111111111111111111111111 222222222222222222222222222222 输出样例 333333333333333333333333333333 #include <bits/stdc.h> using namespace std;string a,b; in…

Linux开发中注意哪些操作系统安全

在 Linux 开发中&#xff0c;确保操作系统的安全至关重要。以下是一些需要注意的方面&#xff1a; 用户管理与权限控制 合理设置用户权限&#xff1a;为不同的用户和用户组分配适当的权限&#xff0c;遵循最小权限原则。避免给普通用户过多的权限&#xff0c;以免他们误操作或…

x64dbg调试python解释器

可以先写个input()这会让dbg中断在ntdll模块中&#xff0c;查看调用堆栈在系统调用结束后的打断点 然后直接断到PyObject_Vectorcall函数

✅ Ultralytics YOLO验证(Val)时自动输出COCO指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)

✅ YOLO获取COCO指标(3)&#xff1a;验证(Val) 启用 COCO API 评估&#xff08;自动输出AP指标&#xff09;| 发论文必看&#xff01; | Ultralytics | 小白友好 文章目录 一、问题定位二、原理分析三、解决方案与实践案例步骤 1: 触发 COCO JSON 保存步骤 2: 确保 self.is_coc…

【嵌入式学习3】基于python的tcp客户端、服务器

目录 1、tcp客户端 2、tcp服务器 3、服务器多次连接客户端、多次接收信息 1、tcp客户端 """ tcp:客户端 1. 导入socket模块 2. 创建socket套接字 3. 建立tcp连接(和服务端建立连接) 4. 开始发送数据(到服务端) 5. 关闭套接字 """ import soc…

Linux: network: 两台直连的主机业务不通

前提环境,有一个产品的设定是两个主机之间必须是拿网线直连。但是设备管理者可能误将设置配错,不是直连。 最近遇到一个问题,说一个主机发的包,没有到对端,一开始怀疑设定的bond设备的问题,检查了bond的设置状态,发现没有问题,就感觉非常的奇怪。后来就开始怀疑两个主机…

COMSOL固体力学接触

目录 一、接触非线性及接触面积计算 一、接触非线性及接触面积计算 COMSOL接触非线性及接触面积计算_哔哩哔哩_bilibili 形成联合体&#xff0c;在定义处右键选择“建立接触对” 位移dz使用参数化扫描。 接触选择定义中设置的接触对&#xff0c;选择罚函数&#xff0c;摩擦设置…

22.OpenCV轮廓匹配原理介绍与使用

OpenCV轮廓匹配原理介绍与使用 1. 轮廓匹配的基本概念 轮廓匹配&#xff08;Contour Matching&#xff09;是计算机视觉中的一种重要方法&#xff0c;主要用于比较两个轮廓的相似性。它广泛应用于目标识别、形状分析、手势识别等领域。 在 OpenCV 中&#xff0c;轮廓匹配主要…

oracle 快速创建表结构

在 Oracle 中快速创建表结构&#xff08;仅复制表结构&#xff0c;不复制数据&#xff09;可以通过以下方法实现&#xff0c;适用于需要快速复制表定义或生成空表的场景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 复制源表的全部列和数据类型&#xff0c;但不复制数据 C…

若依原理笔记

代码生成器 源码分析 查询数据库列表 导入表结构 生成代码 修改generator.yml配置文件 代码生成器增强 Velocity模版引擎 基础语法-变量 Lombok集成 E:\javaProject\dkd-parent\dkd-generator\src\main\resources\vm\java\domain.java.vm package ${packageName}.domain;#fo…

Ansible的使用

##### Ansible使用环境 - 控制节点 - 安装Ansible软件 - Python环境支持&#xff1a;Python>2.6 - 必要的模块&#xff1a;如PyYAML等 - 被控节点 - 启用SSH服务 - 允许控制节点登录&#xff0c;通常设置免密登录 - Python环境支持 http://www.ansible.com/ …

C++ 提高编程:模板与 STL 深度剖析

摘要&#xff1a;本文深入探讨 C 提高编程中的模板编程与标准模板库&#xff08;STL&#xff09;相关内容。详细阐述模板编程中函数模板和类模板的概念、语法、特性及应用案例&#xff1b;对 STL 的诞生背景、基本概念、六大组件进行剖析&#xff0c;并对常用容器、函数对象、常…

C++(类模板的运用)

使用vector实现一个简单的本地注册登录系统 注册&#xff1a;将账号密码存入vector里面&#xff0c;注意防重复判断 登录&#xff1a;判断登录的账号密码是否正确 #include <iostream> #include <vector> #include <fstream> #include <sstream> usi…

【大模型】DeepSeek+蓝耕MaaS平台+海螺AI生成高质量视频实战详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…

接口自动化学习二:session自动管理cookie

session自动管理cookie&#xff1a; cookie中的数据&#xff0c;都是session提供的 实现步骤&#xff1a; 1.创建session对象&#xff1b;my_sessionrequests.Session() 2.使用session实例&#xff0c;调用get方法&#xff0c;发送获取验证码请求&#xff08;不需要提取cookie&…

C++类型转换详解

目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言&#xff0c;在内置类型之间转换规则和C语言一样的&am…

QEMU源码全解析 —— 块设备虚拟化(17)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…

Java 大视界 -- Java 大数据机器学习模型在智能客服多轮对话系统中的优化策略(179)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…