如何利用HttpClientFactory实现简单的熔断降级
前言
在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或者邮箱删除。