zoukankan      html  css  js  c++  java
  • spring boot 从开发到上线(三)—AOP 异常监控、上报

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

    
    正文:
    
    到目前为止,我们的项目线上运行良好,但每个人都知道,它一定有 bug。当异常产生,就需要及时去修复。然而我们不可能实时的查看日志,更不能寄期望于用户反馈。怎么办?我们需要程序替我们监控异常,一旦发生异常及时通知相关人员。
    
    要怎么实现呢?
    
    你可能想到,在业务类的每个方法中,捕获异常后发送消息通知相关人员。比如:
    MyBusiness.java
    ````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
    ````xml
    ...
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
    ...
    ````
    2. 新建切面类 WebExceptionAspect.java
    ````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() + "
    [message] " + ex.getMessage();
        log.error(message);
    
        sendMessageToBuddy(message , "张三");
      }
    }
    ````
    运行项目,剩下的交给 spring。
    
    就这样,我们在不侵入任何业务代码的情况下,完成了任务,是不是很简单?
    
    **总结**
    使用 spring aop,我们只需要关心切面类、编写切面表达式指定切入点(指定目标类的方法)两件事。有了以上基础,写一两个切面类体会体会,再去看文档,相信会更加容易。
  • 相关阅读:
    LED调光,PFM即pulse frequence modulation
    调光设备术语:调光曲线(转)
    盗梦陀螺攻略5- PID平衡算法(转)
    连接池中的maxIdle,MaxActive,maxWait参数
    MyBatis 延迟加载,一级缓存,二级缓存设置
    maven常用命令介绍
    科目二倒库的感悟(附一个教练独特的调镜方法)
    科目二怎么调整后视镜
    新手学车上车起步步骤
    ActiveMQ 了解
  • 原文地址:https://www.cnblogs.com/fayin/p/11775778.html
Copyright © 2011-2022 走看看