【.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入门看这篇就够了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP-MM 新增公司代码 激活物料分类账

1、OMX1 - 激活物料分类账&#xff08;配置环境&#xff09; 2、CKMSTART - 物料分类账的生产开始&#xff08;生产机运行&#xff09; 不激活创建物料时会报错&#xff1a;估价范围还没有生产式的物料账簿 执行后结果&#xff1a; 以上~~

creo扫描杯子学习笔记

creo扫描杯子学习笔记 扫描2要素&#xff1a; 轨迹&#xff0c; 截面。 多用于曲线扫描&#xff0c;区别于拉伸命令。 大小自定 旋转扫描 抽壳 草绘把手 扫描把手 复制曲面 实例化切除 成型

Web爬虫

&#x1f4d1;前言 本文主要是【Web爬虫】——简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#…

PHP实现网站微信扫码关注公众号后自动注册登陆实现方法及代码【关注收藏】

在网站注册登陆这环节&#xff0c;增加微信扫码注册登陆&#xff0c;普通的方法需要开通微信开发者平台&#xff0c;生成二维码扫码后才能获取用户的uinonid或openid&#xff0c;实现注册登陆&#xff0c;但这样比较麻烦还要企业认证交费开发者平台&#xff0c;而且没有和公众号…

区域自动气象站讲解

TH-QC10当我们每天查看天气预报&#xff0c;安排出行计划&#xff0c;或是在户外活动时关注天气变化&#xff0c;很少有人会想到这一切背后默默付出的“英雄”——区域自动气象站。这些看似不起眼的气象监测设备&#xff0c;却在我们日常生活中扮演着至关重要的角色。今天&…

【话题】程序员35岁会失业吗?

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景招聘分析一、技术更新换代的挑战二、经验与技术的双重优势三、职业发展的多元化选择四、个人成长与职业规划的平衡五、结语文章推荐 背景 35岁被认为是程序员职业生…

【OJ】stack刷题

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 155. 最小栈1.1 分析1.2 代码 2. JZ31 栈的压入、弹出序列2.1 分析2.2 代码 3. 150. 逆波兰表达式求值3.1 分析3.2 代码 1. 155. 最小栈 1.1 分析 利用两个栈&#xff0c;一个栈a负责入数据和出数据&#xff0c;另一个…

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

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

合宙开发板Core_Air780E测试AT指令

一、官方资料 CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的&#xff0c;包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。以方便用户在设计前期对 Air780E 模块 进行性能评估&#xff0c;功能调试&…

CUDA10的安装

1、因为要用到tensorflow1.15.5的GPU版本&#xff0c;所以想安装cuda10来进行加速&#xff0c;通过nvidia-smi检查本机上的CUDA版本 2、下载的cuda10版本&#xff0c;cuda_10.0.130_411.31_win10.exe 下载的cudnn版本&#xff0c;cudnn-10.0-windows10-x64-v7.6.4.38.zip 然后…

mathtype如何嵌入到word中?mathtype 7永久激活码密钥及2024最新序列号附安装教程

将MathType嵌入到Word中的方法主要有三种&#xff0c;分别是&#xff1a; 通过加载项嵌入MathType。首先&#xff0c;在Word中点击“文件”按钮&#xff0c;选择“选项”&#xff0c;然后选择“加载项”一栏&#xff0c;找到MathType相关的加载项并勾选&#xff0c;点击“确定…

20240404这个数字有什么特点吗?

今天是2024年的清明节&#xff0c;20240404这个数字让我提出了一个疑问&#xff0c;它是否有什么含义或者特点呢&#xff1f; 首先&#xff0c;如果把它拆分为两个整数的平方和&#xff0c;会怎么样呢&#xff1f; 于是&#xff0c;我一顿操作猛如虎&#xff0c;搞出了这么个…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

Kubernetes学习笔记8

Kubernetes集群客户端工具kubectl 我们已经能够部署Kubernetes了&#xff0c;那么我们如何使用Kubernetes集群运行企业的应用程序呢&#xff1f;那么&#xff0c;我们就需要使用命令行工具kubectl。 学习目标&#xff1a; 了解kubectl 命令帮助方法 了解kubectl子命令使用分…

看不惯各种信息收集表,我手写了一个身份证号输入组件

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 背景 shigen最近的需要填写各种报名表的场景有点多&#xff0c;很多场景都要输…

三防笔记本丨加固笔记本丨三防笔记本电脑赋能车辆检修

随着汽车数量的不断增加和交通运输行业的发展&#xff0c;车辆检修行业成为了保障交通安全和延长车辆寿命的重要领域。在车辆检修过程中&#xff0c;需要使用各种工具和设备来进行检测、维修和保养&#xff0c;而信息化技术的应用正逐渐渗透到这一行业中&#xff0c;为检修工作…

【C++】背包问题

目录 背包问题01 背包背包不装满问题背包必须满问题 完全背包 背包问题 背包问题属于动态规划的一类题型 01 背包 背包不装满问题 背包必须满问题 #include <iostream> using namespace std; const int N 1010; #include <vector> int main() {int n , V;int v[…

如何做好产业园运营?树莓集团:响应政府号召,规划,注重大局观

随着经济的发展和产业结构的调整&#xff0c;产业园区的建设和发展已经成为推动地方经济的重要力量。如何做好产业园运营&#xff0c;提高行业竞争力&#xff0c;现已成为了一个亟待解决的问题。树莓集团作为一家有着丰富产业园运营经验的企业&#xff0c;积极响应政府号召&…

从头开发一个RISC-V的操作系统(五)汇编语言编程

文章目录 前提RISC-V汇编语言入门RISC-V汇编指令总览汇编指令操作对象汇编指令编码格式add指令介绍无符号数 练习参考链接 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于…

地面站Mission Planner从源码编译与运行

0. 环境 - win10&#xff08;基本需要100G硬盘&#xff09; - ubuntu18 1. 安装vs2022 下载 vs2022 community 在线安装包。 https://visualstudio.microsoft.com/ 打开 Visual Studio Installer 先安装 Visual Studio Community 2022本体。占用1.2GB。 Visual Studio Inst…