【.Net】Polly

文章目录

  • 概述
  • 服务熔断、服务降级、服务限流、流量削峰、错峰、服务雪崩
  • Polly的基本使用
    • 超时策略
      • 悲观策略
      • 乐观策略
    • 重试策略
      • 请求异常
      • 响应异常
    • 降级策略
    • 熔断策略与策略包裹(多种策略组合)
  • 参考

概述

Polly是一个被.NET基金会支持认可的框架,同时也是一个.NET弹性和瞬态故障处理库。它允许开发人员以流畅和线程安全的方式表达多种策略,包括重试(Retry)、断路器(Circuit Breaker)、超时(Timeout)、舱壁隔离(Bulkhead Isolation)和回退(Fallback)等。这些策略在应对瞬时故障和网络问题时非常有用,可以帮助提高应用程序的可用性和稳定性。

Polly框架的价值在于它为微服务场景提供了强大的支持。在微服务架构中,服务之间的调用关系复杂,状态难以掌控。Polly框架可以帮助开发人员更好地管理和监控微服务,包括调用拓扑关系、各服务节点运行存活状态、日志收集分析、异常调用追踪以及网络实况监控等。

此外,Polly框架还提供了对HTTP请求的重试机制,可以对指定异常进行特殊处理,并封装了多种恢复策略,使得开发人员能够更灵活地应对各种故障情况。

总之,Polly框架是一个功能强大且灵活的.NET库,它可以帮助开发人员更好地处理瞬态故障和提高应用程序的可用性,特别是在微服务场景中,Polly框架的价值更加凸显。

服务熔断、服务降级、服务限流、流量削峰、错峰、服务雪崩

服务雪崩

在微服务中,服务A调用服务B,服务B可能会调用服务C,服务C又可能调用服务D等等,这种情况非常常见。如果服务D出现不可用或响应时间过长,就会导致服务C原来越多的线程处于网络调用等待状态,进而影响到服务B,再到服务A等,最后会耗尽整个系统的资源,导致整体的崩溃,这就是微服务中的“雪崩效应”。
服务熔断、服务降级、服务限流、流量削峰、错峰请阅读:
【服务治理】服务熔断、服务降级、服务限流、流量削峰、错峰

Polly的基本使用

//当我们的代码触发HttpRequestException异常时,才进行处理。
Policy.Handle<HttpRequestException>();//只有触发SqlException异常,并且其异常号为1205的时候才进行处理
Policy.Handle<SqlException>(ex => ex.Number == 1205)//使用 Or<T> 来实现同时处理多种异常
Policy.Handle<HttpRequestException>().Or<OperationCanceledException>()//根据返回结果进行故障定义
Policy.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound)
var policy = /*策略定义*/;
var res = await policy.ExecuteAsync(/*业务代码*/);//指定多个策略
Policy.Wrap(retry, breaker, timeout).ExecuteAsync(/*业务代码*/);//或者
Policy.Wrap(waitAndRetry.Wrap(breaker)).ExecuteAsync(action);

接下来继续介绍几种主要的策略

创建了一个控制台项目PollyConsole用于演示,访问的服务为ServiceA项目。

项目安装Nuget包:
在这里插入图片描述

超时策略

Polly 中关于超时的两个策略:一个是悲观策略(Pessimistic),一个是乐观策略(Optimistic)。其中,悲观策略超时后会直接抛异常,而乐观策略则不会,而只是触CancellationTokenSource.Cancel函数,需要等待委托自行终止操作。一般情况下,我们都会用悲观策略。

代码演示:
我们这里设置了一个超时时间不能超过 5 秒(方便测试),否则就认为是错误的结果的超时策略场景。
在这里插入图片描述
在这里插入图片描述

悲观策略

执行回调,抛异常
在这里插入图片描述

乐观策略

执行效果,不会抛异常
在这里插入图片描述

重试策略

请求异常

当发生 HttpRequestException 的时候触发 RetryAsync 重试,并且最多重试3次
在这里插入图片描述
当前并不存在 /polly/1 api 所以用来模拟重试策略,看看执行效果:

在这里插入图片描述

响应异常

当请求结果为 Http Status_Code 500 的时候进行3次重试,我们先在ServiceA服务添加测试接口,然后在PollyConsole项目请求接口,完成测试效果。

在这里插入图片描述PollyConsole

在这里插入图片描述
看看执行效果:
在这里插入图片描述

降级策略

策略模拟逻辑
首先我们使用 Policy 的 FallbackAsync(“FALLBACK”) 方法设置降级的返回值。当我们服务需要降级的时候会返回 “FALLBACK” 的固定值。

同时使用 WrapAsync 方法把重试策略包裹起来。这样我们就可以达到当服务调用失败的时候重试3次,如果重试依然失败那么返回值降级为固定的 “FALLBACK” 值。

在这里插入图片描述
首选我们先正常访问
在这里插入图片描述然后我们停掉被访问的服务 ServiceA
在这里插入图片描述

熔断策略与策略包裹(多种策略组合)

首先定义熔断策略
在这里插入图片描述
然后定义重试策略与降级策略并进行策略包裹

在这里插入图片描述
定义降级方法(模拟)与最终测试方法

在这里插入图片描述
策略模拟逻辑
发送请求,观察请求结果,当请求出现异常的时候会进行三次重试,重试后还不行,就会打开断路器10s,10s内不会往服务端发送任何请求,只会请求降级方法,10s后为断路器改为半开状态,会尝试释放部分流量去服务端,再次观察请求结果…

看看测试效果(当前模拟服务不通的情况):
在这里插入图片描述
然后启动被请求的服务,模拟在服务正常情况下的效果:
在这里插入图片描述
到这里,我们对于几种策略的演示就差不多大功告成了。如有理解不对的地方还请告知。
本文只是基本的策略演示,实际项目需要结合HttpClientFactory 使用。

参考

.Net6 微服务之Polly入门看这篇就够了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/595526.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言--指针终章

目录 1. sizeof和strlen的对⽐ 1.1 sizeof 1.2 strlen 1.3 sizeof 和 strlen的对⽐ 2. 数组和指针的理解——题目理解 2.1.sizeof 代码1&#xff1a; 代码2&#xff1a; 代码3&#xff1a; 代码4&#xff1a; 代码5&#xff08;二维数组&#xff09;&#xff1a; 2.2…

分类预测 | Matlab实现DRN深度残差网络数据分类预测

分类预测 | Matlab实现DRN深度残差网络数据分类预测 目录 分类预测 | Matlab实现DRN深度残差网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现DRN深度残差网络数据分类预测&#xff08;完整源码和数据&#xff09;&#xff0c;运行环境为Matl…

【Docker系列】在 Linux 上安装 Docker Compose 的简明步骤

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

7.java openCV4.x 入门-Mat之转换、重塑与计算

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

单一职责原则

1.1 阅读干吗不直接用手机&#xff1f; 电子阅读器比较专注&#xff0c;而手机功能比较多&#xff0c;影响专注。 1.2 手机不纯粹 手机确实很方便。但是现在的手机就是一台小型智能电脑。它不仅能打电话&#xff0c;还能听音乐、看电影电视、与个人交流、与一群人群聊&#…

免费SSL证书申请指南

在互联网时代&#xff0c;HTTPS安全协议已成网站标配&#xff0c;而SSL/TLS证书是实现HTTPS的关键。以下是如何申请免费证书的简明流程&#xff1a; 1.选择证书颁发机构&#xff08;CA&#xff09;&#xff1a;现今很多知名CA如JoySSL、Lets Encrypt等提供免费SSL证书服务。选定…

LeetCode题练习与总结:插入区间--57

一、题目描述 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3],[6,9]], newInterval [2,5] 输出&#xff1a;[[1,5],[6,9]]示例 2&#xff1a; 输入&#xff1a;intervals [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval [4,8] 输出&#xff1a;[[1,2],[3,10],[…

深度学习-机器视觉part2

深度学习-机器视觉part2 文章目录 深度学习-机器视觉part2一、从卷积到卷积神经网络二、手撕卷积代码2.1 动机2.2 数据集2.3 卷积操作2.3.1 填充&#xff08;padding&#xff09;2.3.2 卷积块2.3.3 池化2.3.4 Softmax 2.4 完整CNN2.5 训练改进 三、经典CNN模型介绍四、CNN模型的…

IDEA删除块注释(文档注释)/**

1. 问题缘由 在使用java写LeetCode的时候&#xff0c;有些题会有一些封装好的类&#xff0c;在本地编写代码的时候&#xff0c;如果没有定义好这些类&#xff0c;就会爆红&#xff0c;看着很难受&#xff0c;此时可以把官方定义好的类拿过来&#xff0c;但是这些类是有块注释的…

VM虚拟机部署code-server服务+tailscale内网穿透,实现随处coding

1.Linux下安装code-server Releases coder/code-server (github.com)https://github.com/coder/code-server/releases先去发布页面查看最新的code-server版本&#xff0c;下载命令示例&#xff1a; wget https://github.com/coder/code-server/releases/download/v4.22.1/co…

KeyguardClockSwitch的父类

KeyguardClockSwitch 定义在KeyguardStatusView中, mClockView findViewById(R.id.keyguard_clock_container);KeyguardClockSwitch的父类为&#xff1a; Class Name: LinearLayout Class Name: KeyguardStatusView Class Name: NotificationPanelView Class Name: Notificat…

如何注册midjourney账号

注册Midjourney账号比较简单&#xff0c;准备好上网工具&#xff0c;进入官网 Midjourney访问地址&#xff1a; https://www.midjourney.com/ 目前没有免费使用额度了&#xff0c;会员最低 10 美元/月&#xff0c;一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…