写在前面

前面两篇文章透过源码角度,理解了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之实战相关推荐

  1. .NET Core 3.0之深入源码理解HttpClientFactory(二)

    写在前面 上一篇文章讨论了通过在ConfigureServices中调用services.AddHttpClient()方法,并基于此进一步探讨了DefaultHttpClientFactory是如何 ...

  2. .NET Core 3.0之深入源码理解HttpClientFactory(一)

    写在前面 创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维 ...

  3. 从路由原理出发,深入阅读理解react-router 4.0的源码

      react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面.路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新.通过前 ...

  4. Pushlet 2.0.3 源码分析

    转载地址:http://blog.csdn.net/yxw246/article/details/2418255 Pushlet 2.0.3 源码分析 ----服务器端 1 总体架构 Pushlet从 ...

  5. 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码

    http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android ...

  6. faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data)

    转载自:faster rcnn源码理解(二)之AnchorTargetLayer(网络中的rpn_data) - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.n ...

  7. faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解

    转载自:faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解 - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/u ...

  8. TLD(Tracking-Learning-Detection)学习与源码理解之(六)

    TLD(Tracking-Learning-Detection)学习与源码理解之(六) zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和这些 ...

  9. TLD(Tracking-Learning-Detection)学习与源码理解之(五)

    TLD(Tracking-Learning-Detection)学习与源码理解之(五)   zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和 ...

最新文章

  1. elasticsearch使用jetty进行简单的权限控制
  2. MVC基于角色权限控制--用户管理
  3. 【SQL】在SQL Server中多表关联查询问题
  4. 变量four赋值数字python_跟老齐学Python之赋值,简单也不简单
  5. java switch和if_对比Java中if和switch选择结构二者的区别
  6. 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
  7. 腾讯人均每月薪酬成本超8万元,员工总数首次超10万
  8. 动态规划问题之背包模型(18题)
  9. hdu1962Corporative Network带权回路
  10. python列表赋值 连续整数_列表切片赋值,小技巧(Python基础)。
  11. WCF开发框架形成之旅--个人图片信息的上传保存
  12. 汇编语言视频教程 | 免费下载
  13. vi: 未找到命令_vi技巧和窍门:十个很棒的命令一定会给您的朋友留下深刻的印象...
  14. Dagger2 学习
  15. 修改Android模拟器的IMEI号
  16. 2017我都干了啥?
  17. 这三个移动互联网案例让你大胆追梦
  18. 她是淘宝牛年第一锦鲤,却只选择清空购物车
  19. 树莓派开机自动运行shell脚本——记录开机时间
  20. sublime text 打开总是弹框报错Unable to download XXX. Please view the console for more details.解决办法

热门文章

  1. php post 获取xml,php 获取post的xml数据并解析示例
  2. java 连接kafka_设置多个kafka连接接收器
  3. 什么是Google On.Here,以及如何设置?
  4. Ubuntu Core 给物联网提供更多安全支持
  5. 【跃迁之路】【599天】程序员高效学习方法论探索系列(实验阶段356-2018.09.27)...
  6. Eclipse Add generated serial version ID报错解决方案
  7. 为VMware虚拟主机添加新磁盘
  8. 第10章-管理Hadoop集群-hadoop 安全模式相关知识点
  9. [原创]互联网金融App测试介绍
  10. 自已做的第一个autoconf程序(不断完善中)