AspNetCore 基于AOP实现Polly的使用
前言
说起AOP,其实我们在做MVC/API 的时候应该没少接触,比如说各种的Fitter 就是典型的AOP了。
本来在使用Polly的时候我最初的打算是使用过滤器来实现的,后来发现实现起来相当的困难,利用NetCore的中间以及过滤器去实现一个AOP的独立应用服务简直了,我有点无奈,相当的难写。
后来又使用了,Autofac 做拦截器来实现也是有点小无力。估计还是基础太薄弱。
目前我了解到的实现Polly比较方便的第三方Aop框架的有
(1)、AspectCore:是一款 AspNetCore轻量级的Aop解决方案。
(2)、Dora.Interception 老A写的一个Aop解决方案,这个用到解决方案中就需要等到老A升级下一版了。
AspNetCore中的过滤器:
在使用Policy 的时候主要点是策略的制定,在保证代码整洁,并且不破坏当前代码逻辑的情况下,使用Aop是最合适的解决方案了。
当我们使用过滤器的时候我们会发现,Pollicy 制定了一个错误规则,并且在错误过滤器中使用、抓取不到任何的错误信息,因为错误信息被错误过滤器抓取了,这个时候不会触发Pollicy
然后尝试着 用过滤实现一个 当程序发生错误的时候,执行另一个方法的功能,类似Policy的重试策略或降级。
下面代码:
编写:一个过滤器类:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Reflection; namespace InterceptorCoreLibrary
{
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
public class CoreExceptionFilter:Attribute, IExceptionFilter,IActionFilter
{
/// <summary>
/// 发生错误的时候重新执行的方法
/// </summary>
public string FallBackClass { get; set; }
/// <summary>
/// 发生错误的时候重新执行的方法
/// </summary>
public string FallBackMethod { get; set; } /// <summary>
/// 获取方法的参数
/// </summary>
public object[] InvokeParameters { get; set; } /// <summary>
/// 构造函数使用该类时参数为方法
/// </summary>
/// <param name="fallBackMethod"></param>
public CoreExceptionFilter(string fallBackClass, string fallBackMethod)
{
this.FallBackMethod = fallBackMethod;
this.FallBackClass = fallBackClass;
}
/// <summary>
/// 使用新方法
/// </summary>
/// <param name="asm"></param>
/// <param name="parameters"></param>
/// <returns></returns>
private object UseNewMethod(Assembly asm, object[] parameters)
{
Object obj = null;
foreach (Type type in asm.GetExportedTypes())
{
if (type.Name == FallBackClass)
{
obj = System.Activator.CreateInstance(type);
foreach (var item in type.GetMethods())
{
if (item.Name == FallBackMethod)
{
obj = type.GetMethod(FallBackMethod).Invoke(obj, parameters);
}
}
}
}
return obj;
}
/// <summary>
/// 获取所有被监控方法的参数
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
object[] parameters = new object[context.ActionArguments.Count];
int Count = ;
foreach (var item in context.ActionArguments)
{
parameters[Count] = item.Value;
Count++;
}
InvokeParameters = parameters;
} /// <summary>
/// 错误的时候执行新的方法
/// </summary>
/// <param name="context"></param>
public void OnException(ExceptionContext context)
{
var objectResult = context.Exception as Exception;
if (objectResult.Message != null)
{
//context.Result = new ObjectResult(UseNewMethod(this.GetType().Assembly, InvokeParameters));
context.Result = new ObjectResult(new { Success = true, code = , msg = "成功", Data = UseNewMethod(this.GetType().Assembly, InvokeParameters) });
}
}
public void OnActionExecuted(ActionExecutedContext context)
{ }
}
}
在控制器中使用:
[CoreExceptionFilter(nameof(UserModel), nameof(Delete))]
在执行的时候我抛送一个异常信息
[CoreExceptionFilter(nameof(UserModel), nameof(Delete))]
// DELETE api/values/5
[HttpDelete("{id}")]
public int Delete(int id)
{
throw new Exception();
}
当方法执行出错的时候执行另一个方法:
如下:注意参数一致:
using System;
using System.Collections.Generic;
using System.Text; namespace InterceptorCoreLibrary
{
public class UserModel
{
public int Delete(int id)
{
//记录日志
//重新执行一遍代码
return id;
}
}
}
执行结果:

返回结果:

这个时候我们能看到过滤器先抓取了错误信息,Policy 就抓不到了,但同样实现了降级的功能。
如果我们不使用Aop的话 直接在控制器中写
比如:这样写一个两个还行多了的话,代码就相当的乱了。
// DELETE api/values/5
[HttpDelete("{id}")]
public int Delete(int id)
{
var PolicyExecute = Policy.Handle<Exception>().Fallback(() =>
{
//程序报错重新执行一个新的方法
UserModel userModel = new UserModel();
userModel.Delete(id);
}); //执行
PolicyExecute.Execute(() => {
throw new Exception();
}
);
}
以上代码虽然没有实现policy ,但是也演示出了大致使用Aop实现 Policy的过程原理。
使用AspectCore 实现Policy
这里贴出一份杨中科老师 在普及AspNetCore微服务课程中的代码:支持原创,
完整的代码这里贴出过:
http://www.cnblogs.com/qhbm/p/9228238.html
使用Dora.Interception 实现Policy
我在Demo中进行了简单的实现:这里就不贴出了,因为框架还不是很完善,我问了作者老A,要等到下一版出来后用在项目中才比较稳妥。大家可以关注一下老A博客。
截图说明一下两个框架的区别,到时候可根据框架需要酌情使用:

有不足之处 希望大家指出相互学习,
本文原创:转载请注明出处 谢谢!
AspNetCore 基于AOP实现Polly的使用的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 基于AOP的MVC拦截异常让代码更优美
与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...
- Java实战之03Spring-05Spring中的事务控制(基于AOP)
五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1. ...
- 从壹开始前后端分离 40 || 完美基于AOP的接口性能分析
旁白音:本文是不定时更新的.net core,当前主线任务的Nuxt+VueAdmin教程的 nuxt.js 之 tibug项目已上线,大家可以玩一玩:http://123.206.33.109:70 ...
- Spring中基于AOP的XML架构
以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-wi ...
- 基于AOP的插件化(扩展)方案
在项目迭代开发中经常会遇到对已有功能的改造需求,尽管我们可能已经预留了扩展点,并且尝试通过接口或扩展类完成此类任务.可是,仍然有很多难以预料的场景无法通过上述方式解决.修改原有代码当然能够做到,但是这 ...
- Logstash+ Kafka基于AOP 实时同步日志到es
Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地,logstash丰富的插件(logstash-in ...
- 基于AOP和ThreadLocal实现的一个简单Http API日志记录模块
Log4a 基于AOP和ThreadLocal实现的一个简单Http API日志记录模块 github地址 : https://github.com/EalenXie/log4a 在API每次被请求时 ...
- Spring 中基于 AOP 的 @AspectJ
Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...
随机推荐
- CentOS7 通过YUM安装MySQL5.7
1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...
- Java NIO 概览
Java面试通关手册(Java学习指南) Github地址:https://github.com/Snailclimb/Java_Guide 一 NIO简介 Java NIO 是 java 1.4 之 ...
- 使用Akka的远程调用
概述 正如其它RPC或者RMI框架那样,Akka也提供了远程调用的能力.服务端在监听的端口上接收客户端的调用.本文将在<Spring与Akka的集成>一文的基础上介绍Akka的remote ...
- Spark学习之Spark SQL
一.简介 Spark SQL 提供了以下三大功能. (1) Spark SQL 可以从各种结构化数据源(例如 JSON.Hive.Parquet 等)中读取数据. (2) Spark SQL 不仅支持 ...
- MyEclipse 10导入JDK1.7或1.8
1.在MyEclipse,选择“windows”>"preferences"选择,打开“perference”窗口(如下图) 2.展开“perference”窗口左侧“jav ...
- Android:JNI与NDK(一)
友情提示:欢迎关注本人公众号,那里有更好的阅读体验以及第一时间获取最新文章 本篇目录 以下举例代码均来自:NDK示例代码 一.前言 安卓开发中很多场景需要用到NDK来开发,比如,音视频的渲染,图像的底 ...
- 在MySQL中实现Rank高级排名函数【转】
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- 【MQ】消息队列及常见MQ比较
一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰. ...
- python查询修改配置文件功能
阅读目录 一.python查询功能代码 1.查询修改配置文件 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 i ...
- kafka集群broker频繁挂掉问题解决方案
现象:kafka集群频繁挂掉 排查日志:查看日志文件[kafkaServer.out],发现错误日志:ERROR Shutdown broker because all log dirs in /tm ...