.NetCore下使用Polly結合IHttpClientFactory實現聚合服務


在使用微服務的過程中經常會遇到這樣的情況,就目前我遇到的問題做下分析

情況一:

這里服務對於前后端分離情況來說,多使用查詢服務,前端直接獲取不同服務的數據展示,如果出現其中的服務失敗,對業務數據無影響,只對前端數據展示出現影響

情況二

這列聚合服務主要出現在操作上,各個服務存在相互調用,相互協作完成某一項操作的情況

接下來我在API中添加了聚合服務模塊,利用 IHttpClientFactory處理了情況的服務根目錄及授權問題

  services.AddHttpContextAccessor();
            services.AddHttpClient("userservicesapi",client=> {
                client.BaseAddress = new Uri("http://localhost:40001");
               // client.DefaultRequestHeaders.Add("", "");
            });

這里可以動態配置管理你的一些注冊服務

在聚合服務中我們根據我們自己業務情況 可以采用 Polly+  消息隊列處理

對於除程序代碼外的外部原因造成的異常情況,可以使用Polly 來處理,比如:網絡情況 等原因 可以發起重試  服務內部使用消息隊列保持操作最終一致

var client= httpClientFactory.CreateClient("userservicesapi");

根據配置的名稱創建相關的請求,這里涉及到在ServiceA中調用ServiceB的時候,ServiceB需要Accesstoken

這里需要獲取下AccessToken來處理

public async Task<string> testAddData(School school)
        {
           var client= httpClientFactory.CreateClient("userservicesapi");
            string token = await httpContextAccessor.HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken);
            client.SetBearerToken(token);
            //訪問例子

            var res=  await client.PostAsJsonAsync("addData", school);
            res.EnsureSuccessStatusCode();
          return  await res.Content.ReadAsStringAsync();


        }

這就OK了,在結合Polly之前封裝的處理下,這里接受下返回值

  await _polly.PollyResultRetryAsync<Exception, string>(async () => { return await _httpClient.testAddData(new School { }); }, 3);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM