手机版

如何利用HttpClientFactory实现简单的熔断降级

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

前言

在2.1之后,有不少新东西,其中HttpClientFactory算是一个HttpClientFactory。涉及的东西也不算少,三四种客户,请求中间件,与波莉的结合,生命周期等。

钢头工作靴的组件升级到2.1后,不少示例代码已经使用HttpClientFactory了。当然这是个题外话。

这里主要讲的是与波莉的结合,来完成简单的熔断降级。在这之前,还是先看看关于HttpClientFactory最简单的用法。

HttpClientFactory的简单使用

用个简单的控制台程序来演示

这里就只是获取一下状态码,没有获取实际的内容。

静态异步taskstring BasicUsage(){ var service collection=new service collection();serviceCollection .AddHttpClient();var服务=serviceCollection .BuildServiceProvider();var clientFactory=服务GetServiceIHttpClientFactory();var client=clientFactory .创建客户端();var request=new Httprequestmessage(HttpMETHoD .Get,' https://www。github。com’);定义变量响应=等待客户端。发送异步(请求)。配置等待(假);回复回复状态代码。ToString();}其实主要的操作就是AddHttpClient,然后通过HttpClientFactory创建一个客户端对象,有了客户端对象,下面的操作应该就不用多说了。

然后在主要的方法调用

控制台WriteLine($'BasicUsage,StatusCode={BasicUsage().GetAwaiter().GetResult()} ');用法感觉并没有太多的差别。下面来看看与波莉的结合。

HttpClientFactory和波莉的结合

波莉的维基网页面已经有了这两者结合使用的文档了。

https://github。com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory

其实现在对于我们来说,要想对超文本传送协议(超文本传输协议的缩写)请求使用波莉的一些特性已经非常的简单了。

我们在使用的时候要添加微软。扩展名。Http。波莉的框架包。

先来看看使用波莉的三种扩展方法

扩展方法说明AddTransientHttpErrorPolicy主要是处理超文本传送协议(超文本传输协议的缩写)请求的错误,如HTTP 5XX的状态码,HTTP 408的状态码以及系统. Net。Http.HttpRequestException异常添加策略处理程序自定义,和传统定义波莉的方式保持一致AddPolicyHandlerFromRegistry从政策集合(也是自定义的)里面选择自己想要的。后面的操作,是用的AddPolicyHandler。

由于我们要实现熔断降级,所以,我们必不可少的要用到电路断路器政策和后退政策,同时为了方便演示,再加个时间政策。

由于涉及到多个政策,所以我们必须要确定他们的执行顺序!

波莉的维基网页面有个示例,还配了一幅很详细的时序图。

一句话来说就是最先起作用的,还是最后添加的那个。

下面就新建一个应用程序接口项目,用来演示一下。

修改配置服务方法,具体如下

public void ConfigureServices(IServiceCollection services){ var fallbackResponse=new HttpResponseMessage();后退响应.内容=新字符串内容("回退");后退响应.状态代码=系统净。httpstatuscode。太多请求;服务AddHttpClient('cb ',x={ x . BaseAddress=new Uri(' http://localhost :8000 ');x.DefaultRequestHeaders.Add('用户代理,' HttpClientFactory-Test ');})//回退添加策略处理程序(策略http响应消息.HandleException().FallbackAsync(fallbackResponse,async b={ Logger .日志警告($"此处回退{ b .异常。消息}”;}))//断路器添加策略处理程序(策略http响应消息.HandleException().电路断路器同步(2,时间跨度从秒(4),(例如,ts)={ Logger .日志警告($ '在此中断{ts .总数毫秒} ');},()={ Logger .日志警告($"在此重置");}))//超时。添加策略处理程序(策略暂停异步预响应消息(1));服务AddMvc().SetCompatibilityVersion(兼容性版本.版本_ 2 _ 1);}然后是在控制器去使用。

[路由(' API/[控制器]')][API控制器]公共类值控制器:控制器基{ private static int my count=0;私有只读IHttpClientFactory _ client工厂;公共值控制器(IHttpClientFactory客户端工厂){这._ client factory=client factory }//GET API/values/time out[HttpGet(' time out ')]public actionresultienumerablesting time out(){ if(my count 3)//模拟超时{系统。线程。线程。睡眠(3000);}我的帐户返回新字符串[] { 'value1 ',' value 2 ' };}//GET API/values[HttpGet(')]public async tasksstring GetSync(){ var client=_ client factory .创建客户端(“CB”);var request=new Httprequestmessage(HttpMETHoD .Get ',/API/值/超时');定义变量响应=等待客户端发送异步(请求);var内容=等待响应内容。ReadAsStringAsync();返回内容;}}效果如下

前面几次请求,会因为超时或熔断,从而我们得到的结果是后退。

过了四秒钟后再请求,由于没有超时,正常拿到了结果,所以熔断器会被重置。

来看看日志

比较清晰的看到了所有的操作。

总结

总体来说,HttpClientFactory还是很不错的。尤其是它可以直接使用波莉相关的特性。

部分示例代码:HttpClientFactoryDemo

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

版权声明:如何利用HttpClientFactory实现简单的熔断降级是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。