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

缘起

哈喽大家周五好呀,今天是一个不定时更新的文章,是很简单的一篇文章,大家应该都能看懂,主要包含了两个内容,一个是对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() 这里报异常,直接崩溃出去,你感觉这样的设计合理么?我们不能因为一个不重要的动作就不说核心的 我爱你 了吧

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!