当前位置: 移动技术网 > IT编程>开发语言>.net > 从壹开始前后端分离[.NetCore] 40 || 完美基于AOP的接口性能分析

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

2019年01月19日  | 移动技术网IT编程  | 我要评论

美联航弄坏了我的吉他,李光洙女友刘仁娜,余闲居 案头瓶花不绝

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

缘起

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

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

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

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

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

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

先来个实现图,预热下:

 

一、复习篇——我们把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分钟缓存):

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

这个时候你会问,单独为了缓存的话,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 捕获的《》:

 

我们平时可能会在 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() 这里报异常,直接崩溃出去,你感觉这样的设计合理么?我们不能因为一个不重要的动作就不说核心的 我爱你 了吧

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网