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

所以这个客户服务操作方法 GetCustomerNameWithPermFailure 将抛出异常并且在所有情况下总是返回错误

[HttpGet] [Route("GetCustomerNameWithPermFailure/{customerCode}")] public ActionResult<string> GetCustomerNameWithPermFailure(int customerCode) { try { throw new Exception("Database Not Available"); } catch { //Log Error return StatusCode(StatusCodes.Status500InternalServerError); } }

要在 ASP.NET Core 中使用 Polly 实现回退逻辑,我们需要声明 FallbackPolicy 类型的对象并定义策略,如下面的代码所示

private readonly FallbackPolicy<string> _fallbackPolicy; public OrderController(ILogger<OrderController> logger, IHttpClientFactory httpClientFactory) { _fallbackPolicy = Policy<string> .Handle<Exception>() .Fallback("Customer Name Not Available - Please retry later"); }

上面的代码示例将创建一个回退策略,如果 HTTP 服务调用因策略处理的异常而失败,则会将响应值替换为“客户名称不可用 - 请稍后重试”。数据类型为字符串 (TResult) 的回退策略被用作客户服务操作,返回字符串(客户名称)作为响应。

您甚至可以将回退策略用于返回无效的调用。在 void 的情况下,如果策略处理错误(而不是替代返回值),它指定要运行的备用操作.Fallback(() => DoSomeFallbackAction())

同样在上面的代码中,我们已经指定回退策略处理通用异常,因此它将为所有类型的异常提供替代值,但您甚至可以为更具体的异常(如 HttpRequestException)配置回退策略,然后它将仅为HttpRequestException 类型的异常。

接下来,我们将在订单服务中添加一个新的操作方法,该方法将使用 FallbackPolicy 对象向返回错误的客户服务的新操作方法 (GetCustomerNameWithPermFailure) 发出 HTTP 请求。回退策略用于通过在发生故障时为响应提供回退或替代值来处理客户服务失败。

[HttpGet] [Route("GetOrderByCustomerWithFallback/{customerCode}")] public OrderDetails GetOrderByCustomerWithFallback(int customerCode) { _httpClient = _httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri(apiurl); var uri = "/api/Customer/GetCustomerNameWithPermFailure/" + customerCode; var result = _fallbackPolicy.Execute(() => _httpClient.GetStringAsync(uri).Result);![](https://img2020.cnblogs.com/blog/191302/202110/191302-20211025232132690-134030604.png) _orderDetails.CustomerName = result; return _orderDetails; }

FallbackPolicy 对象使用委托在 Execute() 委托中对客户服务执行所需的 HTTP 调用。如果 HTTP 调用引发了由回退策略处理的异常,则在失败时提供替代值。

让我们在 ASP.NET Core 中运行和测试 Polly 的回退策略。在 Visual Studio 中运行解决方案后,两个项目(即客户和订单)都应该启动。两个服务都开始转到订购服务后,您应该会看到以下来自 swagger (OpenAPI) 的屏幕

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

在上面的屏幕上选择操作 /api/Order/GetOrderByCustomerWithFallback/(customerCode) 它应该展开,然后单击 Try it out 按钮。之后,您应该会看到以下屏幕,您需要在其中输入客户代码的值并单击执行按钮。

如上所示,点击执行后,我们得到了一个成功的响应(即使客户服务永久失败),客户名称根据为客户代码配置的后备替代值。

但是订单服务中的 GetOrderByCustomerWithFallback 操作正在对客户服务进行 HTTP 调用,该调用返回错误,因此让我们检查日志,看看在客户服务中对 GetCustomerNameWithPermFailure 的 HTTP 调用期间发生了什么。

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

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

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