写点什么

容错、熔断的使用与扩展

作者:神农写代码
  • 2022 年 7 月 13 日
  • 本文字数:2041 字

    阅读完需:约 7 分钟

@[toc]

一、容错机制的介绍

  • 概念当客户端调用微服务的时候,出现了故障,能够进行故障转移,就是容错机制。如图:


  • 目的保证微服务的高可用。

二、为什么使用容错机制

  • 故障转移机制如图:

三、如何在微服务中应用容错机制

  • 实现条件

  • while

  • 实现步骤


      int count = 0;      //故障转移      for(int i=0;i<=3;i++)      {           //判断是否达到阀值           if (count == 3)           {             //退出循环,返回异常信息             throw  Exception("微服务重试操作超出阀值");           }            //业务代码           try           {              // HttpClient 请求微服务代码              ...................           }           catch(Exception  ex)           {               //捕获异常信息                count ++;              }      } 
复制代码

四、容错机制的缺陷

  • 缺陷

  • 性能低,耗资源

  • 解决方案

  • 设置固定的次数

  • 使用熔断机制

五、如何在微服务系统中使用 Polly

  • 熔断

  • 概念熔断的是一个请求。当请求到服务器的时候,该请求重试了 3 次【测试次数】,没有请求成功,直接熔断该请求,下次请求进来,不必再去重试,直接返回异常信息。

  • 条件

  • Polly

  • 代码实现

  • 条件

  • 安装 Polly

  • 步骤

  • 安装


       Microsoft.Extensions.Http.Polly
复制代码


- 在Startup.cs 文件中注册  - 方法名 ConfigureServices
复制代码


           //异常降级信息              var fallBack = new HttpResponseMessage(){                  Content = new StringContent("系统忙!"),                 StatusCode = 504             };           //5:断路器阀值           //10:熔断时间           //ExecutionRejectedException:捕获熔断的所有异常信息           //10:使用的线程总数            services.AddHttpClient("micro[请求复用:自定义名称]")                .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<ExecutionRejectedException>().Fallback(fallBack))  //异常信息降级                .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().CircuitBreakerAsync(5,TimeSpan.FromSeconds(10))) //断路器                .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMeaage>(60))//设置超时时间                .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().RetryAsync(1))//重试次数                .AddPolicyHandler(Policy.BulkheadAsync<HttpResponseMeaage>(10,100));//资源(线程)隔离  //10:使用的线程总数  100:请求缓存总数
复制代码


  - 业务代码
复制代码


            private HttpClientFactory _httpClientFactory;            //构造函数中注入            构造函数(HttpClientFactory httpClientFactory)            {              _httpClientFactory = httpClientFactory;            }                            int count = 0;          //故障转移          for(int i=0;i<=3;i++)          {               //判断是否达到阀值               if (count == 3)               {                 //退出循环,返回异常信息                 throw  Exception("微服务重试操作超出阀值");               }                //业务代码                try               {                 //微服务请求                 HttpClient client = _httpClientFactory.CreateClient("micro");                 .........               }               catch(HttpRequestException  ex)               {                     //捕获异常信息                    count ++;                  }          } 
复制代码

六、微服务容错机制 Polly 扩展

  • 如果在聚合微服务中同时调用了两个微服务,当第一个服务挂掉,为了不影响后面的服务调用,我们要做服务隔离,代码如下:

  • 在 Startup.cs 文件中注册

  • 方法名 ConfigureServices


          services.AddHttpClient("根据不同的服务定义不同的名称")                    .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<ExecutionRejectedException>().Fallback(fallBack))  //异常信息降级                    .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().CircuitBreakerAsync(5,TimeSpan.FromSeconds(10))) //断路器                    .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMeaage>(60))//设置超时时间                    .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().RetryAsync(1))//重试次数                    .AddPolicyHandler(Policy.Bulkhead<HttpResponseMeaage>(10,100));//资源隔离
复制代码


   ==注意:当http请求的时候,请求各自服务的名称必须和注册名称一致。==
复制代码


  • 调用方代码


       HttpClient client = _httpClientFactory.CreateClient("根据不同的服务定义不同的名称");
复制代码


发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2022.03.14 加入

好好学习,天天向上!

评论

发布
暂无评论
容错、熔断的使用与扩展_神农写代码_InfoQ写作社区