• 微服务入门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);
            }
        }
    }
    
  • 相关阅读:
    前端JS 4
    前端JS 3
    前端JS 2
    前端JS 1
    JS的知识补丁
    去除inline-block元素间的空隙
    js中“||”和“&&”的高级用法
    WebAPP-1
    Node.js_1
    click和onclick的区别
  • 原文地址:https://www.cnblogs.com/Amayer/p/9690475.html
Copyright © 2020-2023  润新知