【.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.rhkb.cn/news/303522.html

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

相关文章

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(四)

本篇内容对应 “2.5 开发登录、退出功能” 小节 “4.7 优化登陆模块” 小节 2.6 显示登录信息 2.7 账号设置 2.8 检查登录状态 登录功能的流程是什么&#xff1f; UUID为什么不会重复&#xff1f; 因为UUID是基于mac物理地址、时间戳、随机数等信息生成。因此UUID居于极高的唯…

【鸿蒙开发】ArkTS和组件

1. 初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性。 当前&#xff0c;ArkTS在TS的基础上主要扩展了如下能力&#xff1a; 基本语法&#xff1a;ArkTS定义了声明式UI描述、自…

Java事件处理机制

一、介绍 java事件处理是采取“委派事件模型”。当事件发生时&#xff0c;产生事件的对象&#xff0c;会把此“信息”传递给"事件的监听者"处理&#xff0c;这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象&#xff0c;把它称为&q…

2024年AI带来的革命性变革与创新

大家好&#xff01;相信大家对于AI&#xff08;人工智能&#xff09;的发展已经有了一定的了解&#xff0c;但你是否意识到&#xff0c;到了2024年&#xff0c;AI已经变得如此强大和普及&#xff0c;带来了我们从未想象过的便利和创新呢&#xff1f;让我们一起来看看AI在这个时…

基于springboot+vue+Mysql的职称评审管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

4.9日总结

1.MySQL概述 1.数据库基本概念&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储 2.数据库管理系统&#xff1a;操纵和管理数据库的大型软件 3.SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作型数据库统一标准 2.MySQL数据库 关系型数…

数据结构---顺序表实现

目录 1.顺序表 2.动态顺序表的实现 &#xff08;4&#xff09;顺序表初始化 &#xff08;5&#xff09;顺序表销毁 &#xff08;6&#xff09;顺序表的插入 a.尾插 b.头插 &#xff08;7&#xff09;顺序表的删除 a.尾删 b.头删 &#xff08;8&#xff09;指定位置之…

GitHub 仓库 (repository) Watch - Star - Fork - Follow

GitHub 仓库 [repository] Watch - Star - Fork - Follow References 眼睛图标旁边写着 Watch 字样。点击这个按钮就可以 Watch 该仓库&#xff0c;今后该仓库的更新信息会显示在用户的公开活动中。Star 旁边的数字表示给这个仓库添加 Star 的人数。这个数越高&#xff0c;代表…

HuggingFists-如何复用流程

在使用HuggingFists进行业务流程编写时&#xff0c;很可能会发现多个流程间拥有相同的流程片段。按照通常的思考&#xff0c;如果能将这些相同的片段封装为一个可复用的子流程&#xff0c;在各个主流程中引用使用&#xff0c;就可以避免每次重复编写该片段&#xff0c;省去不必…

泰迪智能科技高职人工智能专业人才培养方案

人工智能行业近年来得到了快速发展&#xff0c;全球科技公司都在竞相投入人工智能的研发&#xff0c;从硅谷到北京&#xff0c;都在人工智能上取得了显著的进步。人工智能已经从学术研究转变为影响制造业、医疗保健、交通运输和零售等多个行业的关键因素。我国政策的积极推动下…

Windows下docker-compose部署DolphinScheduler

参照&#xff1a;快速上手 - Docker部署(Docker) - 《Apache DolphinScheduler v3.1.0 使用手册》 - 书栈网 BookStack 下载源文件 地址&#xff1a;https://dolphinscheduler.apache.org/zh-cn/download/3.2.1 解压到指定目录&#xff0c;进入apache-dolphinscheduler-xxx-…

4.2.4 理解路由器数据包过程

1、实验目的 通过本实验可以掌握&#xff1a; 了解IP路由原理了解数据包封装和解封装的概念了解路由器路由和交换过程 2、实验拓扑 观察路由器路由数据包过程的实验拓扑如图4-3所示&#xff0c;设备接口地址信息如表4-2所示。 图4-3 观察路由器路由数据包过程的实验拓扑 本…

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

More than one argument (#0 and left as delegating for Creator) 报错解决

"stack_trace": "c.f.j.d.e.InvalidDefinitionException:Invalid type definition for type `com.xx.xx.x.x.x

软件设计—接口安全设计规范

1.token授权机制 2.https传输加密 3.接口调用防滥用 4.日志审计里监控 5.开发测试环境隔离&#xff0c;脱敏处理 6.数据库运维监控审计 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。

Golang | Leetcode Golang题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; var symbolValues map[byte]int{I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000}func romanToInt(s string) (ans int) {n : len(s)for i : range s {value : symbolValues[s[i]]if i < n-1 && value < symbolValues[s…

SpringBoot整合RabbitMQ-应答模式

一、应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。&#xff08;一般交换机发送消息&#xff0c;RabbitMQ只有在接收到消费者的确认后才…

求三角形面积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double a, b, c, s, area;//赋值&#xff1b;a 3.67;b 5.43;c 6.21;//运算求s&#xff1b…

如何关闭WordPress的自动更新功能

Wordpress为什么自动更新 WordPress自动更新是为了提供更好的安全性和稳定性。 安全性&#xff1a;WordPress是一个广泛使用的内容管理系统&#xff0c;因此成为恶意攻击的目标。WordPress的自动更新功能确保你的网站及时获得最新的安全补丁和修复程序&#xff0c;以保护你的网…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…