chapter15:springboot与监控管理
Spring Boot与监控管理视频
1. 简介
通过引入spring-boot-starter-actuator, 可以使用SpringBoot为我们提供的准生产环境下的应用监控和管理功能。我们可以通过http, jmx, ssh协议来进行操作,自动得到审计、健康及指标信息等。
步骤:
- 引入
spring-boot-starter-actuator; - 通过http方式访问监控端点;
- 可进行shutdown (post提交,此端点默认关闭);
监控和管理端点:
| 端点名 | 描述 |
|---|---|
| autoconfig | 所有自动配置信息 |
| auditevents | 审计事件 |
| beans | 所有Bean的信息 |
| configprops | 所有配置属性 |
| dump | 线程状态信息 |
| env | 当前环境信息 |
| health | 应用健康状况 |
| info | 当前应用信息 |
| metrics | 应用的各项指标 |
| mappings | 应用的@RequestMapping映射路径 |
| shutdown | 关闭当前应用(默认关闭) |
| trace | 追踪信息(最新的http请求) |
http://localhost:8080/beans
http://localhost:8080/health
http://localhost:8080/trace
http://localhost:8080/metrics
http://localhost:8080/mappings
http://localhost:8080/info
2. shutdown端点的使用
首先在application中开启shutdown端点,默认是关闭的。
# 关闭认证
management.security.enabled=false
# 开启shutdown端点
endpoints.shutdown.enabled=true
启动应用后,使用postman发送post请求 : http://localhost:8080/shutdown; 发现报跨域访问限制异常。
{"timestamp": 1691418900478,"status": 403,"error": "Forbidden","message": "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.","path": "/shutdown"
}
什么是 CSRF ,这是一个 WEB 应用安全的问题,CSRF(Cross-site request forgery 跨站请求伪造,也被称为“One Click Attack” 或者Session Riding,攻击方通过伪造用户请求访问受信任站点。
因为我在应用中引入了spring-security, 它引入了CSRF,默认是开启。CSRF和RESTful技术有冲突。CSRF默认支持的方法: GET|HEAD|TRACE|OPTIONS,不支持POST。
其实跨域攻击操作过程比较简单,就是如果你不采取任何限制的时候,对 POST 相对风险系数比较高的访问,用户可以伪造请求,然后对服务器进行攻击和修改。比如说通过伪造 POST 请求,然后能够将用户的数据删除。
参考: Spring security CSRF 跨域访问限制问题 - 知乎 (zhihu.com)
我们只需要禁用CSRF就可以了。http.csrf().disable();
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {/*** 定制请求的授权规则** @param http the {@link HttpSecurity} to modify* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/").permitAll()// VIP1角色的用户才能访问level1的页面,其他同理.antMatchers("/level1/**").hasRole("VIP1").antMatchers("/level2/**").hasRole("VIP2").antMatchers("/level3/**").hasRole("VIP3");// 开启自动配置的登录功能
// http.formLogin();http.formLogin().usernameParameter("uname").passwordParameter("pwd").loginPage("/userlogin").loginProcessingUrl("/userlogin");// 1. 如果没有访问权限,转发到/login请求来到登录页;// 2. 重定向到/login?error表示登录失败。 更多详细规定// 3. 默认post形式的/login代表处理登录提交// 4.如果定制loginPage,那么loginPage的post请求就是登录提交// 开启自动配置的注销功能, 访问/logout表示用户注销,清空session; 注销成功后来到首页;http.logout().logoutSuccessUrl("/");// 开启记住我的功能, 将cookie发给浏览器保存,以后登录带上这个cookie,只要通过服务器端的验证就可以免登录// 如果点击”注销“,也会删除这个cookie
// http.rememberMe();http.rememberMe().rememberMeParameter("remember");// 禁用csrfhttp.csrf().disable();}/*** 定制认证规则** @param auth the {@link AuthenticationManagerBuilder} to use* @throws Exception*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("zhangsan").password("123456").roles("VIP1", "VIP2").and().withUser("lisi").password("123456").roles("VIP2", "VIP3").and().withUser("wangwu").password("123456").roles("VIP1", "VIP3");}
}
再次访问,应用被关闭。使用 curl -X POST http://localhost:8080/shutdown 也可以。
{"message": "Shutting down, bye..."
}
3. 定制端点信息
- 定制端点一般通过endpoints + 端点名 + 属性名来设置;
- 修改端点id (endpoints.beans.id=mybeans);
- 开启远程应用关闭功能 (endpoints.shutdown.enabled=true);
- 关闭端点(endpoints.beans.enabled=false);
- 开启所需端点
- endpoints.enabled=false;
- endpoints.beans.enabled=true;
- 定制端点访问路径 management.context-path=/manage;
- 关闭http端点 management.port=-1;
management.security.enabled=false
info.app.id=springboot-security
info..app.version=1.0
#endpoints.metrics.enabled=false
#endpoints.autoconfig.enabled=false
endpoints.shutdown.enabled=true
# http://localhost:8080/bean
endpoints.beans.id=mybean
endpoints.beans.path=/bean
# http://localhost:8080/du
endpoints.dump.path=/du
# 关闭所有端点访问
endpoints.enabled=false
# 开启指定端点访问
endpoints.beans.enabled=true
# 所有端点访问根路径 http://localhost:8080/manage/bean
management.context-path=/manage
# 所有端点访问端口 http://localhost:8181/manage/bean
management.port=8181
4. 健康状态监控
开放health端点访问
endpoints.health.enabled=true
http://localhost:8181/manage/health 响应:
{status: "UP",diskSpace: {status: "UP",total: 362095308800,free: 336869535744,threshold: 10485760}
}
现在来模拟服务失败的场景,比如引入redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后配置reids主机地址
# redis
spring.redis.host=192.168.111.129
因为我虚拟机上的redis服务没有启动,应用是无法连接redis的。我们来查看health端点状态:
http://localhost:8181/manage/health
{status: "DOWN",diskSpace: {status: "UP",total: 362095308800,free: 336868065280,threshold: 10485760
},
redis: {status: "DOWN",error: "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool"}
}
启动远程redis服务后,再次查看health端点, 其实是RedisHealthIndicator提供了监控支持。
{status: "UP",diskSpace: {status: "UP",total: 362095308800,free: 335793897472,threshold: 10485760
},
redis: {status: "UP",version: "6.2.6"}
}
5. 自定义健康状态指示器
编写一个指示器,实现HealthIndicator接口
@Component
public class MyAppHealthIndicator implements HealthIndicator {@Overridepublic Health health() {
// Health.up().build() 成功// 自定义检查,直接返回失败return Health.down().withDetail("msg", "服务异常").build();}
}
启动应用后,查看健康端点
http://localhost:8181/manage/health
{status: "DOWN",myApp: {status: "DOWN",msg: "服务异常"
},
diskSpace: {status: "UP",total: 362095308800,free: 335793758208,threshold: 10485760
},
redis: {status: "UP",version: "6.2.6"}
}
相关文章:
chapter15:springboot与监控管理
Spring Boot与监控管理视频 1. 简介 通过引入spring-boot-starter-actuator, 可以使用SpringBoot为我们提供的准生产环境下的应用监控和管理功能。我们可以通过http, jmx, ssh协议来进行操作,自动得到审计、健康及指标信息等。 步骤: 引入spring-boo…...
http历史版本
1,HTTP0.9 最早的http版本,后来才被定义为0.9版本。 这时候通信采用的是纯文本格式; 只支持get请求,且在服务器响应之后就关闭连接; 没有请求头的概念,功能比较简单。 2,HTTP1.0 这个版本增…...
【Go语言】Golang保姆级入门教程 Go初学者chapter2
【Go语言】变量 VSCode插件 setting的首选项 一个程序就是一个世界 变量是程序的基本组成单位 变量的使用步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuxG8imp-1691479164956)(https://cdn.staticaly.com/gh/hudiework/imgmain/image-20…...
关于ETL的两种架构(ETL架构和ELT架构) qt
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库…...
【Linux】进程间通信——管道
目录 写在前面的话 什么是进程间通信 为什么要进行进程间通信 进程间通信的本质理解 进程间通信的方式 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 什么是匿名管道 匿名管道通信的原理 pipe()的使用 匿名管道通信的特点 拓展代码 命名管道 什么是命…...
Element-plus中tooltip 提示框修改宽度——解决方案
tooltip 提示框修改宽度方法: 在element中,想要设置表格的内容,超出部分隐藏,鼠标悬浮提示 可以在el-table 上添加show-overflow-tooltip属性 同时可以通过tooltip-options配置提示信息 如下图代码 <el-tableshow-overflo…...
java实现当前系统时间格式化
import java.text.SimpleDateFormat; import java.util.Date;public class DateTest {public static void main(String[] args) {Date date new Date();System.out.println("当前系统时间:" date);SimpleDateFormat simpleDateFormat new SimpleDateFo…...
篇十一:享元模式:共享细粒度对象
篇十一:“享元模式:共享细粒度对象” 设计模式是软件开发中的重要工具,享元模式(Flyweight Pattern)是结构型设计模式的一种。享元模式旨在通过共享细粒度的对象,减少内存消耗和提高性能。在设计模式学习中…...
Dev控件 Gridcontrol,gridview 实现多选功能
在网上看了好多实现dev控件GridControl多选功能的方法,都很麻烦,其实GridControl有一个自带的实现多选功能的控件,很简单。 实现效果如下 无需代码代码,使用GridControl中自带的多选功能,在界面直接设置即可 1.找到要…...
内网穿透:如何通过公网访问本地Web服务器?
文章目录 前言1. 首先安装PHPStudy2.下载一个开源的网页文件3. 选择“创建网站”并将网页内容指向下载好的开源网页文件4. 打开本地网页5. 打开本地cpolar客户端6. 保存隧道设置 生成数据隧道 前言 随着科技进步和时代发展,计算机及互联网已经深深融入我们的生活和…...
在qemu中挂载镜像文件
将镜像文件作为交换分区 创建镜像文件: dd if/dev/zero ofswap.img bs512 count131072 qemu-system-arm -nographic -M vexpress-a9 -m 64M -kernel arch/arm/boot/zImage -append "rdinit/linuxrc consolettyAMA0 loglevel8" -dtb arch/arm/boot/dts/…...
报错注入(主键重复)攻击原理
基本原理 利用数据表中主键不能重复的特点,通过构造重复的主键,使得数据库报错,并将报错结果返回到前端。 SQL说明函数 以pet数据表为例进行说明 rond(): 返回[0,1)区间内的任意浮点数。 count(): 返回每个组的列行数。 如࿰…...
Golang基础教程
Golang基础教程 golang简介安装golanggolang开发工具go常用命令golang开发 vscode快捷键如何编写golang代码golang标识符、关键字、命名规则golang变量go语言常量go语言数据类型go语言布尔类型go语言数字类型golang字符串golang格式化输出golang运算符go语言中的流程控制golan…...
ppt压缩文件怎么压缩最小?文件压缩技巧分享
在日常的工作和学习中,难免会遇到PPT太大,需要将其压缩变小的情况,但很多朋友还不知道怎么压缩PPT文件,下面就给大家分享几个简单的方法,分分钟缩小过大的PPT文件。 一、PowerPoint PowerPoint就是微软公司的演示文稿…...
实例033 制作闪烁的窗体
实例说明 Windows系统中,当程序在后台运行时,如果某个窗口的提示信息需要用户浏览,该窗口就会不停的闪烁,这样就会吸引用户的注意。同样,如果在自己的程序中使某个窗口不停的闪烁就会吸引用户的注意。本例设计了一个闪…...
【JavaEE进阶】Spring创建与使用
文章目录 一. 创建 Spring 项目1.1 创建一个Maven项目1.2 添加Spring依赖1.4. 创建一个启动类 二. 将 Bean 对象存放至 Spring 容器中三. 从 Spring 容器中读取到 Bean1. 得到Spring对象2. 通过Spring 对象getBean方法获取到 Bean对象【DI操作】 一. 创建 Spring 项目 接下来使…...
PHP8的循环控制语句-PHP8知识详解
我们在上一节讲的是条件控制语句,本节课程我们讲解循环控制语句。循环控制语句中,主要有for循环、while循环、do...while循环和foreach循环。 在编写代码时,经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务,而不是…...
第八次作业
一,.什么是数据认证,有什么作用,有哪些实现的技术手段? 数据认证是指保证数据的真实性、完整性和可信度,以确保数据不被篡改或伪造。其作用包括但不限于: 保护关键数据不被恶意篡改或损坏 提供数据来源的可靠性和安全…...
LeetCode //C - 290. Word Pattern
290. Word Pattern Given a pattern and a string s, find if s follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s. Example 1: Input: pattern “abba”, s “dog c…...
[保研/考研机试] 括号匹配问题 C++实现
题目描述: 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来的字符串&am…...
飞腾CPU+银河麒麟V10系统安装Zotero 6.0.37保姆级教程(含Arch Linux ARM源转换避坑指南)
飞腾CPU银河麒麟V10系统安装Zotero 6.0.37全流程解析与深度优化指南 在国产化技术生态快速发展的背景下,飞腾CPU与银河麒麟操作系统的组合已成为科研机构和关键领域的重要选择。然而,当科研人员需要在这套平台上使用国际主流学术工具时,往往会…...
Win11Debloat终极指南:快速清理Windows 11系统,性能提升51%的免费神器
Win11Debloat终极指南:快速清理Windows 11系统,性能提升51%的免费神器 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other c…...
新手入门:在快马平台用基础代码实现个人EndNote
最近在整理学术资料时,发现需要频繁记录和分类文献信息。作为编程新手,想尝试自己做个简单的网页工具来管理这些内容。通过InsCode(快马)平台的智能生成功能,居然用基础代码就实现了一个迷你EndNote,整个过程特别适合像我这样的初…...
RetDec反编译工具完整指南:从新手到专家的逆向工程利器
RetDec反编译工具完整指南:从新手到专家的逆向工程利器 【免费下载链接】retdec RetDec is a retargetable machine-code decompiler based on LLVM. 项目地址: https://gitcode.com/gh_mirrors/re/retdec RetDec是一款基于LLVM架构的可重定向机器码反编译器…...
Java高频面试题:如何编写一个MyBatis插件?
大家好,我是锋哥。今天分享关于【Java高频面试题:如何编写一个MyBatis插件?】面试题 。希望对大家有帮助;Java高频面试题:如何编写一个MyBatis插件?编写一个 MyBatis 插件主要是通过实现 Interceptor 接口来…...
实战应用:在快马平台用jdk1.8的Stream API快速实现订单数据统计与分析
最近在做一个电商后台的数据分析需求时,发现用Java 8的Stream API处理集合数据特别高效。正好在InsCode(快马)平台上实践了一下,分享这个模拟订单统计的实战案例。 订单类设计 首先定义了一个订单类,包含订单ID、金额、客户类型和创建日期四个…...
创新实训第二周工作总结
学习总结学习理解了Fastapi的基本业务逻辑以及与Springboot的关联性对分层架构(Layered Architecture)的核心增进了理解。我发现在Fastapi与Springboot中都存在着从Springboot: Controller->Service->Repository(Mapper)Fastapi: Controller->S…...
tchMaterial-parser:国家中小学智慧教育平台电子课本下载的高效解决方案
tchMaterial-parser:国家中小学智慧教育平台电子课本下载的高效解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本…...
一次企业知识库同步系统改造复盘:从全量拉取到增量消息的演进与多级缓存一致性保障
2026 年 4 月 6 日凌晨 3:17,我们收到一条告警:知识库同步服务 CPU 飙升至 98%,同步任务积压超过 12 万条,下游 AI 助手响应延迟突破 8 秒。这不是第一次了——过去三个月,每逢周一早高峰或知识库批量更新后࿰…...
Obsidian: 图片管理插件-Local Images Plus与Paste Image Rename的进阶配置指南
1. 为什么需要图片管理插件 如果你经常用Obsidian写笔记,肯定遇到过这样的烦恼:从网页复制粘贴的图片默认存放在系统剪贴板,关闭笔记后图片就消失了;或者随手粘贴的图片文件名杂乱无章,过段时间根本分不清是哪篇笔记的…...
