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

news2025/4/17 15:03:15

  <前文回顾>

点击此处查看 合集 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.coloradmin.cn/o/2330793.html

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

相关文章

蓝桥杯—数字接龙(dfs+减枝)

一.题目 二.思路 一看就是迷宫问题的变种&#xff0c;从左上角到达右下角&#xff0c;要解决 1.8个方向的方向向量&#xff0c;用dx&#xff0c;dy数组代表方向向量 2.要按照一个规律的数值串进行搜索0&#xff0c;1&#xff0c;2&#xff0c;k-1&#xff0c;0&#xff0c;1…

Docker与VNC的使用

https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc 下载nvc 客户端 https://downloads.realvnc.com/download/file/viewer.files/VNC-Viewer-7.12.0-Windows.exe 服务端 docker pull dorowu/ubuntu-desktop-lxde-vnc#下载成功 docker pull dorowu/ubuntu-desktop-l…

C++——清明

#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory> #include <ctime>using namespace std;class Weapon; // 前置声明class Hero{ pr…

手搓多模态-06 数据预处理

前情回顾 我们目前实现了视觉模型的编码器部分&#xff0c;然而&#xff0c;我们所做的是把一张图片编码嵌入成了许多个上下文相关的嵌入向量&#xff0c;然而我们期望的是一张图片用一个向量来表示&#xff0c;从而与文字的向量做点积形成相似度&#xff08;参考手搓多模态-01…

HCIP【路由过滤技术(详解)】

目录 1 简介 2 路由过滤方法 3 路由过滤工具 3.1 静默接口 3.2 ACL 3.3 地址前缀列表 3.4 filter-policy 3.4.1 filter-policy过滤接收路由&#xff08;以RIP为例&#xff09; 3.4.2 filter-policy过滤接收路由&#xff08;以OSPF为例&#xff09; 1 简介 路由过滤技术…

【AI插件开发】Notepad++ AI插件开发实践(代码篇):从Dock窗口集成到功能菜单实现

一、引言 上篇文章已经在Notepad的插件开发中集成了选中即问AI的功能&#xff0c;这一篇文章将在此基础上进一步集成&#xff0c;支持AI对话窗口以及常见的代码功能菜单&#xff1a; 显示AI的Dock窗口&#xff0c;可以用自然语言向 AI 提问或要求执行任务选中代码后使用&…

Vue3在ZKmall开源商城前端的应用实践与技术创新

ZKmall开源商城作为一款企业级电商解决方案&#xff0c;其前端架构基于Vue3实现了高效、灵活的开发模式&#xff0c;结合响应式设计、组件化开发与全链路性能优化&#xff0c;为多端协同和复杂业务场景提供了先进的技术支持。以下从技术架构、核心特性、性能优化等维度解析Vue3…

SpringAI+MCP协议 实战

文章目录 前言快速实战Spring AISpring AI 集成 MCP 协议Spring Mcp Client 示例Spring Mcp Server 示例 前言 尽管Python最近成为了编程语言的首选&#xff0c;但是Java在人工智能领域的地位同样不可撼动&#xff0c;得益于强大的Spring框架。随着人工智能技术的快速发展&…

[数据结构]图krusakl算法实现

目录 Kruskal算法 Kruskal算法 我们要在连通图中去找生成树 连通图&#xff1a;在无向图中&#xff0c;若从顶点v1到顶点v2有路径&#xff0c;则称顶点v1与顶点v2是连通的。如果图中任意一对顶点都是连通的&#xff0c;则称此图为连通图。 生成树&#xff1a;一个连通图的最小…

QEMU学习之路(5)— 从0到1构建Linux系统镜像

QEMU学习之路&#xff08;5&#xff09;— 从0到1构建Linux系统镜像 一、前言 参考&#xff1a;从内核到可启动镜像&#xff1a;0到1构建你的极简Linux系统 二、linux源码获取 安装编译依赖 sudo apt install -y build-essential libncurses-dev flex bison libssl-dev li…

node ---- 解决错误【Error: error:0308010C:digital envelope routines::unsupported】

1. 报错 在 Node.js 18.18.0 的版本中&#xff0c;遇到以下错误&#xff1a; this[kHandle] new _Hash(algorithm, xofLen);^ Error: error:0308010C:digital envelope routines::unsupported这个错误通常发生在运行项目或构建时&#xff0c;尤其是在使用 Webpack、Vite 或其他…

蓝桥杯——走迷宫问题(BFS)

这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制&#xff1a;广度优先搜索按层遍历所有可能的路径&#xff0c;首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用&#xff1a;通过队列按先进先出的顺序处理节点&#xff0c;确保每一步探索的都是当…

详解 Redis repl_backlog_buffer(如何判断增量同步)

一、repl_backlog_buffer 复制积压缓冲区&#xff08;Replication Backlog Buffer&#xff09; 是一个环形内存区域&#xff08;Ring Buffer&#xff09;&#xff0c;用于临时保存主节点最近写入的写命令&#xff0c;以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …

使用PyTorch实现ResNet:从残差块到完整模型训练

ResNet&#xff08;残差网络&#xff09;是深度学习中的经典模型&#xff0c;通过引入残差连接解决了深层网络训练中的梯度消失问题。本文将从残差块的定义开始&#xff0c;逐步实现一个ResNet模型&#xff0c;并在Fashion MNIST数据集上进行训练和测试。 1. 残差块&#xff08…

Scala相关知识学习总结5

1、多维数组 定义&#xff1a; val arr Array.ofDim[Double](3,4) 表示二维数组中有三个一维数组&#xff0c;每个一维数组有四个元素。 2、列表 List 不可变 List&#xff1a;默认不可变&#xff0c;可创建有序且可重复的列表&#xff0c;可使用:从右向左增加数据&#xf…

Day1:前端项目uni-app壁纸实战

uni-app官网下载HBuilder。 uni-app快速上手 | uni-app官网 点击HBuilder 安装 新建项目 工具——插件安装 安装uni-app&#xff08;vue3&#xff09; 我们先来准备一下&#xff1a; 先在wallpaper下新建目录 我已经建过了 同样&#xff0c;再在common下建images和style目录&…

光谱相机的光谱数据采集原理

光谱相机的光谱数据采集原理基于‌分光技术‌和‌光电信号转换‌&#xff0c;通过将入射光按波长分解并记录各波段的强度信息&#xff0c;最终生成包含空间和光谱维度的数据立方体。以下是详细原理分解&#xff1a; ‌1. 分光技术&#xff1a;将复合光分解为单色光‌ 光谱相机…

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡安装pytorch

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡是一款高性能移动 GPU&#xff0c;基于 NVIDIA 最新的 Blackwell 架构设计&#xff0c;通过修正架构&#xff08;Blackwell&#xff09;、显存类型与带宽&#xff08;GDDR7、960GB/s&#xff09;、Tensor Core 与 RT Core 全面…

html+css+js 实现一个贪吃蛇小游戏

目录 游戏简介 游戏功能与特点 如何玩转贪吃蛇 游戏设计与实现 HTML结构 JavaScript核心实现 代码结构&#xff1a; 效果 关于“其他游戏” 游戏简介 贪吃蛇是一款经典的单人小游戏&#xff0c;玩家通过控制蛇的移动&#xff0c;吃掉食物来增加长度&#xff0c;避免撞…

Python爬虫生成CSV文件的完整流程

引言 在当今数据驱动的时代&#xff0c;网络爬虫已成为获取互联网数据的重要工具。Python凭借其丰富的库生态系统和简洁的语法&#xff0c;成为了爬虫开发的首选语言。本文将详细介绍使用Python爬虫从网页抓取数据并生成CSV文件的完整流程&#xff0c;包括环境准备、网页请求、…