您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

httpClient 请求接口如何优雅的重试

时间:2020-09-07 10:28:53  来源:  作者:

httpClient 请求接口失败要重试,一般人想到的可能是 做try catch 然后循环请求,但是这种方法写起来很麻烦,而且不优雅。今天就说下另外一种重试的方法,就是引入Microsoft.Extensions.Http.Polly,来进行请求的重试。

Polly 添加策略分为三种:

  1. AddTransientHttpErrorPolicy:是处理Http请求的错误,如HTTP 5XX 的状态码,HTTP 408 的状态码 以及System.Net.Http.HttpRequestException异常

  2. AddPolicyHandler:添加自定义策列

  3. AddPolicyHandlerFromRegistry:从Policy注册表集合里面选择添加

 

1. AddTransientHttpErrorPolicy

//错误重试上面是间隔都是500毫秒
services.AddHttpClient("client1")
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(3, t => TimeSpan.FromMilliseconds(500))));

或者

//定义每次重试的时间间隔
services.AddHttpClient("client1")
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] {
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10),
TimeSpan.FromSeconds(30)
})

2. AddPolicyHandler

  先定义策略,通过AddPolicyHandler方法添加,该方法接收一个泛型的IAsyncPolicy<HttpResponseMessage>。HttpResponseMessage我理解为出站请求上下文

var retryPolicy = Policy.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(response => {
//异常处理的逻辑
return true;
}).WaitAndRetryAsync(3,t => TimeSpan.FromMilliseconds(50));
services.AddHttpClient("client1")
.AddPolicyHandler(retryPolicy);

3. AddPolicyHandlerFromRegistry

  先注册策略表服务,为策略表添加策略,最后通过AddPolicyHandlerFromRegistry方法选用某个或几个策略

//注册,策略表服务
var registry = services.AddPolicyRegistry();//创建策略var retryPolicy = Policy.Handle<HttpRequestException>().OrResult<HttpResponseMessage>(response => {//异常处理的逻辑return true;
}).WaitAndRetryAsync(3, t => TimeSpan.FromMilliseconds(500));registry.Add("registry1", retryPolicy);
services.AddHttpClient("client1")
.AddPolicyHandlerFromRegistry("registry1");

做一个例子看下,创建一个控制台程序

using Microsoft.Extensions.DependencyInjection;
using Polly;
using System;
using System.Net.Http;
namespace ConsoleAppTest
{    class Program
    {        static void Main(string[] args)
        {            Console.WriteLine("Hello World!");
            var service = new ServiceCollection();
            service.AddHttpClient("client1").AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(3, t => TimeSpan.FromMilliseconds(500)));
            IHttpClientFactory httpClientFactory = service.BuildServiceProvider().GetService<IHttpClientFactory>();            var httpClient = httpClientFactory.CreateClient("client1");
            var response = httpClient.GetAsync("http://www.pikoudai.com/");
            Console.ReadKey();        }    }}

这里的http://www.pikoudai.com/ 其实是访问不通的,就是要看看重试是否生效了。

抓包看下程序效果:

httpClient 请求接口如何优雅的重试

 

 

可以看到http://www.pikoudai.com/访问了一次,之后又重试了3次。

Polly除了重试功能外还有断路器、超时、隔板隔离、回退、缓存等功能

重试策略(Retry)

重试策略针对的前置条件是短暂的故障延迟且在短暂的延迟之后能够自我纠正。允许我们做的是能够自动配置重试机制。

断路器(Circuit-breaker)

断路器策略针对的前置条件是当系统繁忙时,快速响应失败总比让用户一直等待更好。保护系统故障免受过载,Polly可以帮其恢复。

超时(Timeout)

超时策略针对的前置条件是超过一定的等待时间,想要得到成功的结果是不可能的,保证调用者不必等待超时。

隔板隔离(Bulkhead Isolation)

隔板隔离针对的前置条件是当进程出现故障时,多个失败一直在主机中对资源(例如线程/ CPU)一直占用。下游系统故障也可能导致上游失败。这两个风险都将造成严重的后果。都说一粒老鼠子屎搅浑一锅粥,而Polly则将受管制的操作限制在固定的资源池中,免其他资源受其影响。

缓存(Cache)

缓存策略针对的前置条件是数据不会很频繁的进行更新,为了避免系统过载,首次加载数据时将响应数据进行缓存,如果缓存中存在则直接从缓存中读取。

回退(Fallback)

操作仍然会失败,也就是说当发生这样的事情时我们打算做什么。也就是说定义失败返回操作。



Tags:httpClient   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
简介本文将展示如何使用“全部接受”SSL支持配置Apache HttpClient 4。目标很简单 - 使用没有有效证书的HTTPS URL。SSLPeerUnverifiedException如果不使用HttpClient配置SS...【详细内容】
2021-04-01  Tags: httpClient  点击:(202)  评论:(0)  加入收藏
HttpClient有三种超时时间设置,在RequestConfig配置类中定义的,分别为connectionRequestTimeout、connectTimeout和socketTimeout,如下图,然后分开讲解。RequestConfig三种超时...【详细内容】
2020-09-10  Tags: httpClient  点击:(1248)  评论:(0)  加入收藏
httpClient 请求接口失败要重试,一般人想到的可能是 做try catch 然后循环请求,但是这种方法写起来很麻烦,而且不优雅。今天就说下另外一种重试的方法,就是引入Microsoft.Extens...【详细内容】
2020-09-07  Tags: httpClient  点击:(331)  评论:(0)  加入收藏
自从HttpClient诞生依赖,它的使用方式一直备受争议,framework版本时代产生过相当多经典的错误使用案例,包括Tcp链接耗尽、DNS更改无感知等问题。有兴趣的同学自行查找研究。在....【详细内容】
2020-08-19  Tags: httpClient  点击:(119)  评论:(0)  加入收藏
【前言】你是否也曾羡慕过有些 phython 大神有着如下的神操作: 他们就轻轻的执行一串代码,就能循环的抓取很多自己想要的数据。其实不用太羡慕他们,因为不光 phython 能实现,我...【详细内容】
2020-08-13  Tags: httpClient  点击:(55)  评论:(0)  加入收藏
一、前言为何要用http连接池那?因为使用它我们可以得到以下好处:因为使用它可以有效降低延迟和系统开销。如果不采用连接池,每当我们发起http请求时,都需要重新发起Tcp三次握手...【详细内容】
2020-06-13  Tags: httpClient  点击:(82)  评论:(0)  加入收藏
▌简易百科推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  K佬食古    Tags:shell   点击:(1)  评论:(0)  加入收藏
步骤1、配置 /etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifc...【详细内容】
2021-12-24  忆梦如风    Tags:网卡   点击:(9)  评论:(0)  加入收藏
1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录find . -name “*.tar” -execmv {}./backup/ ;注解:find &ndash;name 主要用于查找某个文件名字,-exec 、xargs可...【详细内容】
2021-12-17  郭主任    Tags:运维   点击:(18)  评论:(0)  加入收藏
对于经常上网的朋友来说,除了手机购物上网,pc端玩网页游戏还是很多小伙伴首选的,但是有时候明明宽带链接上了,打开浏览器却出现上不了网的现象,下面小编要来跟大家说说电脑有网络...【详细内容】
2021-12-16  小白系统    Tags:网页无法打开   点击:(28)  评论:(0)  加入收藏
在访问像github、gitlab这样的外国网站时,很有可能会出现页面加载不出来或找不到页面的错误。这时候有的朋友就会以为是网络的问题,于是把Wifi断掉连上自己手机的热点,结果却还...【详细内容】
2021-12-15  启施技术IT狼叔    Tags:外网   点击:(14)  评论:(0)  加入收藏
网络地址来源:获取公网IP地址 https://ipip.yy.com/get_ip_info.phphttp://pv.sohu.com/cityjson?ie=utf-8http://www.ip168.com/json.do?view=myipaddress...【详细内容】
2021-12-15  韦廷华12    Tags:外网ip   点击:(14)  评论:(0)  加入收藏
准备好软件IPOP、用ENSP模拟一下华为交换机 启动交换机 <Huawei>sysEnter system view, return user view with Ctrl+Z.[Huawei]sysname FTPClient[FTPClient]interface vla...【详细内容】
2021-12-15  思源Edward    Tags:交换机   点击:(22)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  K佬食古    Tags:netstat   点击:(19)  评论:(0)  加入收藏
什么是滑动窗口?窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。什么是滑动窗...【详细内容】
2021-12-14  DifferentJava    Tags:TCP   点击:(28)  评论:(0)  加入收藏
概述日常管理华为路由设备过程中,难为会忘记设备登录密码,那么该如何重置设备登录密码吗?本期文章将全面向各位小伙伴总结分享。重置华为设备登录密码思路先行 采用console登录...【详细内容】
2021-12-10  onme0    Tags:   点击:(26)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条