LindDotNetCore~Polly元件對微服務場景的價值
阿新 • • 發佈:2018-12-30
Polly是一個開源框架,在github上可以找到,被善友大哥收錄,也是.App vNext的一員!
對於NanoFabric來說,它集成了很多.net core開源專案,其中包括了Consul + .NET Core + Polly + Ocelot + Exceptionless + IdentityServer,你是否聞到了某種味道!
Polly給我們帶來了什麼
- 對http請求提供重試機制
- 對指定異常進行特殊的處理
- 提供了多種策略
程式中的使用
封裝一個方法,對外提供一個委託的引數,把需要進行polly的程式碼段輸入進來即可,對於http,資料庫,網路通訊等非常必要,因為這些場景可能存在不穩定的因素!polly正好可以幫我們非常
友好的解決它,下面的程式碼主要實現了對所有異常的跟蹤,然後每1秒重新執行一次,可以重試5次!
/// <summary> /// polly重試機制 /// </summary> private static HttpResponseMessage retryTwoTimesPolicy(Func<HttpResponseMessage> action) { var policy = Policy .Handle<Exception>() .WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(1, retryAttempt)), (ex, timer, c, i) => { logger.Logger_Info($"執行失敗! 重試次數 {c}"); logger.Logger_Info($"異常來自 {ex.GetType().Name}"); });return policy.Execute(action); }
我們之前的httpHelper請求物件,也可以引入polly機制,全域性進行控制!
/// <summary> /// GET請求 /// </summary> /// <param name="requestUri">服務地址</param> /// <param name="nv">引數鍵值</param> /// <returns></returns> public static HttpResponseMessage Get( string requestUri, NameValueCollection nv) { try { return retryTwoTimesPolicy(() => { var result = httpClient.GetAsync(GeneratorUri(requestUri, nv)).Result; UnGZip(result); return result; }); } catch (Exception ex) { throw ex; } }
自己開兩個api程序,一個是對外提供服務,別一個作為主伺服器,被其它進行訪問,當它掛了之後,其實進行可以通過polly進行重試!
感謝各位的閱讀!
微服務來了,但需要我們關注的點多了!
奮鬥吧!