實作應用程式復原

已完成

.NET 的復原功能會根據 Polly 專案建置,並透過 Microsoft.Extensions 提供。 將單一程式碼新增至您的應用程式,即可新增使用合理預設值的標準復原策略。

將復原功能新增至您的應用程式

若要將復原功能新增至使用微服務架構建置的應用程式,在個別服務之間使用 HTTP 要求,請採取下列步驟:

  1. Microsoft.Extensions.Http.Resilience 套件新增至您的專案。
  2. 將復原處理常式新增至 HttpClient 服務呼叫。
  3. 設定復原策略。

將 NuGet 套件新增至您的專案

執行下列命令以新增復原 NuGet 套件:

dotnet add package Microsoft.Extensions.Http.Resilience

從應用程式專案資料夾中的終端機執行此命令,會將套件參考新增至專案檔。

在應用程式的啟動類別中,然後新增下列 using 陳述式:

using Microsoft.Extensions.Http.Resilience;

新增復原策略

您現在可以將標準復原策略新增至 HttpClient 服務。 .NET 會提供這種結合了一些策略的現成可用設定。

A diagram showing the strategies included in the Standard Resilience Handler. From overall timeout, retry, bulkhead, circuit breaker, and attempt timeout.

要求處理常式會依左至右的順序,逐一查看上述每個策略:

  • 要求逾時策略總計:這會設定要求可能花費的時間總量。 您可以將此視為設定所有其他策略的時間上限。
  • 重試策略:此策略會控制重試次數、輪詢和抖動的選項。 這些選項不能超過在先前策略中設定的總逾時。
  • 斷路器策略:如果失敗比率超過閥值,此策略會開啟線路。
  • 嘗試逾時策略:此策略會針對每個個別要求設定逾時。 如果要求花費的時間超過這個時間,則會擲回例外狀況。

新增下列擴充方法,即可使用所有預設值來新增此標準策略:

.AddStandardResilienceHandler();

例如,如果您已宣告 WebApplication,而且想要將復原策略新增至 HttpClient 服務,請使用下列程式碼:

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

上述程序碼的第一行會將標準復原處理常式新增至 HTTPClient。 這會使用重試和斷路器策略的所有預設設定。

設定復原策略

指定新選項,即可變更任何策略的預設值,例如:

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

此程式碼會將重試策略的預設值變更為具有 10 次重試的數量上限,以使用線性輪詢,並使用 1 秒的基礎延遲。

您選擇的選項必須彼此相容。 例如,如果總時間維持為 30 秒的預設值,則上述重試選項會造成例外狀況。 這是一項錯誤,因為指數輪詢設定會導致完成 10 次重試的總時間為 2046 秒。 這是執行階段例外狀況,而不是編譯時間錯誤。

以下資料表會列出每個策略可用的選項。

要求逾時選項總計 描述
TotalTimeout 要求可能花費的時間總量。 預設值為 30 秒。
OnTimeout 要求逾時時所叫用的回撥函式。預設值為 null。

重試選項 描述
RetryCount 重試次數上限。 預設為 3。
BackoffType 要使用的輪詢類型。 您可以在線性和指數之間選擇。 預設值為指數。
UseJitter 是否要將抖動新增至輪詢。 抖動會將隨機性新增至延遲,以有助於減少負載的尖峰。 預設值為 True。
BaseDelay 重試之間的延遲。 預設值是 2 秒。

斷路器選項 描述
BreakDuration 斷路器的持續時間。 預設值是 5 秒。
FailureRatio 會開啟線路之失敗要求和成功要求的比例。 預設值為 0.1。
SamplingDuration 計算失敗率的持續時間。 預設值為 30 秒。
OnClosed 關閉線路時所叫用的回撥函式。 預設值是 null。
OnHalfOpened 當線路處於半開啟狀態時所叫用的回撥函式。 預設值是 null。
OnOpened 開啟線路時所叫用的回撥函式。 預設值是 null。

嘗試逾時選項 描述
Timeout 要求可能花費的時間量。 預設值是 2 秒。
OnTimeout 要求逾時時所叫用的回撥函式。預設值為 null。

A sequence diagram showing the flow of events in an application using a resiliency strategy.

上述序列圖表顯示每個策略如何在標準復原策略中共同運作。 首先,要求可能花費多長時間的限制因素會由總逾時策略控制。 然後,重試策略必須設定為具有在總逾時內完成的重試次數上限。 如果失敗率超過為其設定的閾值,斷路器策略會開啟線路。 嘗試逾時策略會針對每個個別要求設定逾時。 如果要求花費的時間超過這個時間,則會擲回例外狀況。