ToB企服应用市场:ToB评测及商务社交产业平台

标题: Welcome to YARP - 7.目标健康检查 [打印本页]

作者: 卖不甜枣    时间: 2023-12-20 17:58
标题: Welcome to YARP - 7.目标健康检查
目录

Welcome to YARP - 1.认识YARP并搭建反向代理服务
Welcome to YARP - 2.配置功能
Welcome to YARP - 3.负载均衡
Welcome to YARP - 4.限流
Welcome to YARP - 5.身份验证和授权
Welcome to YARP - 6.压缩、缓存
Welcome to YARP - 7.目标健康检查
Welcome to YARP - 8.分布式跟踪
介绍

在我们日常系统维护中,系统节点由于各种原因,如过载、资源泄漏、硬件故障等,偶尔会经历短暂的问题或完全失效。理想情况下,我们希望能够以主动的方式完全防止这些不幸的事件发生,但设计和构建这样一个理想系统通常成本过高。然而,还有一种更为经济的、反应性的方法, 旨在最大限度地减少故障对客户端请求造成的负面影响。
这种方式可以帮助系统在出现节点问题时更灵活地应对,以提供更可靠的服务。
主动健康检查

YARP 可以通过向指定的运行状况终结点发送定期探测请求并分析响应来主动监视目标运行状况。该分析由为集群指定的主动运行状况检查策略执行,并计算新的目标运行状况状态。最后,策略会根据 HTTP 响应代码(2xx 被视为正常)将每个目标标记为正常或不正常,并重新生成群集的正常目标集合。
YARP 提供了一系列配置选项,可以通过配置文件或代码,去控制集群中节点的主动健康检查,同时也提供了一种为每个目标定义专用健康终结点的方式,以满足不同需求的定制化。
配置文件示例
  1. "Clusters": {
  2.       "cluster1": {
  3.         "HealthCheck": {
  4.           "Active": {
  5.             "Enabled": "true",
  6.             "Interval": "00:00:10",
  7.             "Timeout": "00:00:10",
  8.             "Policy": "ConsecutiveFailures",
  9.             "Path": "/api/health"
  10.           }
  11.         },
  12.         "Metadata": {
  13.           "ConsecutiveFailuresHealthPolicy.Threshold": "3"
  14.         },
  15.         "Destinations": {
  16.           "cluster1/destination1": {
  17.             "Address": "https://localhost:10000/"
  18.           },
  19.           "cluster1/destination2": {
  20.             "Address": "http://localhost:10010/",
  21.             "Health": "http://localhost:10020/"
  22.           }
  23.         }
  24.       }
复制代码
代码示例
  1. var clusters = new[]
  2. {
  3.     new ClusterConfig()
  4.     {
  5.         ClusterId = "cluster1",
  6.         HealthCheck = new HealthCheckConfig
  7.         {
  8.             Active = new ActiveHealthCheckConfig
  9.             {
  10.                 Enabled = true,
  11.                 Interval = TimeSpan.FromSeconds(10),
  12.                 Timeout = TimeSpan.FromSeconds(10),
  13.                 Policy = HealthCheckConstants.ActivePolicy.ConsecutiveFailures,
  14.                 Path = "/api/health"
  15.             }
  16.         },
  17.         Metadata = new Dictionary<string, string> { { ConsecutiveFailuresHealthPolicyOptions.ThresholdMetadataName, "5" } },
  18.         Destinations =
  19.         {
  20.             { "destination1", new DestinationConfig() { Address = "https://localhost:10000" } },
  21.             { "destination2", new DestinationConfig() { Address = "https://localhost:10010", Health = "https://localhost:10010" } }
  22.         }
  23.     }
  24. };
复制代码
配置

所有主动健康检查设置中,除了一个例外,其余的都在集群级别的 Cluster/HealthCheck/Active 部分指定。唯一的例外是一个可选的 Destination/Health 元素,用于指定单独的主动健康检查端点。实际的健康探测 URI 的构建方式是 Destination/Address(或设置 Destination/Health) + Cluster/HealthCheck/Active/Path。
还可以通过 Yarp.ReverseProxy.Configuration 命名空间中的相应类型在代码中定义主动运行状况检查设置, 这与配置文件中的约定是一致的。
Cluster/HealthCheck/Active 部分和 ActiveHealthCheckConfig
Destination 部分和目标配置。
内置策略

目前有一个内置的主动健康检查策略 - ConsecutiveFailuresHealthPolicy。该策略会计算连续的健康探测失败次数,并在达到给定的阈值后将目标标记为不健康。在第一次成功的响应之后,目标将被标记为健康,并将计数器重置。策略参数在集群的元数据中设置,如下所示:
设计 (被动健康检查)

YARP 中的被动健康检查的主要组件和工作流程如下:
  1.                         (对代理请求的响应)
  2.                   |
  3.       PassiveHealthCheckMiddleware (被动健康检查中间件)
  4.                   |
  5.                   V
  6.       IPassiveHealthCheckPolicy (被动健康检查策略)
  7.                   |
  8.               (评估新的被动健康状态)
  9.                   |
  10.     IDestinationHealthUpdater (目标健康状态更新器) --(异步更新被动状态)--> DestinationState.Health.Passive
  11.                   |
  12.                   V
  13.       (安排重新激活) --(设置状态为未知)--> DestinationState.Health.Passive
复制代码
扩展

被动运行状况检查子系统中有一个主要的扩展点,即 IPassiveHealthCheckPolicy
IPassiveHealthCheckPolicy

IPassiveHealthCheckPolicy 分析目标如何响应代理客户端请求,评估其新的被动运行状况状态,最后调用 IDestinationHealthUpdater.SetPassiveAsync 以创建异步任务,实际更新被动运行状况状态并重新生成正常目标集合。
以下是一个简单示例,演示了自定义的 IPassiveHealthCheckPolicy,在代理请求的第一次不成功的响应时将目标标记为不健康。
  1. public class FirstUnsuccessfulResponseHealthPolicy : IPassiveHealthCheckPolicy
  2. {
  3.     private static readonly TimeSpan _defaultReactivationPeriod = TimeSpan.FromSeconds(60);
  4.     private readonly IDestinationHealthUpdater _healthUpdater;
  5.     public FirstUnsuccessfulResponseHealthPolicy(IDestinationHealthUpdater healthUpdater)
  6.     {
  7.         _healthUpdater = healthUpdater;
  8.     }
  9.     public string Name => "FirstUnsuccessfulResponse";
  10.     public void RequestProxied(HttpContext context, ClusterState cluster, DestinationState destination)
  11.     {
  12.         var error = context.Features.Get<IForwarderErrorFeature>();
  13.         if (error is not null)
  14.         {
  15.             var reactivationPeriod = cluster.Model.Config.HealthCheck?.Passive?.ReactivationPeriod ?? _defaultReactivationPeriod;
  16.             _healthUpdater.SetPassive(cluster, destination, DestinationHealth.Unhealthy, reactivationPeriod);
  17.         }
  18.     }
  19. }
复制代码
可用的目标集合

目标健康状态用于确定哪些目标适合接收代理请求。每个集群都在 ClusterDestinationState 类型的 AvailableDestinations 属性上维护自己的可用目标列表。当任何目标的健康状态发生变化时,该列表将被重新构建。IClusterDestinationsUpdater 控制这个过程,并调用在集群上配置的 IAvailableDestinationsPolicy 来实际选择从所有集群目标中可用的目标。提供了以下内置策略,如果需要,还可以实现自定义策略。
注意:无论给定集群上是否启用任何健康检查,都将始终调用配置在集群上的可用目标策略。已禁用健康检查的健康状态设置为未知。
配置

配置文件示例
  1. "Clusters": {
  2.       "cluster1": {
  3.         "AvailableDestinationsPolicy": "HealthyOrPanic",
  4.         "HealthCheck": {
  5.           "Passive": {
  6.             "Enabled": "true"
  7.           }
  8.         },
  9.         "Destinations": {
  10.           "cluster1/destination1": {
  11.             "Address": "https://localhost:10000/"
  12.           },
  13.           "cluster1/destination2": {
  14.             "Address": "http://localhost:10010/"
  15.           }
  16.         }
  17.       }
复制代码
代码示例
  1. var clusters = new[]
  2. {
  3.     new ClusterConfig()
  4.     {
  5.         ClusterId = "cluster1",
  6.         HealthCheck = new HealthCheckConfig
  7.         {
  8.             AvailableDestinationsPolicy = HealthCheckConstants.AvailableDestinations.HealthyOrPanic,
  9.             Passive = new PassiveHealthCheckConfig
  10.             {
  11.                 Enabled = true
  12.             }
  13.         },
  14.         Destinations =
  15.         {
  16.             { "destination1", new DestinationConfig() { Address = "https://localhost:10000" } },
  17.             { "destination2", new DestinationConfig() { Address = "https://localhost:10010" } }
  18.         }
  19.     }
  20. };
复制代码
总结

本章我们介绍了 YARP 的 目标健康检查功能。它有助于提高系统的可用性、稳定性,并帮助及时发现和应对服务故障。 本章暂时没有准备代码示例,有空了再补上吧。
下篇文章我们继续介绍 YARP 的分布式跟踪功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4