微服务入门07 Hystrix 降级框架

这是一个模仿Java的Hystrix的熔断降级框架,对polly进行了封装 提供了熔断、降级、重试、超时、缓存等功能

github 最新地址 https://github.com/yangzhongke/RuPeng.HystrixCore 由杨中科老师维护

  • 重试:MaxRetryTimes 表示最多重试几次,如果为 0 则不重试,RetryIntervalMilliseconds 表
  • 示重试间隔的毫秒数;
  • 熔断:EnableCircuitBreaker 是否启用熔断,ExceptionsAllowedBeforeBreaking 表示熔断前出
  • 现允许错误几次,MillisecondsOfBreak 表示熔断多长时间(毫秒);
  • 超时:TimeOutMilliseconds 执行超过多少毫秒则认为超时(0 表示不检测超时)
  • 缓存:CacheTTLMilliseconds 缓存多少毫秒(0 表示不缓存),用“类名+方法名+所有参数值
  • ToString 拼接”做缓存 Key(唯一的要求就是参数的类型 ToString 对于不同对象一定要不一样)

基本使用

安装

Install-Package RuPeng.HystrixCore

降级

 //创建Person类
 
 [HystrixCommand(nameof(Hello1FallBackAsync), MaxRetryTimes = 3, EnableCircuitBreaker = true)]
        public virtual async Task<string> HelloAsync(string name)//需要是虚方法
        {
            Console.WriteLine("尝试执行HelloAsync" + name);
            String s = null;
            s.ToString();
            return "ok" + name;
        }

        [HystrixCommand(nameof(Hello2FallBackAsync))]
        public virtual async Task<string> Hello1FallBackAsync(string name)
        {
            Console.WriteLine("Hello降级1" + name);
            String s = null;
            s.ToString();
            return "fail_1";
        }

        public virtual async Task<string> Hello2FallBackAsync(string name)
        {
            Console.WriteLine("Hello降级2" + name);
            return "fail_2";
        }
ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
    using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
    {
        Person p = proxyGenerator.CreateClassProxy<Person>();
         Console.WriteLine(p.HelloAsync("yzk").Result);
     }

mvc 中怎么使用

Install-Package AspectCore.Extensions.DependencyInjection

改 Startup.cs 的 ConfigureServices 方法,把返回值从 void 改为 IServiceProvider

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<Person>();
    return services.BuildAspectCoreServiceProvider();
}

其 中 services.AddSingleton(); 表 示 把 Person 注 入 。
BuildAspectCoreServiceProvider 是让 aspectcore 接管注入。
在 Controller 中就可以通过构造函数进行依赖注入了:

public class ValuesController : Controller
{
    private Person p;
    public ValuesController(Person p)
    {
        this.p = p;
    }
}

通过反射扫描所有 Service 类,只要类中有标记了 CustomInterceptorAttribute 的方法 都算作服务实现类

在Startup ConfigureServices 中
RegisterServices(this.GetType().Assembly, services);

private static void RegisterServices(Assembly asm, IServiceCollection services)
{
    //遍历程序集中的所有 public 类型
    foreach (Type type in asm.GetExportedTypes())
    {
        //判断类中是否有标注了 CustomInterceptorAttribute 的方法
        bool hasCustomInterceptorAttr = type.GetMethods()
        .Any(m => m.GetCustomAttribute(typeof(CustomInterceptorAttribute)) != null);
        if (hasCustomInterceptorAttr)
        {
            services.AddSingleton(type);
        }
    }
}
posted @ 2018-09-22 16:48  Amayer  阅读(439)  评论(0编辑  收藏  举报