【SpringBoot】SpringBoot-Admin 服务监控 + 告警通知

简单介绍

Spring Boot Actuator 是 Spring Boot 自带的一个功能模块,
提供了一组已经开箱即用的生产环境下常用的特性和服务,比如应用程序的健康检查、信息暴露、度量收集、日志记录等。
在实际项目中,Actuator 可以帮助我们快速了解应用程序的运行状态和性能瓶颈。

整合SpringBoot-Admin监控,Spring Boot Admin 就是将 Spring Boot Actuator中提供的endpoint信息可视化展示。

环境

Springboot: 2.1.1.RELEASE

注意:不同的SpringBoot版本,所用到的依赖会不一致。本版本亲测可用哦。

服务端简单搭建

核心依赖


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.1.6</version>
</dependency><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-server-ui-login</artifactId><version>1.5.7</version>
</dependency>

启动类


@EnableAdminServer //开启admin服务端
@SpringBootApplication
public class BootAdminServerApplication {public static void main(String[] args) {SpringApplication.run(BootAdminServerApplication.class, args);}}

配置文件

server:port: 8001servlet:context-path: /admin-server
spring:application:name: admin-server

启动服务后,访问:http://localhost:8001/admin-server

在这里插入图片描述

安全认证

核心依赖


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

SecuritySecureConfig 拦截器Code


@EnableWebSecurity
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {private final String adminContextPath;public SecuritySecureConfig(AdminServerProperties adminServer) {this.adminContextPath = adminServer.getContextPath();}@Overrideprotected void configure(HttpSecurity http) throws Exception {SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();successHandler.setTargetUrlParameter("redirectTo");successHandler.setDefaultTargetUrl(adminContextPath + "/");http.authorizeRequests().antMatchers(adminContextPath + "/login",adminContextPath + "/assets/**",adminContextPath + "/manage/**",adminContextPath + "/actuator/**",adminContextPath + "/login.html").permitAll().anyRequest().authenticated().and().formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and().logout().logoutUrl(adminContextPath + "/logout").and().httpBasic().and().csrf().disable();}}

修改配置

新增以下配置

spring:security:user:name: adminpassword: admin

启动服务后,访问:http://localhost:8001/admin-server

在这里插入图片描述

输入用户名,密码即可。

客户端

核心依赖

  <!--加入spring-boot-admin连接端-->
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.1.6</version>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置文件

如果你不想开启安全认证请参考以下的配置。

admin-server 未开启安全认证


server:port: 7001spring:application:name: admin-client# 配置spring-boot-admin服务端的地址boot:admin:client:url: 'http://localhost:8001/admin-server'#展示全部细节信息
management:endpoints:web:exposure:include: '*'#允许admin工程远程停止本应用endpoint:health:enabled: trueshow-details: alwaysshutdown:enabled: true

admin-server 开启安全认证

server:port: 7001spring:application:name: admin-client# 配置spring-boot-admin服务端的地址boot:admin:client:url: 'http://localhost:8001/admin-server'username: adminpassword: admin#展示全部细节信息
management:endpoints:web:exposure:include: '*'#允许admin工程远程停止本应用endpoint:health:enabled: trueshow-details: alwaysshutdown:enabled: true

查看Admin-Server端页面
在这里插入图片描述

在这里插入图片描述

如何实现服务 告警通知

当我们的服务发生异常时, 可以通过邮件、微信、钉钉等发送告警信息。

Server 端新增以下配置类。

@Component
public class AdminNotifier extends AbstractStatusChangeNotifier {private static final Logger log = LoggerFactory.getLogger(AdminNotifier.class);/*** 消息模板*/private static final String template = "<<<%s>>> \n 【服务名】: %s(%s) \n 【状态】: %s(%s) \n 【服务ip】: %s \n 【详情】: %s";private String titleAlarm = "系统告警";private String titleNotice = "系统通知";private String[] ignoreChanges = new String[]{"UNKNOWN:UP", "DOWN:UP", "OFFLINE:UP"};public AdminNotifier(InstanceRepository repository) {super(repository);}@Overrideprotected boolean shouldNotify(InstanceEvent event, Instance instance) {if (!(event instanceof InstanceStatusChangedEvent)) {return false;} else {InstanceStatusChangedEvent statusChange = (InstanceStatusChangedEvent) event;String from = this.getLastStatus(event.getInstance());String to = statusChange.getStatusInfo().getStatus();return Arrays.binarySearch(this.ignoreChanges, from + ":" + to) < 0 && Arrays.binarySearch(this.ignoreChanges, "*:" + to) < 0 && Arrays.binarySearch(this.ignoreChanges, from + ":*") < 0;}}@Overrideprotected Mono<Void> doNotify(InstanceEvent event, Instance instance) {return Mono.fromRunnable(() -> {if (event instanceof InstanceStatusChangedEvent) {log.info("Instance {} ({}) is {}", instance.getRegistration().getName(),event.getInstance(),((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();String messageText = null;switch (status) {// 健康检查没通过case "DOWN":log.info("发送 健康检查没通过 的通知!");messageText = String.format(template, titleAlarm, instance.getRegistration().getName(), event.getInstance(),((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(), "健康检查没通过通知",instance.getRegistration().getServiceUrl(), JSONObject.toJSONString(instance.getStatusInfo().getDetails()));log.info(messageText);break;// 服务离线case "OFFLINE":log.info("发送 服务离线 的通知!");messageText = String.format(template, titleAlarm, instance.getRegistration().getName(), event.getInstance(),((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(), "服务离线通知",instance.getRegistration().getServiceUrl(), JSONObject.toJSONString(instance.getStatusInfo().getDetails()));log.info(messageText);break;//服务上线case "UP":log.info("发送 服务上线 的通知!");messageText = String.format(template, titleNotice, instance.getRegistration().getName(), event.getInstance(),((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(), "服务上线通知",instance.getRegistration().getServiceUrl(), JSONObject.toJSONString(instance.getStatusInfo().getDetails()));log.info(messageText);break;// 服务未知异常case "UNKNOWN":log.info("发送 服务未知异常 的通知!");messageText = String.format(template, titleAlarm, instance.getRegistration().getName(), event.getInstance(),((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(), "服务未知异常通知",instance.getRegistration().getServiceUrl(), JSONObject.toJSONString(instance.getStatusInfo().getDetails()));log.info(messageText);break;default:break;}} else {log.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),event.getType());}});}
}

如下图所示:

在这里插入图片描述

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

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

相关文章

使用dhtmlx-gantt甘特图插件定制预约表【实战】

示例传送门 定制预约表展示 一、安装 npm i dhtmlx-gantt二、配置解释与汇总 //自定义表头列 gantt.config.columns = [{name: "

想学会ai绘画软件生成?告诉你ai绘画图片生成有什么软件

小铭和晓虹是两位对艺术和创造有浓厚兴趣的大学生。他们一直梦想能够创作出独特而令人惊叹的绘画作品。然而&#xff0c;他们也意识到绘画是一项需要长时间学习和实践的技能。幸运的是&#xff0c;他们在寻找ai绘画图片生成有什么软件的时候&#xff0c;认识到了很多新的软件&a…

SpringBoot 项目使用 Redis 对用户IP进行接口限流

本文主要参考了该篇文章&#xff1a;https://www.zhihu.com/question/586213782/answer/3038040317?utm_id0 文章目录 一、思路1.1 固定时间段&#xff08;旧思路&#xff09;1.1.1 思路描述1.1.2 思路缺陷 1.2 滑动窗口&#xff08;新思路&#xff09;1.2.1 思路描述1.2.2 Re…

2023年Java最新面试题

由【后端面试题宝典】提供 和 equals 的区别是什么&#xff1f; 对于基本类型&#xff0c;比较的是值&#xff1b;对于引用类型&#xff0c;比较的是地址&#xff1b;equals不能用于基本类型的比较&#xff1b;如果没有重写equals&#xff0c;equals就相当于&#xff1b;如果重…

ES6基础语法

目录 解构 数组解构 对象解构 基本数据解构 对象 对象简写 箭头函数 扩展运算符 函数参数解构 对象API拓展 Object.is() Object.assign() Object.getPrototypeOf() Object.setPrototypeOf() Object.keys() Object.values() Object.entries() Object.fromEntries(…

学习PostgreSQL的优势

学习 PostgreSQL 可以为您打开许多就业机会。 PostgreSQL 是一种强大的关系型数据库管理系统&#xff0c;被广泛用于企业和组织中的数据管理和应用程序开发。 以下是一些学习 PostgreSQL 可能帮助您找到的工作领域&#xff1a; **1.数据库管理员&#xff1a;**作为 PostgreSQ…

rocketmq使用mqtt协议

文章目录 前言一、安装rocketmq二、打包rocketmq-mqtt三、配置rocketmq-mqtt四、初始化操作五、启动六、测试 前言 rocketmq从4.9.3开始&#xff0c;可以兼容mqtt协议&#xff0c;需要安装编译一个rocketmq-mqtt工程&#xff0c;参考&#xff1a;https://rocketmq.apache.org/…

Mac上快速将视频转化为GIF动图

1、找到需要转为GIF的视频&#xff0c;使用QuickTime Player打开&#xff0c;找到屏幕左上角的QuickTime Player菜单&#xff0c;点击【编辑】-【修剪】 2、视频下方会出现一个时间轴&#xff0c;拖动选取自己想要的时间段&#xff0c;修剪完成后保存 3、右键剪辑好的视频&…

MVC三层架构

1.MVC三层架构 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于组织和管理应用程序的代码和逻辑。它将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#…

Clickhouse数据一致性和物化视图

Clickhouse 一、数据一致性的保证1.通过Group by对数据去重2.通过 FINAL 查询 二、物化视图1.物化视图与普通视图的区别2.优缺点3.基本语法 三、MaterializeMySQL引擎1.特点2.使用细则 四、常见问题排除分布式 DDL某数据节点的副本不执行数据副本表和数据不一致副本节点全量恢复…

C# Modbus通信从入门到精通(11)——Modbus RTU(调试软件Modbus Slave和Modbus Poll的使用)

前言 我们在开发Modbus程序的时候,会需要测试以下我们写的Modbus程序有没有问题,这时候就需要使用到Modbus Slave和Modbus Poll这两个软件,Modbus Slave是模拟Modbus从站,Modbus Poll是模拟Modbus从站主站的, 1、Modbus Slave 一般情况下我们开发的嗾使Modbus主站程序,…

Qt| There‘s no Qtversion assigned to project... 解决方法

问题&#xff1a; 原因&#xff1a;相同工程在不同电脑下qt配置不一致导致&#xff0c;该项目qt setting设置有误。 解决方法&#xff1a;右键项目打开属性 找到Qt Project Settings->Qt Installation&#xff0c;切换到当前电脑所使用的qt版本即可。