實作應用程式復原
.NET 的復原功能會根據 Polly 專案建置,並透過 Microsoft.Extensions
提供。 將單一程式碼新增至您的應用程式,即可新增使用合理預設值的標準復原策略。
將復原功能新增至您的應用程式
若要將復原功能新增至使用微服務架構建置的應用程式,在個別服務之間使用 HTTP 要求,請採取下列步驟:
- 將
Microsoft.Extensions.Http.Resilience
套件新增至您的專案。 - 將復原處理常式新增至 HttpClient 服務呼叫。
- 設定復原策略。
將 NuGet 套件新增至您的專案
執行下列命令以新增復原 NuGet 套件:
dotnet add package Microsoft.Extensions.Http.Resilience
從應用程式專案資料夾中的終端機執行此命令,會將套件參考新增至專案檔。
在應用程式的啟動類別中,然後新增下列 using 陳述式:
using Microsoft.Extensions.Http.Resilience;
新增復原策略
您現在可以將標準復原策略新增至 HttpClient 服務。 .NET 會提供這種結合了一些策略的現成可用設定。
要求處理常式會依左至右的順序,逐一查看上述每個策略:
- 要求逾時策略總計:這會設定要求可能花費的時間總量。 您可以將此視為設定所有其他策略的時間上限。
- 重試策略:此策略會控制重試次數、輪詢和抖動的選項。 這些選項不能超過在先前策略中設定的總逾時。
- 斷路器策略:如果失敗比率超過閥值,此策略會開啟線路。
- 嘗試逾時策略:此策略會針對每個個別要求設定逾時。 如果要求花費的時間超過這個時間,則會擲回例外狀況。
新增下列擴充方法,即可使用所有預設值來新增此標準策略:
.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。 |
上述序列圖表顯示每個策略如何在標準復原策略中共同運作。 首先,要求可能花費多長時間的限制因素會由總逾時策略控制。 然後,重試策略必須設定為具有在總逾時內完成的重試次數上限。 如果失敗率超過為其設定的閾值,斷路器策略會開啟線路。 嘗試逾時策略會針對每個個別要求設定逾時。 如果要求花費的時間超過這個時間,則會擲回例外狀況。