实现应用程序复原能力

已完成

.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 提供了一些策略组合的现用配置。

显示标准复原处理程序中包含的策略的关系图。从总体超时、重试、大容量、断路器和尝试超时。

请求处理程序按从左到右的顺序遍历以下每个策略:

  • 请求超时策略总数:这将设置请求可能需要的总时间。 可以将这视为设置所有其他策略的上限。
  • 重试策略:此策略控制重试次数、退避和抖动的选项。 这些选项不能超过上一策略中设置的总超时值。
  • 断路器策略:如果故障比率超过阈值,此策略将打开线路。
  • 尝试超时策略:此策略为每个单个请求设置超时。 如果请求花费的时间超过此时间,则会引发异常。

可以通过添加此扩展方法添加此标准策略,并添加所有默认值:

.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 次重试的总时间为 2,046 秒。 这是运行时异常,而不是编译时错误。

下表列出了可用于每个策略的选项。

请求超时选项总数 DESCRIPTION
TotalTimeout 请求可能需要的总时间。 默认值为 30 秒。
OnTimeout 请求超时时调用的回调函数。默认值为 null。

重试选项 DESCRIPTION
RetryCount 最大重试次数。 默认值是3。
BackoffType 要使用的退避类型。 可以在线性和指数之间进行选择。 默认值为指数。
UseJitter 是否向退避添加抖动。 抖动会增加延迟的随机性,以帮助减少负载峰值。 默认值为 true。
BaseDelay 重试之间的延迟。 默认值为 2 秒。

断路器选项 DESCRIPTION
BreakDuration 断路器的持续时间。 默认值为 5 秒。
FailureRatio 失败的请求与将打开线路的成功请求的比率。 默认值为 0.1。
SamplingDuration 计算失败比率的持续时间。 默认值为 30 秒。
OnClosed 关闭线路时调用的回调函数。 默认值为 NULL。
OnHalfOpened 当线路处于半打开状态时调用的回调函数。 默认值为 NULL。
OnOpened 在打开线路时调用的回调函数。 默认值为 NULL。

尝试超时选项 DESCRIPTION
超时 请求可能需要的时间。 默认值为 2 秒。
OnTimeout 请求超时时调用的回调函数。默认值为 null。

显示应用程序中使用复原策略的事件流的序列图。

序列图显示了每个策略如何在标准复原策略中协同工作。 首先,总超时策略控制请求可能需要多长时间的限制因素。 然后,必须将重试策略设置为在总超时时间内完成的最大重试次数。 如果故障比率超出为其设置的阈值,断路器策略将打开线路。 尝试超时策略为每个单个请求设置超时。 如果请求花费的时间超过此时间,则会引发异常。