spring boot 从开发到上线(三)—AOP 异常监控、上报

在做这个项目的期间,看到一篇很有启发性的文章《程序员你为什么这么累》。对于初级程序员来说,拿到需求,第一反应是用什么技术来尽快的完成任务,这本身并没有问题。但长此以往,不仅被需求的更改搞得疲惫不堪,更被重复的工作消磨了激情。如果你也有类似的烦恼,不妨看看此文,结合日常工作,体会下文中提到的先有思想再有技术
~~~~~~~~ge ge ge ge~~~~~~~~~~~

正文:

到目前为止,我们的项目线上运行良好,但每个人都知道,它一定有 bug。当异常产生,就需要及时去修复。然而我们不可能实时的查看日志,更不能寄期望于用户反馈。怎么办?我们需要程序替我们监控异常,一旦发生异常及时通知相关人员。

要怎么实现呢?

你可能想到,在业务类的每个方法中,捕获异常后发送消息通知相关人员。比如:
MyBusiness.java

public class MyBusiness {
  public void doSomething() {
    try {
      // 业务逻辑
    } catch(Exception ex) {
      sendMessageToBuddy(ex, "张三");
    }
  }
  public void doSomething2() {
    try {
      // 业务逻辑
    } catch(Exception ex) {
      sendMessageToBuddy(ex, "张三");
    }
  }
  ...
}

相信你也闻到了代码的臭味道:大量与业务无关的重复代码;强耦合;不易维护。。。

所幸,使用 spring aop 可以帮助我们简化实现。(先有思想再有技术)

一看就懂的 AOP

初学 AOP,一定会被它复杂的概念迷惑,今天我们就来捋一捋,说点人话。

什么是 AOP ?

AOP: Aspect Orient Programming,即面向切面编程。
面向切面编程:抽取重复代码,在运行时将它们动态的植入到业务方法上。
作用:让关注点代码与业务代码分离
关注点:即业务中的重复代码
切面:关注点代码行程的类,也叫切面类
切入点:

  • 目标业务对象方法,动态植入切面代码
  • 通过切入点表达式,指定拦截哪些类的哪些方法;给指定的类在运行时,植入切面类代码
    切入点表达式:指定哪些类的哪些方法被拦截

使用 spring aop

在 spring boot 框架上使用 spring aop 非常简单,只需要:
1) 在 pom.xml 文件中导入 spring-boot-starter-aop
2) 新建切面类,使用注解 @Aspect 和 @Component 即可

下面是演示代码:

  1. pom.xml 导入 spring-boot-starter-aop
...
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
  </dependency>
...
  1. 新建切面类 WebExceptionAspect.java
@Aspect
@Component
@Slf4j
public class WebExceptionAspect {
  // 一旦 com.hbgj.happy.wiki.controller.HappyWiki 类中的方法抛出异常,就会执行 doAfterThrowingAdvice 方法
  @AfterThrowing(value = "execution(public * com.hbgj.happy.wiki.controller.HappyWiki.*(..))", throwing = "ex")
  public void doAfterThrowingAdvice(JoinPoint joinPoint, Throwable ex) {
    // 组装错误信息,你也可以做其他任何事情
    String message = "[error] " + joinPoint.getSignature().getName() + "\n[message] " + ex.getMessage();
    log.error(message);

    sendMessageToBuddy(message , "张三");
  }
}

运行项目,剩下的交给 spring。

就这样,我们在不侵入任何业务代码的情况下,完成了任务,是不是很简单?

总结
使用 spring aop,我们只需要关心切面类、编写切面表达式指定切入点(指定目标类的方法)两件事。有了以上基础,写一两个切面类体会体会,再去看文档,相信会更加容易。

原文地址:https://www.cnblogs.com/fayin/p/11775778.html

时间: 2024-11-07 01:46:03

spring boot 从开发到上线(三)—AOP 异常监控、上报的相关文章

Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件

1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor 中几个方法实现.几个方法的作用一一如下. preHandle 进入 Habdler 方法之前执行,一般用于身份认证授权等. postHandle 进入 Handler 方法之后返回 modelAndView 之前执行,一般用于塞入公共模型数据等. afterCompletion 最后处理,一般用于日

Spring Boot干货系列:(三)启动原理解析

Spring Boot干货系列:(三)启动原理解析 2017-03-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面纱,让它不在神秘. 正文 我们开发任何一个Spring Boot项目,都会用到如下的启动类 从上面代码可以看出,Annotation定义(@SpringBootApplicat

Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎

前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的包,然后编写业务代码即可. 自动配置原理? 在进行 web 开发之前让我再来回顾一下自动配置,可以参考系列文章第三篇.Spring Boot 为 Spring MVC 提供了自动配置,添加了如下的功能: 视图解析的支持. 静态资源映射,WebJars 的支持. 转换器 Converter 的支持.

Spring Boot让开发如此简单

从html到asp后一直专注.net开发,从.net诞生到如今,从winform到webform,从asp.net到.net mcv,从.net mvc到.net core,从ado.net到linq到ef,从ef到.net core ef,之前一直比较忙没什么时间修下java web,虽然对java语言的底层开发早已经熟练(就像精通c#去干安卓的as开发一样得心应手),最近在修下java web开发,发现Spring Boot让开发变得如此简单,但是一直在宇宙第一ide vs的开发环境下,换下

Spring Boot框架开发的Java项目在CentOS7上的部署

需求:上级拿来一份Spring Boot框架开发的Java项目代码让我在服务器上运行起来,只说了一句该框架是自带了Tomcat(不用重新安装Tomcat),一份代码下有两个项目(一个管理端项目,一个用户端项目,等会会细说).我是一名运维,在上家公司只接触过在Tomcat下部署Java项目,自带Tomcat的没接触过,目前这个公司都是php软件攻城狮,所以只能靠自己了.幸好在一个学习交流群里碰到一位Java软件攻城狮,在该攻城狮的热心指导下项目成功运行.下面是详细步骤,知识点扩展及总结将在最后写出

Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 应用监控

文章目录 1. 快速开始 2. 监控和管理端点3. 定制端点 2.1. health 应用健康指标 2.2. info 查看应用信息 2.3. metrics 应用基本指标 2.4. trace 基本的HTTP跟踪信息 2.5. shutdown关闭当前应用 4. 源代码 Spring Boot 提供运行时的应用监控和管理功能.本文,我们通过 HTTP 实现对应用的监控和管理. 快速开始 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖

Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控

文章目录 1. 内置 HealthIndicator 监控检测 2. 自定义 HealthIndicator 监控检测 3. 源代码 Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring Boot 内置了一些 HealthIndicator. 内置 HealthIndicator 监控检测 Name Description CassandraHealthIndicator Checks that a Cas

Spring Boot 揭秘与实战(九) 应用监控篇 - 自定义监控端点

文章目录 1. 继承 AbstractEndpoint 抽象类 2. 创建端点配置类 3. 运行 4. 源代码 Spring Boot 提供的端点不能满足我们的业务需求时,我们可以自定义一个端点. 本文,我将演示一个简单的自定义端点,用来查看服务器的当前时间,它将返回两个参数,一个是标准的包含时区的当前时间格式,一个是当前时间的时间戳格式. 继承 AbstractEndpoint 抽象类 首先,我们需要继承 AbstractEndpoint 抽象类.因为它是 Endpoint 接口的抽象实现,此

在Spring Boot 上配置Redis Cluster出现的异常

〇.背景 已在虚拟机的docker中搭建好了6个节点的redis 集群:Docker Redis 5.0集群搭建 现在在宿主机以Spring Boot环境连接集群 一.异常1:无法连接集群 1.配置: 1 #rediss 2 spring.redis.cluster.nodes=192.168.22.130:7001,192.168.22.130:7002,192.168.22.130:7003,192.168.22.130:7004,192.168.22.130:7005,192.168.22