NET Core Web API中使用 Polly 构建弹性容错的微服务 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 (2)

为失败的服务提供一些回退或默认行为,即如果服务请求失败,则提供一些回退逻辑,如返回缓存数据或默认数据。这可以解决难以实现插入和更新的查询。

对于调用(客户端)的两个微服务之间的通信,微服务应该对来自特定服务的待处理请求数量实施一些限制,即如果已达到限制,则向同一服务发送额外请求可能毫无意义,而是其他请求应立即失败。

Polly 支持的弹性策略

这是 Polly 在 ASP.NET Core 中支持的弹性策略列表:

重试

ASP.NET Core 中 Polly 的这个策略允许我们在调用服务时配置自动重试。

假设我们有一个订单服务,它调用产品服务来获取所订购商品的详细信息。现在,如果产品服务具有大部分时间有效但有时会失败的随机行为。

现在在这种情况下,如果订单服务收到来自产品服务的失败响应,那么重试请求可能会从产品服务中获取结果。

Polly 帮助我们实现了这个重试策略,限制了从订单服务到产品服务的最大重试次数。

断路器

当服务请求失败计数超过某个预先配置的阈值时,ASP.NET Core 中的 Polly 策略帮助我们打破链路,即在配置的时间段内阻止服务请求的执行。

我们将采用相同的订单服务示例,向产品服务请求商品详细信息。现在假设从订单服务到产品服务的请求即使在重试时也不断失败,那么在这种情况下,我们阻止调用产品服务并提供缓存或默认数据。

这种在服务失败达到配置次数时不调用服务并依靠回退机制的设计称为断路器。当订单服务成功连续调用产品服务时,我们说链路关闭(关闭状态)。但是当订单服务不调用产品服务并依赖回退机制时,在这种情况下,我们说链路是开放的(开放状态)。

超时

ASP.NET Core 中 Polly 的这个策略允许我们在对另一个服务的 HTTP 请求期间实现超时,以确保调用者服务不必等待超时。

当订单服务调用产品服务获取商品详细信息时,如果产品服务的响应延迟(产品服务可能正在等待来自慢速/挂起数据库的响应),那么订单服务会假设产品服务在超时时间之外不太可能成功。因此,超出超时期限的订单服务假定产品服务存在问题,它将停止等待产品服务的响应并采取适当的措施。

隔板隔离

ASP.NET Core 中的 Polly 策略允许我们限制应用程序的任何部分可以消耗的资源总量,这样应用程序的失败部分就不会导致级联故障也导致应用程序的其他部分瘫痪。

当订单服务调用产品服务以获取商品详细信息时,如果由于某些原因导致产品服务不可用,那么请求将开始备份订单服务,并可能导致订单服务性能下降甚至导致订单服务崩溃。

Bulkhead Isolation 有助于隔离部分应用程序并控制内存、CPU、套接字、线程等的使用,以便如果您的应用程序的某一部分工作不顺利,此策略将防止该部分影响或停止整个应用程序。

它还允许您指定可以执行的并发请求数量以及可以排队执行的请求数量,以便一旦并发和队列插槽已满,新请求将立即失败。

缓存

ASP.NET Core 中 Polly 中的此策略允许在第一次检索响应时自动将响应存储在缓存中(在内存或分布式缓存中),以便可以从缓存中返回对同一资源的后续请求。

当订单服务为商品详情调用产品服务时,订单服务可以将商品详情存储在缓存中,以便可以从缓存中获取相同产品的下一个请求,而不是再次调用产品服务对于相同的产品。

回退

ASP.NET Core 中 Polly 中的此策略允许我们提供替代路径,即可以返回的值或可以采取的操作,以防被调用的服务关闭,即返回错误或发生超时。

当订单服务调用产品服务以获取商品详细信息时,如果对产品服务的请求失败,则配置的回退将允许订单服务决定在产品服务失败的情况下如何处理。订单服务可以返回默认数据或根据失败采取一些行动。

无论您重试多少次,都必然会发生故障,因此您需要计划在发生故障时应该做什么。回退通常与重试、断路器等其他策略结合使用。

封装策略( Policy Wrap)

ASP.NET Core 中 Polly 中的此策略允许灵活组合 Polly 中支持的任何策略,从而能够组合弹性策略。会有不同类型的故障需要不同的策略,我们可以根据故障类型应用策略组合。

简而言之,当您想同时使用多个策略时,请使用 Policy Wrap。

现在让我们看看如何在 ASP.NET Core 中实现 Polly 支持的这些策略。

在 ASP.NET Core 中实现 Polly 的策略 演示的总体方法

以下是此演示所采用的完整方法的详细信息

我们将为客户微服务创建第一个 ASP.NET Core Web API 项目,该项目包含一个 Get 操作方法以返回给定客户代码的客户名称

我们将为订单微服务添加第二个 ASP.NET Core Web API 项目,该项目包含一个 Get 操作方法来返回客户的订单详细信息。

除了订单详细信息,此订单服务还返回客户名称。要获取此客户名称订单服务,请调用客户服务 get 方法。

我们已经实现了这个从订单服务到客户服务的 HTTP 调用来获取客户名称。

我们将在向客户服务发出 HTTP 请求的同时,在订单服务中实施和测试各种 Polly 策略。

我们将模拟客户服务的故障,并了解如何通过使用 ASP.NET Core 中的 Polly 策略让我们的订单服务容错。

让我们首先创建所需的 ASP.NET Core Web API 类型的项目,该项目将用于演示如何在 ASP.NET Core 中使用 Polly 的策略

创建 ASP.NET Core Web API 项目

为了演示 Polly 策略在 ASP.NET Core 中的实现,我们将创建几个 ASP.NET Core Web API 项目并按照下面指定的详细信息配置它们。

创建客户服务

创建一个名为 ProCodeGuide.Polly.Customer 的 ASP.NET Core Web API 类型的新项目

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxzzp.html