【微服务】04-Polly实现失败重试和限流熔断

文章目录

    • 1. Polly实现失败重试
      • 1.1 Polly组件包
      • 1.2 Polly的能力
      • 1.3 Polly使用步骤
      • 1.4 适合失败重试的场景
      • 1.5 最佳实践
    • 2.Polly实现熔断限流避免雪崩效应
      • 2.1 策略类型
      • 2.2 组合策略

1. Polly实现失败重试

1.1 Polly组件包

  • Polly
  • Polly.Extensions.Http
  • Microsoft.Extensions.Http.Polly

1.2 Polly的能力

  • 失败重试
  • 服务熔断 ⇒ 部分服务不可用时,可以快速响应熔断,避免持续请求不可用服务而导致整个应用程序宕掉
  • 超时处理 ⇒ 请求响应超过设置的时间,可按照预定的操作进行处理
  • 舱壁隔离 ⇒ 为服务定义最大流量和队列,避免服务应请求量过大而被压崩
  • 缓存策略 ⇒ 类似AOP为应用嵌入缓存机制,当缓存命中时可以快速响应缓存
  • 失败降级 ⇒ 当服务不可用时可以响应一个更友好的结果而非报错
  • 组合策略 ⇒ 将上面的策略组合在一起

1.3 Polly使用步骤

  • 定义要处理的异常类型或返回值
  • 定义要处理动作(重试、熔断、降级响应等)
  • 使用定义的策略来执行代码

1.4 适合失败重试的场景

  • 服务“失败”是暂时的,可自愈的
  • 服务是幂等的,重复调用不会有副作用

场景举例

  • 网络闪断
  • 部分服务节点异常

1.5 最佳实践

  • 设置失败重试次数
  • 设置带有步长策略的失败等待间隔 ⇒ 防止持续不断的重试,出现类似DDOS的情况
  • 设置降级响应 ⇒ 重试达到上限时,需要为服务设置降级响应
  • 设置断路器
 public void ConfigureServices(IServiceCollection services){// HttpClientFactory Polly内置的重试策略services.AddGrpcClient<OrderGrpc.OrderGrpcClient>(options =>{options.Address = new Uri("https://localhost:5001");}).ConfigurePrimaryHttpMessageHandler(provider =>{var handler = new SocketsHttpHandler();handler.SslOptions.RemoteCertificateValidationCallback = (a, b, c, d) => true; //允许无效、或自签名证书return handler;}).AddTransientHttpErrorPolicy(p => p.WaitAndRetryForeverAsync(i => TimeSpan.FromSeconds(i * 3)));// 设置响应500或408时重试,不指定次数直到成功// 定义个性化策略var reg = services.AddPolicyRegistry();reg.Add("retryforever", Policy.HandleResult<HttpResponseMessage>(message =>{return message.StatusCode == System.Net.HttpStatusCode.Created;}).RetryForeverAsync());// 应用策略services.AddHttpClient("orderclient").AddPolicyHandlerFromRegistry("retryforever");services.AddHttpClient("orderclientv2").AddPolicyHandlerFromRegistry((registry, message) =>{return message.Method == HttpMethod.Get ? registry.Get<IAsyncPolicy<HttpResponseMessage>>("retryforever") : Policy.NoOpAsync<HttpResponseMessage>();});}

2.Polly实现熔断限流避免雪崩效应

2.1 策略类型

  • 被动策略(异常处理,结果处理)
  • 主动策略(超时处理,断路器,舱壁隔离,缓存)

被动策略:当服务响应出现一些异常或结果时进行处理
主动策略:根据策略实例去判断是否超时或异常等情况,这是由策略进行主动触发的一些操作

2.2 组合策略

  • 降级响应
  • 失败重试
  • 断路器
  • 舱壁隔离
    在这里插入图片描述

限流、熔断策略都是有状态的,这指的是在策略中设置的并发数,队列数,还有熔断的采样时间和吞吐量,错误数这些计数器的状态,这些是由一个策略的实例去承载。在对不同服务进行不同的策略定义,单独计算它的熔断限流数值时,就需要单独定义不同的策略的实例,去完成不同服务之间的定义的隔离

// startup
public void ConfigureServices(IServiceCollection services)
{// 熔断策略services.AddHttpClient("orderclientv3").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().CircuitBreakerAsync(handledEventsAllowedBeforeBreaking: 10,// 报错10次后熔断服务durationOfBreak: TimeSpan.FromSeconds(10), // 熔断时间onBreak: (r, t) => { }, // 发生熔断后触发事件onReset: () => { }, // 熔断恢复后触发事件onHalfOpen: () => { }// 当熔断恢复之前进行验证服务是否可用的请求));
}//更高级设置
services.AddHttpClient("orderclientv3").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().AdvancedCircuitBreakerAsync(// 请求失败比例占80%时熔断failureThreshold: 0.8,// 计算请求失败比例的时间范围,当前为10秒内80%请求失败samplingDuration: TimeSpan.FromSeconds(10),// 最小吞吐量,在达到100个请求的时候再去计算上去失败比例,用于请求量小的时候不进行熔断minimumThroughput: 100,durationOfBreak: TimeSpan.FromSeconds(20),// 熔断时长onBreak: (r, t) => { }, // 发生熔断后触发事件onReset: () => { },// 熔断恢复后触发事件onHalfOpen: () => { }));// 当熔断恢复之前进行验证服务是否可用的请求// 服务降级
var message = new HttpResponseMessage()
{Content = new StringContent("{}")
};
var fallback = Policy<HttpResponseMessage>.Handle<BrokenCircuitException>().FallbackAsync(message);// 重试机制,重试3次,每次等1秒钟
var retry = Policy<HttpResponseMessage>.Handle<Exception>().WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(1));// 组合策略
//执行顺序breakPolicy -> retry -> fallback
var fallbackBreak = Policy.WrapAsync(fallback, retry, breakPolicy);
services.AddHttpClient("httpv3").AddPolicyHandler(fallbackBreak);// 限流
var bulk = Policy.BulkheadAsync<HttpResponseMessage>(// 最大请求数maxParallelization: 30, // 最大队列数,指的是达到最大请求数后又多少个请求可以被放到队列中;// 若不设置这个值,达到最大请求数后程序会抛出异常,如果队列数超出最大队列数,也会抛出异常maxQueuingActions: 20, // 请求被限流时执行的处理方式onBulkheadRejectedAsync: contxt => Task.CompletedTask);// 限流出现异常时,响应降级
var message2 = new HttpResponseMessage()
{Content = new StringContent("{}")
};
var fallback2 = Policy<HttpResponseMessage>.Handle<BulkheadRejectedException>().FallbackAsync(message);
// 组合策略
var fallbackbulk = Policy.WrapAsync(fallback2, bulk);
services.AddHttpClient("httpv4").AddPolicyHandler(fallbackbulk);

当服务发生熔断时,策略会抛出CircuitBreakerException异常,也就是熔断异常

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

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

相关文章

ppt转pdf免费的工具哪个好用?ppt在线转pdf的方法分享

在工作和学习中&#xff0c;将PPT文件转换为PDF格式具有重要意义。PDF文件的大小较小&#xff0c;适用于各种平台和设备&#xff0c;保持了原始文件的内容和格式&#xff0c;具有广泛的可读性和兼容性。那么小编就来为大家详细地说一说“ppt转pdf免费的工具哪个好用?ppt在线转…

HTML的label标签有什么用?

当你想要将表单元素&#xff08;如输入框、复选框、单选按钮等&#xff09;与其描述文本关联起来&#xff0c;以便提供更好的用户界面和可访问性时&#xff0c;就可以使用HTML中的<label>标签。<label>标签用于为表单元素提供标签或标识&#xff0c;使用户能够更清…

【微服务】05-网关与BFF(Backend For Frontend)

文章目录 1.打造网关1.1 简介1.2 连接模式1.3 打造网关 2.身份认证与授权2.1 身份认证方案2.1.1 JWT是什么2.1.2 启用JwtBearer身份认证2.1.3 配置身份认证2.1.4 JWT注意事项 1.打造网关 1.1 简介 BFF(Backend For Frontend)负责认证授权&#xff0c;服务聚合&#xff0c;目标…

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…

Java IDEA Web 项目 1、创建

环境&#xff1a; IEDA 版本&#xff1a;2023.2 JDK&#xff1a;1.8 Tomcat&#xff1a;apache-tomcat-9.0.58 maven&#xff1a;尚未研究 自行完成 IDEA、JDK、Tomcat等安装配置。 创建项目&#xff1a; IDEA -> New Project 选择 Jakarta EE Template&#xff1a;选择…

上传WSL项目到gitlab

上传WSL项目到gitlab 设置ssh将SSH公钥添加到Gitlab 将WSL上的代码上传到gitlab确保在WSL环境中安装了git下面是上传代码到GitLab的具体步骤&#xff1a; 可能遇到的各种错误 设置ssh Gitlab添加SSH KEY 什么是SSH ? SSH 是一种网络协议&#xff0c;具备协议级别的认证及会话…

【Hello Network】DNS协议 NAT技术 代理服务器

本篇博客简介&#xff1a;介绍DNS协议 NAT技术和代理服务器 网络各协议补充 DNSDNS背景DNS介绍DNS总结域名简介 NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术缺陷NAT和代理服务器 网络协议总结应用层传输层网络层数据链路层 DNS DNS是一整套从域名映射到IP的系统 DNS背景 为…

情人节特别篇:用c++弹奏音乐“海阔天空”与“孤勇者”

W...Y的主页 &#x1f495; 代码库分享 &#x1f60a; 目录 孤勇者 海阔天空 今天是2023年8月22日七夕情人节&#xff0c;但是对我来说就是再普通不过的日子。我相信有很多人期待这一天的到来&#xff0c;和自己的对象出去享受快乐时光。但是我只有一个人独孤的度过短暂的时…

vscode c++编译时报错

文章目录 1. 报错内容&#xff1a;GDB Failed with message;2. 报错内容&#xff1a;Unable to start debugging. 1. 报错内容&#xff1a;GDB Failed with message; 例如上图报错&#xff0c;一般就是编译器选择错误&#xff0c;有两种方法解决&#xff1a; 打开 tasks.json …

【随笔】如何使用阿里云的OSS保存基础的服务器环境

使用阿里云OSS创建一个存储仓库&#xff1a;bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行&#xff0c;是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中&#xff0c;需要使用解压工具…

Django(2)-编写你的第一个 Django 应用

本教程的目的是创建一个网络投票应用程序。 它将由两部分组成&#xff1a; 一个让人们查看和投票的公共站点。 一个让你能添加、修改和删除投票的管理站点。 创建应用 $ python manage.py startapp polls每一个应用是一个python包&#xff0c;一个项目可以包含多个应用。 …

深入Golang之Mutex

深入Golang之Mutex 基本使用方法 可以限制临界区只能同时由一个线程持有。 直接在流程结构中使用 lock、unlock嵌入到结构中&#xff0c;然后通过结构体的 mutex 属性 调用 lock、unlock嵌入到结构体中&#xff0c;但是是直接在需要锁定的资源方法中使用&#xff0c;让外界无…

WPF基础入门-Class2-样式

WPF基础入门 Class2&#xff1a;样式 1、内联样式&#xff1a;优先度最高 <Grid><StackPanel><!--内联样式优先度高--><Button Background"Red" Height"10" Width"100"FontSize"20"Content"SB">…

nginx 中新增url请求参数

1、nginx中新增配置&#xff1a; set $args "$args&参数名参数值"; 示例&#xff1a; set $args "$args&demo1cn_yaojin&demo2123123&myip$remote_addr"; location / {add_header Access-Control-Allow-Origin *;add_header Access-Contro…

计算机竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

ssm+vue农家乐信息平台源码和论文

ssmvue农家乐信息平台源码和论文066 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1、研究现状 国外&#xff0c;农家乐都被作为潜在的发展农村经济&#xff0c;增加农民收入的重要手段&#xff0c;让农户广…

【Qt专栏】实现单例程序,禁止程序多开的几种方式

目录 一&#xff0c;简要介绍 二&#xff0c;实现示例&#xff08;Windows&#xff09; 1.使用系统级别的互斥机制 2.通过共享内存&#xff08;进程间通信-IPC&#xff09; 3.使用命名互斥锁&#xff08;不推荐&#xff09; 4.使用文件锁 5.通过网络端口检测 一&#xf…

LLM提示词工程和提示词工程师Prompting and prompt engineering

你输入模型的文本被称为提示&#xff0c;生成文本的行为被称为推断&#xff0c;输出文本被称为完成。用于提示的文本或可用的内存的全部量被称为上下文窗口。尽管这里的示例显示模型表现良好&#xff0c;但你经常会遇到模型在第一次尝试时无法产生你想要的结果的情况。你可能需…

文件服务器实现方式汇总

hello&#xff0c;伙伴们&#xff0c;大家好&#xff0c;今天这一期shigen来给大家推荐几款可以一键实现文件浏览器的工具&#xff0c;让你轻松的实现文件服务器和内网的文件传输、预览。 基于node 本次推荐的是http-server&#xff0c; 它的githuab地址是&#xff1a;http-s…

Spring 与【MyBatis 】和【 pageHelper分页插件 】整合

目录 一、Spring整合MyBatis 1. 导入pom依赖 2. 利用mybatis逆向工程生成模型层层代码 3. 编写配置文件 4. 注解式开发 5. 编写Junit测试类 二、AOP整合pageHelper分页插件 1. 创建一个AOP切面 2. Around("execution(* *..*xxx.*xxx(..))") 表达式解析 3. 编…