乐趣区

关于c#:容错熔断的使用与扩展

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