实现应用程序复原能力

已完成

.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。

尝试超时选项 说明
超时 请求可能花费的时间。 默认值为 2 秒。
OnTimeout 请求超时时调用的回调函数。默认为 null。

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

上面的序列图显示了每个策略如何在标准复原能力策略中协同工作。 首先,请求可以花费多长时间的限制因素取决于总超时策略。 然后,必须将重试策略设置为在总超时时间内完成的最大重试次数。 如果失败率超过为断路器策略设置的阈值,则该策略将断开电路。 尝试超时策略为每个请求设置超时。 如果请求花费的时间超过此时间,则会引发异常。