『容错机制』 .NET 弹性和瞬态故障处理库Polly应用详解

简介: 所谓瞬态故障,就是说故障不是必然会发生的,而是偶然可能会发生的,比如网络偶尔会突然出现不稳定或无法访问这种故障。至于弹性,就是指应对故障 Polly 的处理策略具有多样性和灵活性,它的各种策略可以灵活地定义和组合。

Polly官方介绍

Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

翻译过来大概意思是:Polly 是一个 .NET 弹性和瞬态故障处理库,允许开发人员以线程安全的方式来实现重试、断路、超时、隔离和回退策略。

首先这里的说的瞬态故障包含了程序发生的异常和出现不符合开发者预期的结果。

所谓瞬态故障,就是说故障不是必然会发生的,而是偶然可能会发生的,比如网络偶尔会突然出现不稳定或无法访问这种故障。至于弹性,就是指应对故障 Polly 的处理策略具有多样性和灵活性,它的各种策略可以灵活地定义和组合。


一 、熔断降级——概念及原理

1. 什么是熔断

熔断就是在被调用端出现宕机,和超时两种情况出现的一种策略应对机制。

熔断就好比保险丝,我们先来看一看保险丝的情况
在这里插入图片描述

2. 为什么要使用熔断

​ 1、服务调用出现异常(包括超时和宕机两种情况)

​ 如果服务连续几次都出现异常,那么就将服务进行熔断一段时间,
在这里插入图片描述

3. 什么是降级

在这里插入图片描述

4. 为什么要使用降级

​ 1、服务主动降级(选择性放弃)

​ 主动将服务进行进行异常返回

​ 2、服务异常降级

​ 如果服务调用出现超时或者宕机的情况,就按照自定义的策略进行返回。

项目中熔断降级的目的是保证系统的弹性,使系统高可用
在这里插入图片描述

5. Polly熔断原理

在这里插入图片描述


二 、熔断降级——Polly介绍

1. 熔断降级工具

  1. Polly
  2. Hystrix

2. 主要功能

  • 重试(Retry)
  • 断路器(Circuit-breaker)
  • 超时检测(Timeout)
  • 缓存(Cache)
  • 降级(FallBack)

3. Polly官网地址

http://www.thepollyproject.org/

三 、熔断降级——Polly项目应用

1. Polly使用

  • 条件
  1. .Net Core项目
  2. 微服务项目
  3. Polly
  4. Polly Http扩展
  • 步骤
  1. 先通过nuget进行安装

    Microsoft.Extensions.Http.Polly

  2. 然后在HttpClient后面添加扩展方法AddPolicyHandler()
  3. 然后在团队服务里面,测试宕机,和超时情况

2. Polly策略搭配

熔断策略

.AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().CircuitBreakerAsync(3, TimeSpan.FromSeconds(10), (ex, ts) => {
                Console.WriteLine($"服务{name}断路器开启,异常消息:{ex.Exception.Message}");
                Console.WriteLine($"服务{name}断路器开启时间:{ts.TotalSeconds}s");
            }, () => {
                Console.WriteLine($"服务{name}断路器重置");
            }, () => {
                Console.WriteLine($"服务{name}断路器半开启(一会开,一会关)");
            }))    

降级策略

var fallbackResponse = new HttpResponseMessage
{
    Content = new StringContent("系统出现异常,请稍后重试"),
    StatusCode = HttpStatusCode.GatewayTimeout
};

.AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(options.httpResponseMessage, async b =>
           {
               // 1、降级打印异常
               Console.WriteLine($"服务{name}开始降级,异常消息:{b.Exception.Message}");
               // 2、降级后的数据
               Console.WriteLine($"服务{name}降级内容响应:{options.httpResponseMessage.Content.ToString()}");
               await Task.CompletedTask;
           }))    

重试策略

.AddPolicyHandler(Policy<HttpResponseMessage>
              .Handle<Exception>()
              .RetryAsync(options.RetryCount)
            )

超时机制

超时机制必须要慎用,需要考虑相关服务的幂等性

.AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(options.TimeoutTime)));

3. Polly封装

  • 条件
  1. IServiceCollection扩展类
  2. HttpClientPolly选项类
  • 步骤
  1. 创建PollyHttpClientServiceCollectionExtensions
/// <summary>
/// Httpclient扩展方法
/// </summary>
/// <param name="services">ioc容器</param>
/// <param name="name">HttpClient 名称(针对不同的服务进行熔断,降级)</param>
/// <param name="action">熔断降级配置</param>
/// <param name="TResult">降级处理错误的结果</param>
/// <returns></returns>
public static IServiceCollection AddHttpClientPolly(this IServiceCollection services,string name,Action<HttpClientPollyOptions> action)
{
    // 1、创建选项配置类
    HttpClientPollyOptions options = new HttpClientPollyOptions();
    action(options);
// 2、配置httpClient,熔断降级策略
services.AddHttpClient(name)
//2.1 降级策略
.AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(options.httpResponseMessage, async b =>
{
   Console.WriteLine($"服务{name}开始降级,异常消息:{b.Exception.Message}");
   Console.WriteLine($"服务{name}降级内容响应:{options.httpResponseMessage.Content.ToString()}");
   await Task.CompletedTask;
}))
// 2.2 断路器策略
.AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().CircuitBreakerAsync(options.CircuitBreakerOpenFallCount, TimeSpan.FromSeconds(options.CircuitBreakerDownTime), (ex, ts) => {
    Console.WriteLine($"服务{name}断路器开启,异常消息:{ex.Exception.Message}");
    Console.WriteLine($"服务{name}断路器开启时间:{ts.TotalSeconds}s");
}, () => {
    Console.WriteLine($"服务{name}断路器关闭");
}, () => {
    Console.WriteLine($"服务{name}断路器半开启(时间控制,自动开关)");
}))
// 2.3 重试策略
.AddPolicyHandler(Policy<HttpResponseMessage>
  .Handle<Exception>()
  .RetryAsync(options.RetryCount)
)
// 2.4 超时策略
.AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(options.TimeoutTime)));
return services;
}    
  1. 然后创建熔断,降级,重试,超时HttpClientPollyOptions配置类
/// <summary>
/// 超时时间设置,单位为秒
/// </summary>
public int TimeoutTime { set; get; }
/// <summary>
/// 失败重试次数
/// </summary>
public int RetryCount { set; get; }

/// <summary>
/// 执行多少次异常,开启短路器(例:失败2次,开启断路器)
/// </summary>
public int CircuitBreakerOpenFallCount { set; get; }

/// <summary>
/// 断路器开启的时间(例如:设置为2秒,短路器两秒后自动由开启到关闭)
/// </summary>
public int CircuitBreakerDownTime { set; get; }

/// <summary>
/// 降级处理(将异常消息封装成为正常消息返回,然后进行响应处理,例如:系统正在繁忙,请稍后处理.....)
/// </summary>
public HttpResponseMessage httpResponseMessage { set; get; }        
  1. 封装后的代码调用
services.AddPollyHttpClient("cyf",options => {
    options.TimeoutTime = 1;
    options.RetryCount = 3;
    options.CircuitBreakerOpenFallCount = 2;
    options.CircuitBreakerDownTime = 100;
    options.httpResponseMessage = fallbackResponse;
});
相关文章
|
4天前
|
人工智能 前端开发 Devops
.NET技术在现代开发中的作用:.NET技术的核心价值、在现代应用开发中的实际应用、以及面临的挑战与未来趋势。
.NET技术是软件开发领域的核心力量,本文从其核心价值、实际应用及未来挑战三方面进行探讨。它支持多种语言,提供强大的开发工具和丰富的类库,并具备跨平台能力。在现代应用开发中,.NET广泛应用于企业级系统、Web应用、移动应用、云服务和游戏开发等领域。面对性能优化、容器化、AI集成等挑战,.NET持续创新以适应不断发展变化的技术环境。
15 4
|
8天前
|
Unix Linux C#
增强用户体验:2个功能强大的.NET控制台应用帮助库
增强用户体验:2个功能强大的.NET控制台应用帮助库
|
4天前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
12 4
|
4天前
|
人工智能 物联网 开发者
.NET技术在现代软件开发中的应用愈发广泛和深入
.NET技术是软件开发的关键支柱,本文分为三部分探讨其创新应用:最新进展如.NET 5/6统一平台、性能提升、跨平台支持增强、云集成优化及开源社区贡献;应用场景涵盖微服务架构、物联网、AI/机器学习、游戏及移动应用开发;未来发展潜力在于持续性能优化、云原生支持、新兴技术集成、生态扩张及教育培训加强。.NET正以其强大适应性和创新潜力引领软件开发的新方向。
13 3
|
4天前
|
人工智能 开发框架 .NET
如何掌握.NET技术,引领开发前沿:.NET技术的核心能力、在现代开发中的应用实践、以及如何通过.NET技术实现持续创新。
.NET技术已成为软件开发不可或缺的部分,本文分三部分探讨:核心能力如多语言支持、统一运行时环境、丰富的类库及跨平台能力;现代开发实践包括企业级应用、Web与移动开发、云服务及游戏开发;并通过性能优化、容器化、AI集成等方面实现持续创新,使开发者站在技术前沿。
14 3
|
4天前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
1天前
|
缓存 运维 前端开发
阿里云云效操作报错合集之如何解决在使用流水线构建net8应用时遇到无法构建的报错
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
4天前
|
人工智能 前端开发 开发工具
NET在企业级应用、Web开发、移动应用、云服务及游戏领域的创新实践
.NET技术自2000年推出以来,在软件开发领域扮演着关键角色。本文从核心优势出发,探讨其统一多语言平台、强大工具集、跨平台能力及丰富生态系统的价值;随后介绍.NET在企业级应用、Web开发、移动应用、云服务及游戏领域的创新实践;最后分析性能优化、容器化、AI集成等方面的挑战与机遇,展望.NET技术的未来发展与潜力。
13 2
|
4天前
|
人工智能 前端开发 开发工具
.NET技术的开发潜力是巨大的,其核心优势和广泛应用不断推动着软件开发的进步
.NET技术自推出后已成为软件开发的关键力量。本文分三部分探讨其开发潜力:核心优势如统一平台、强大工具与跨平台能力;现代应用中的创新,包括企业级与Web应用、移动开发、云服务及游戏制作;以及面对的挑战与未来机遇,如性能优化、容器化支持、AI集成等。.NET的持续发展正塑造着软件行业的未来。
18 1
|
16天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
42 2