.NET Core 3.0深入源码理解HttpClientFactory之实战
写在前面
前面两篇文章透过源码角度,理解了HttpClientFactory的内部实现,当我们在项目中使用时,总会涉及以下几个问题:
HttpClient超时处理以及重试机制
HttpClient熔断器模式的实现
HttpClient日志记录与追踪链
接下来我们将从使用角度对上述问题作出说明。
详细介绍
以下代码参考了MSDN,因为代码里展示的GitHub接口确实可以调通,省的我再写一个接口出来测试了。
HttpClient超时处理和重试机制
在此之前,我们需要了解一下Polly这个库,Polly是一款基于.NET的弹性及瞬间错误处理库, 它允许开发人员以顺畅及线程安全的方式执行重试(Retry),断路器(Circuit),超时(Timeout),隔板隔离(Bulkhead Isolation)及后背策略(Fallback)。
以下代码描述了在.NET Core 3.0中如何使用超时机制。
那么如何将其注册到对应的HttpClient实例呢,有很多种方式:
通过AddPolicyHandler注册
声明Policy注册对象,并将超时策略对象添加进去
调用方式
Polly重试也很简单
这里的重试设置是在第一次调用失败后,还会有三次机会继续重试,每个请求的时间间隔是指数级延迟。
重试功能除了可以使用Polly实现外,还可以使用DelegatingHandler,DelegatingHandler继承自HttpMessageHandler,用于”处理请求、响应回复“,本质上就是一组HttpMessageHandler的有序组合,可以视为是一个“双向管道”。
此处主要展示DelegatingHandler的使用方式,在实际使用中,仍然建议使用Polly重试。
注册方式如下:
HttpClient熔断器模式的实现
如果非常了解Polly库的使用,那么熔断器模式的实现也会非常简单,
这里的熔断器设置规则是在连续10次请求失败后,会暂停30秒。这个地方可以写个扩展方法注册到IServiceCollection中。
HttpClient日志记录与追踪链
日志记录这块与追踪链,我们一般会通过request.Header实现,而在微服务中,十分关注相关调用方的信息及其获取,一般的做法是通过增加请求Id的方式来确定请求及其相关日志信息。
实现思路是增加一个DelegatingHandler实例,用以记录相关的日志以及请求链路
我在查找相关资料的时候,发现有个老外使用CorrelationId组件实现,作为一种实现方式,我决定要展示一下,供大家选择:
参考链接:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.0
https://rehansaeed.com/optimally-configuring-asp-net-core-httpclientfactory/
.NET Core 3.0深入源码理解HttpClientFactory之实战相关推荐
- .NET Core 3.0之深入源码理解HttpClientFactory(二)
写在前面 上一篇文章讨论了通过在ConfigureServices中调用services.AddHttpClient()方法,并基于此进一步探讨了DefaultHttpClientFactory是如何 ...
- .NET Core 3.0之深入源码理解HttpClientFactory(一)
写在前面 创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维 ...
- 从路由原理出发,深入阅读理解react-router 4.0的源码
react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面.路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新.通过前 ...
- Pushlet 2.0.3 源码分析
转载地址:http://blog.csdn.net/yxw246/article/details/2418255 Pushlet 2.0.3 源码分析 ----服务器端 1 总体架构 Pushlet从 ...
- 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码
http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android ...
- faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)
转载自:faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data) - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.n ...
- faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解
转载自:faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解 - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/u ...
- TLD(Tracking-Learning-Detection)学习与源码理解之(六)
TLD(Tracking-Learning-Detection)学习与源码理解之(六) zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和这些 ...
- TLD(Tracking-Learning-Detection)学习与源码理解之(五)
TLD(Tracking-Learning-Detection)学习与源码理解之(五) zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和 ...
最新文章
- elasticsearch使用jetty进行简单的权限控制
- MVC基于角色权限控制--用户管理
- 【SQL】在SQL Server中多表关联查询问题
- 变量four赋值数字python_跟老齐学Python之赋值,简单也不简单
- java switch和if_对比Java中if和switch选择结构二者的区别
- 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
- 腾讯人均每月薪酬成本超8万元,员工总数首次超10万
- 动态规划问题之背包模型(18题)
- hdu1962Corporative Network带权回路
- python列表赋值 连续整数_列表切片赋值,小技巧(Python基础)。
- WCF开发框架形成之旅--个人图片信息的上传保存
- 汇编语言视频教程 | 免费下载
- vi: 未找到命令_vi技巧和窍门:十个很棒的命令一定会给您的朋友留下深刻的印象...
- Dagger2 学习
- 修改Android模拟器的IMEI号
- 2017我都干了啥?
- 这三个移动互联网案例让你大胆追梦
- 她是淘宝牛年第一锦鲤,却只选择清空购物车
- 树莓派开机自动运行shell脚本——记录开机时间
- sublime text 打开总是弹框报错Unable to download XXX. Please view the console for more details.解决办法
热门文章
- php post 获取xml,php 获取post的xml数据并解析示例
- java 连接kafka_设置多个kafka连接接收器
- 什么是Google On.Here,以及如何设置?
- Ubuntu Core 给物联网提供更多安全支持
- 【跃迁之路】【599天】程序员高效学习方法论探索系列(实验阶段356-2018.09.27)...
- Eclipse Add generated serial version ID报错解决方案
- 为VMware虚拟主机添加新磁盘
- 第10章-管理Hadoop集群-hadoop 安全模式相关知识点
- [原创]互联网金融App测试介绍
- 自已做的第一个autoconf程序(不断完善中)