@[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("依据不同的服务定义不同的名称");