0
点赞
收藏
分享

微信扫一扫

容错、熔断的使用与扩展

@[toc]

一、容错机制的介绍

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

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

    二、为什么使用容错机制

  • 故障转移机制
    如图:
    在这里插入图片描述

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

  • 实现条件
    • while
  • 实现步骤
    ```C#
    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("根据不同的服务定义不同的名称");
举报

相关推荐

0 条评论