当前位置 : 主页 > 网络编程 > net编程 >

容错、熔断的使用与扩展

来源:互联网 收集:自由互联 发布时间:2023-09-07
一、容错机制的介绍 概念当客户端调用微服务的时候,出现了故障,能够进行故障转移,就是容错机制。如图: 目的保证微服务的高可用。 二、为什么使用容错机制 故障转移机制如图

一、容错机制的介绍

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

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

二、为什么使用容错机制

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

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

  • 实现条件
    • 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("根据不同的服务定义不同的名称");
      
上一篇:八、变量
下一篇:没有了
网友评论