• 微服务--熔断降级


    熔断降级

    什么是熔断

    熔断就是在被调用端出现宕机,和超时两种情况出现的一种策略应对机制。

    熔断就好比保险丝,我们先来看一看保险丝的情况

    为什么要使用熔断

    ​ 1、服务调用出现异常(包括超时和宕机两种情况)

    ​ 如果服务连续几次都出现异常,那么就将服务进行熔断一段时间,

    什么是降级

    为什么要使用降级

    ​ 1、服务主动降级(选择性放弃)

    ​ 主动将服务进行进行异常返回

    ​ 2、服务异常降级

    ​ 如果服务调用出现超时或者宕机的情况,就按照自定义的策略进行返回。

    项目中熔断降级的目的是保证系统的弹性,使系统高可用

    项目中如何运用熔断降级

    熔断降级工具

    ​ 1、Polly

    ​ 2、Hystrix

    微服务中如何使用Polly

    主要功能

    ​ 重试(Retry)

    ​ 断路器(Circuit-breaker)

    ​ 超时检测(Timeout)

    ​ 缓存(Cache)

    ​ 降级(FallBack)

    Polly官网地址

    http://www.thepollyproject.org/

    Polly安装

    ​ Nuget Microsoft.Extensions.Http.Polly

    Polly如何使用

    ​ 条件

    ​ 1、微服务项目

    ​ 2、Polly

    ​ 3、Polly http扩展

    ​ 步骤

    ​ 1、先通过nuget进行安装

    ​ Microsoft.Extensions.Http.Polly

    ​ 2、然后在HttpClient后面添加扩展方法AddPolicyHandler()

    ​ 3、然后在团队服务里面,测试宕机,和超时情况

    ​ 3、先选择熔断策略

    .AddPolicyHandler(Policy.Handle().CircuitBreakerAsync(3, TimeSpan.FromSeconds(10), (ex, ts) => {
                    Console.WriteLine($"服务{name}断路器开启,异常消息:{ex.Exception.Message}");
                    Console.WriteLine($"服务{name}断路器开启时间:{ts.TotalSeconds}s");
                }, () => {
                    Console.WriteLine($"服务{name}断路器重置");
                }, () => {
                    Console.WriteLine($"服务{name}断路器半开启(一会开,一会关)");
                }))	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ​ 5、然后选择降级策略

    var fallbackResponse = new HttpResponseMessage
    {
    	Content = new StringContent("系统出现异常,请稍后重试"),
    	StatusCode = HttpStatusCode.GatewayTimeout
    };
    
    .AddPolicyHandler(Policy.HandleInner().FallbackAsync(options.httpResponseMessage, async b =>
               {
                   // 1、降级打印异常
                   Console.WriteLine($"服务{name}开始降级,异常消息:{b.Exception.Message}");
                   // 2、降级后的数据
                   Console.WriteLine($"服务{name}降级内容响应:{options.httpResponseMessage.Content.ToString()}");
                   await Task.CompletedTask;
               }))	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ​ 6、然后选择重试策略

    .AddPolicyHandler(Policy
                  .Handle()
                  .RetryAsync(options.RetryCount)
                )
    
    • 1
    • 2
    • 3
    • 4

    ​ 7、最后选择超时机制

    		 .AddPolicyHandler(Policy.TimeoutAsync(TimeSpan.FromSeconds(options.TimeoutTime)));
    
    • 1
    Polly如何在项目中封装

    ​ 条件

    ​ 1、IServiceCollection扩展类

    ​ 2、HttpClientPolly选项类

    ​ 步骤

    ​ 1、创建PollyHttpClientServiceCollectionExtensions类

           /// 
            /// Httpclient扩展方法
            /// 
            /// ioc容器
            /// HttpClient 名称(针对不同的服务进行熔断,降级)
            /// 熔断降级配置
            /// 降级处理错误的结果
            /// 
            public static IServiceCollection AddHttpClientPolly(this IServiceCollection services,string name,Action action)
            {
                // 1、创建选项配置类
                HttpClientPollyOptions options = new HttpClientPollyOptions();
                action(options);
           // 2、配置httpClient,熔断降级策略
            services.AddHttpClient(name)
           //1.1 降级策略
           .AddPolicyHandler(Policy.HandleInner().FallbackAsync(options.httpResponseMessage, async b =>
           {
               // 1、降级打印异常
               Console.WriteLine($"服务{name}开始降级,异常消息:{b.Exception.Message}");
               // 2、降级后的数据
               Console.WriteLine($"服务{name}降级内容响应:{options.httpResponseMessage.Content.ToString()}");
               await Task.CompletedTask;
           }))
            // 1.2 断路器策略
            .AddPolicyHandler(Policy.Handle().CircuitBreakerAsync(options.CircuitBreakerOpenFallCount, TimeSpan.FromSeconds(options.CircuitBreakerDownTime), (ex, ts) => {
                Console.WriteLine($"服务{name}断路器开启,异常消息:{ex.Exception.Message}");
                Console.WriteLine($"服务{name}断路器开启时间:{ts.TotalSeconds}s");
            }, () => {
                Console.WriteLine($"服务{name}断路器关闭");
            }, () => {
                Console.WriteLine($"服务{name}断路器半开启(时间控制,自动开关)");
            }))
            // 1.3 重试策略
            .AddPolicyHandler(Policy
              .Handle()
              .RetryAsync(options.RetryCount)
            )
            // 1.4 超时策略
            .AddPolicyHandler(Policy.TimeoutAsync(TimeSpan.FromSeconds(options.TimeoutTime)));
            return services;
        }	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    ​ 2、然后创建熔断,降级,重试,超时HttpClientPollyOptions配置类

        /// 
            /// 超时时间设置,单位为秒
            /// 
            public int TimeoutTime { set; get; }
        /// 
        /// 失败重试次数
        /// 
        public int RetryCount { set; get; }
    
        /// 
        /// 执行多少次异常,开启短路器(例:失败2次,开启断路器)
        /// 
        public int CircuitBreakerOpenFallCount { set; get; }
    
        /// 
        /// 断路器开启的时间(例如:设置为2秒,短路器两秒后自动由开启到关闭)
        /// 
        public int CircuitBreakerDownTime { set; get; }
    
        /// 
        /// 降级处理(将异常消息封装成为正常消息返回,然后进行响应处理,例如:系统正在繁忙,请稍后处理.....)
        /// 
        public HttpResponseMessage httpResponseMessage { set; get; }			
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    ​ 3、封装后的代码调用

    services.AddPollyHttpClient("tony",options => {
    	options.TimeoutTime = 1;
    	options.RetryCount = 3;
    	options.CircuitBreakerOpenFallCount = 2;
    	options.CircuitBreakerDownTime = 100;
    	options.httpResponseMessage = fallbackResponse;
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    高并发+海量数据下如何实现系统解耦?【下】
    MBA-day19 如果p则q矛盾关系p 且非q
    机器学习课后习题 --- 逻辑回归
    elementUI选择框,value为0时无法获取的问题以及解决办法
    linux 实时调度实现
    2.Android高仿网易云音乐-引导界面和广告界面实现
    Linux——指令初识(二)
    Spark创建空的df
    第十四章·享元模式
    前端设计模式之【工厂模式】
  • 原文地址:https://blog.csdn.net/huan13479195089/article/details/128137351