1. 程式人生 > >LindDotNetCore~Polly組件對微服務場景的價值

LindDotNetCore~Polly組件對微服務場景的價值

target src cond time 開源 return 組件 ati cep

回到目錄

Polly是一個開源框架,在github上可以找到,被善友大哥收錄,也是.App vNext的一員!

App vNext:https://github.com/App-vNext

GitHub:https://github.com/App-vNext/Polly

NanoFabric是一個開源的微服務架構,也是善友大哥推薦的:https://github.com/geffzhang/NanoFabric

對於NanoFabric來說,它集成了很多.net core開源項目,其中包括了Consul + .NET Core + Polly + Ocelot + Exceptionless + IdentityServer,你是否聞到了某種味道!

Polly給我們帶來了什麽

  1. 對http請求提供重試機制
  2. 對指定異常進行特殊的處理
  3. 提供了多種策略

程序中的使用

封裝一個方法,對外提供一個委托的參數,把需要進行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進行重試!

技術分享圖片

感謝各位的閱讀!

微服務來了,但需要我們關註的點多了!

奮鬥吧!

回到目錄

LindDotNetCore~Polly組件對微服務場景的價值