欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从壹开始前后端分离[.NetCore] 40 || 完美基于AOP的接口性能分析

程序员文章站 2022-07-02 17:02:06
旁白音:本文是不定时更新的.net core,当前主线任务的Nuxt+VueAdmin教程的 nuxt.js 之 tibug项目已上线,大家可以玩一玩:http://123.206.33.109:7090,具体的部署教程会在下周发表。 缘起 哈喽大家周五好呀,今天是一个不定时更新的文章,是很简单的一 ......

旁白音:本文是不定时更新的.net core,当前主线任务的nuxt+vueadmin教程的 nuxt.js 之 tibug项目已上线,大家可以玩一玩:,具体的部署教程会在下周发表。

缘起

哈喽大家周五好呀,今天是一个不定时更新的文章,是很简单的一篇文章,大家应该都能看懂,主要包含了两个内容,一个是对aop编程的进一步的理解(其中还有和过滤器比较),第二个就是一个简单的小插件——记录接口的调用时间调用情况,也就是很简单的性能记录,这个时候你肯定不要和 metricss+influxdb+grafana 作比较了,它们功能虽然很大,但是用起来笨重,咱们这种入门级别的小项目暂时先不用这个了,说到这里,昨天有小伙伴留言,说要不要在项目中增加消息队列 reditmq ,我正在考虑中,看看如何使用,好啦废话不多说,先来几个小问题,热热身:

1、在平时开发的时候,大家是如何记录当前 <接口/方法> 的调用时间的?// 手动写起止时间相减 

2、如何对异常进行处理的,这里有 <api层的异常>,以及 <service 层的异常> 的?// 加 try catch  

3、如何快速的找到当前接口的错误信息?// 查看日志记录

大家先带着这几个问题自己想一想,是不是和我的绿色解决方案一致,要是有更好的办法也帮忙提给我,不胜感激!

不过!今天肯定不会用这些解决方案的,今天玩儿一个新花样,应该也会有人玩儿过,别着急,咱们往下看。

先来个实现图,预热下:

从壹开始前后端分离[.NetCore] 40 || 完美基于AOP的接口性能分析

 

一、复习篇——我们把aop用在了哪里?

时间是很快,我也已经从第一个专题,写到了第三个专题,还记得当时第一次写aop的时候《框架之十 || aop面向切面编程浅解析:简单日志记录 + 服务切面缓存》,很多很多的小伙伴不是很明白,也不知道应用场景到底在哪里,完全不了解落地几何,现在也能在群里,时不时看到有小伙伴用到aop编程,感觉很开心,至少帮到了一些人了,这就是最大的欣慰!那咱们在blog.core 项目中,到底如何运用了 aop 呢?

 

1、切面缓存

这一块相信已经有小伙伴知道,并且用到了,我也是在很多地方使用到了,比如在基于策略的权限认证文章中《jwt完美实现权限与接口的动态分配》,通过了对角色模块的切面缓存,很好的实现了快速授权的目的,不仅代码整洁,而且功能也实现了:

 // 将最新的角色和接口列表更新
 var data = await _rolemodulepermissionservices.getrolemodule();
 var list = (from item in data
             where item.isdeleted == false
             orderby item.id
             select new permissionitem
             {
                 url = item.module?.linkurl,
                 role = item.role?.name,
             }).tolist();

// 通过aop缓存获取角色模块信息 [caching(absoluteexpiration = 10)] public async task<list<rolemodulepermission>> getrolemodule() { var rolemodulepermissions = await dal.query(a => a.isdeleted == false); //....... return rolemodulepermissions; }

 

另外还有在当前第三系列教程中,获取bug信息的时候,也用到了切面缓存(所以,如果你用了文章开头的 tibug 系统,提交了一个 bug,但是没有立刻显示出来,就是这个原因,10分钟缓存):

从壹开始前后端分离[.NetCore] 40 || 完美基于AOP的接口性能分析

综上所言,经过多次使用,我个人表示真的是一个神器,在完全不露痕迹的情况下,实现了缓存,是不是很好用?

这个时候你会问,单独为了缓存的话,aop不是很透彻,那还有其他的用处么?请往下看。前提是上边的这种基于aop的缓存你要看懂了,先在脑子里回顾下整体流程。

 

2、切面日志

 上边咱们说了缓存,我个人感觉还有一个很大的用户就是切面日志,这个具体的内容以前已经说过了,这里就不多说了,想了解原理和详细说明,请看《aop面向切面编程浅解析:简单日志记录 + 服务切面缓存》,这里只是复习下流程:

        public void intercept(iinvocation invocation)
        {
            //记录被拦截方法信息的日志信息
            var dataintercept = $"{datetime.now} " +
                $"当前执行方法:{ invocation.method.name} ";

            //在被拦截的方法执行完毕后 继续执行当前方法,注意是被拦截的是异步的
            invocation.proceed();

            dataintercept += ($"方法执行完毕,返回结果:{invocation.returnvalue}");

            #region 输出到日志文件     
            #endregion
        }

只需要我们 serviceconfigure 中开启服务以后,就可以在指定文件中,看到每次的切面接口调用情况,注意这里是 service 层的,不是 controller 的日志,这个时候就是 aop 和过滤器 filter 的区别了:

1、filter过滤器是基于当前http请求的,也就是接口层面的,颗粒度比较大;

2、而aop是基于服务切面的,是 service 层的请求,颗粒度比较小;

那既然aop能记录调用日志,能捕获异常么,上次群里有一个小伙伴问到了,这里就点名表扬了,挺棒的,能自己思考,那如何捕获呢? 

 

3、切面异常 

在平时的开发中,我们经常会遇到各种 bug ,在 controller 里的错误就不说了,编译的时候基本都能看出来,但是很多 service 层的错误,真是难找,比如我故意写的这个bug,一个不重要的方法:

  public void noimportantmethod()
  {
      int a = 1;
      int b = 0;
      int c = a / b;
  }

这个错误是如何捕获的,大家还记得么,就是我们用全局变量异常过滤器 filter 捕获的《》:

从壹开始前后端分离[.NetCore] 40 || 完美基于AOP的接口性能分析

 

我们平时可能会在 api 中使用这样的service层方法,然后下边也会有其他的一些方法,因为这个方法不重要,比如仅仅是阅读数量+1,那我们就不能让当前接口崩了

 public async task<messagemodel<response>> get()
 {
     var data = new messagemodel<response>();
     
     // 一个不重要的方法
     _advertisementservices.noimportantmethod();
    
     // 核心功能:说爱你
     love love = new love();
     love.sayloveu();

     return data;
 }

这个我们我们会在 noimportantmethod() 这里报异常,直接崩溃出去,你感觉这样的设计合理么?我们不能因为一个不重要的动作就不说核心的 我爱你 了吧