<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          HttpClientFactory 結(jié)合 Polly 輕松實現(xiàn)重試機制

          共 3046字,需瀏覽 7分鐘

           ·

          2021-01-21 07:50


          HttpClientFactory 結(jié)合 Polly 輕松實現(xiàn)重試機制

          Intro

          我們的服務(wù)里有一個 API 會去調(diào)用第三方的接口,設(shè)置了超時時間,最近偶爾會發(fā)生超時的情況,微軟在提供?HttpClientFactory?的同時,也提供了一個基于?Polly?的一個擴(kuò)展,我們可以借助它輕松地實現(xiàn)重試,熔斷等行為。

          Sample

          使用 Polly 擴(kuò)展需要引用 nuget 包 :Microsoft.Extensions.Http.Polly

          使用示例:

          services.AddHttpClient(ServiceConst.IterableHttpClientName,?x?=>
          {
          ????x.Timeout?=?new?TimeSpan(0,?0,?3);
          })
          ????.AddTransientHttpErrorPolicy(builder?=>
          ????{
          ????????return?builder.Or()
          ????????????.Or()
          ????????????.Or()
          ????????????.OrResult(res?=>?res.StatusCode?==?HttpStatusCode.TooManyRequests?||?(int)res.StatusCode?>=?500)
          ????????????.RetryAsync(5)
          ????????????;
          ????})

          通過?AddTransientHttpErrorPolicy?擴(kuò)展方法來注冊一個 Polly 的 policy,具體可以通過?policyBuilder?委托來定制自己要處理的情況和 policy 行為,支持方式有很多可以簡單的指定重試,也可以指定?WaitANdRetryAsync?等待一段時間后重試,可以重試一次也可以一直重試下去,非常的靈活,可以根據(jù)自己的業(yè)務(wù)場景進(jìn)行定制化配置,這里的示例直接是用了簡單的重試機制

          單元測試

          下面提供了一個測試重試的單元測試,也可以作為使用示例的一個參考:


          [Fact]
          public?async?Task?TaskCanceledException()
          {
          ????var?ticks?=?new?ConcurrentBag<long>();
          ????var?retryLimit?=?5;

          ????var?services?=?new?ServiceCollection();
          ????services.AddHttpClient("test",?x?=>
          ????????{
          ????????????x.Timeout?=?TimeSpan.FromSeconds(1);
          ????????})
          ????????.AddTransientHttpErrorPolicy(builder?=>
          ????????{
          ????????????return?builder.Or()
          ????????????????????.Or()
          ????????????????????.Or()
          ????????????????????.OrResult(res?=>
          ????????????????????????res.StatusCode?==?HttpStatusCode.TooManyRequests?||?(int)res.StatusCode?>=?500)
          ????????????????????.RetryAsync(retryLimit)
          ????????????????;
          ????????})
          ????????.AddHttpMessageHandler(()?=>?new?MockHttpHandler(request?=>
          ????????{
          ????????????ticks.Add(DateTime.UtcNow.Ticks);
          ????????????throw?new?TaskCanceledException();
          ????????}))

          ????????;
          ????await?using?var?provider?=?services.BuildServiceProvider();
          ????try
          ????{
          ????????using?var?response?=?await?provider.GetRequiredService()
          ????????????.CreateClient("test")
          ????????????.GetAsync("api/test");
          ????}
          ????catch?(Exception?e)
          ????{
          ????????Assert.True(e?is?OperationCanceledException);
          ????}
          ????Assert.Equal(retryLimit?+?1,?ticks.Count);
          }

          private?class?MockHttpHandler?:?DelegatingHandler
          {
          ????private?readonly?Func?_getResponseFunc;

          ????public?MockHttpHandler(Func?getResponseFunc)
          ????{
          ????????_getResponseFunc?=?getResponseFunc;
          ????}

          ????protected?override?Task?SendAsync(HttpRequestMessage?request,?CancellationToken?cancellationToken)
          ????{
          ????????return?Task.FromResult(_getResponseFunc(request));
          ????}
          }

          More

          除了?AddTransientHttpErrorPolicy?之外,Polly 擴(kuò)展還支持?AddPolicyHandler/AddPolicyHandlerFromRegistry?擴(kuò)展方法,有興趣的可以自己探索一下哈~~

          Reference

          • https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly
          • https://github.com/dotnet/aspnetcore/tree/master/src/HttpClientFactory/Polly/src



          往期精彩回顧




          【推薦】.NET Core開發(fā)實戰(zhàn)視頻課程?★★★

          .NET Core實戰(zhàn)項目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個接口多種實現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

          10個小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點建議

          C#異步編程看這篇就夠了


          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草青娱乐在线视频 | 天天躁夜夜躁av 无码视频中文字幕 | 天天拍天天干 | 久久久精品麻豆 | 俄美女与黑人一级A片 |