LindDotNetCore~Polly組件對微服務場(chang)景(jing)的價值
Polly是一(yi)個開源框架,在github上可以找到(dao),被善友大(da)哥(ge)收錄,也是.App vNext的一(yi)員!
App vNext:
GitHub:
NanoFabric是一個開源的微(wei)服務架構,也是善(shan)友大(da)哥推薦的:
對于NanoFabric來說,它集成了很多.net core開源項目,其中包括了Consul + .NET Core + Polly + Ocelot + Exceptionless + IdentityServer,你(ni)是否聞到了某種味(wei)道!
Polly給我們帶來了什么
- 對http請求提供重試機制
- 對指定異常進行特殊的處理
- 提供了多種策略
程序中的使用
封裝一(yi)個方法,對外提供一(yi)個委托的(de)參數,把需要(yao)進行polly的(de)代碼段輸入進來即(ji)可(ke),對于http,數據庫,網(wang)絡通(tong)訊等非(fei)常(chang)必要(yao),因(yin)為(wei)這些場景可(ke)能存在不穩(wen)定的(de)因(yin)素!polly正好可(ke)以幫我們非(fei)常(chang)
友好的解決它,下面的代(dai)碼(ma)主(zhu)要實(shi)現了(le)對所有(you)異常的跟(gen)蹤,然后每1秒重新執行一次(ci),可以重試5次(ci)!
/// <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($"異常來自(zi) {ex.GetType().Name}"); }); return policy.Execute(action); }
我們之(zhi)前的httpHelper請求對象,也可以引(yin)入(ru)polly機制(zhi),全局進(jin)行控(kong)制(zhi)!
/// <summary> /// GET請(qing)求(qiu) /// </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進程(cheng),一個是對外提供服務(wu),別一個作(zuo)為主服務(wu)器,被(bei)其它進行(xing)訪問,當它掛了(le)之后(hou),其實進行(xing)可以(yi)通(tong)過polly進行(xing)重試!

感謝各位的閱讀!
微服(fu)務(wu)來了(le)(le),但需要我們關(guan)注的點多了(le)(le)!
奮斗吧!