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

此重试策略允许在重试之前添加延迟,或者在对失败的服务进行重试调用之前不要等待,因此如果您希望服务中返回错误的问题将立即得到纠正,那么您应该只实现重试逻辑而不任何延误。

考虑从订单服务到客户服务的 HTTP 请求失败的场景。来自客户服务的这个错误可能是永久性的,也可能是暂时的。要处理临时故障,您需要添加逻辑以将请求重试至客户服务至少 2 次,以确保使用重试处理来自客户服务的临时故障。

按照这个重试逻辑,订单服务将向客户服务请求客户名称,如果客户服务返回异常,那么订单服务仍将再向客户服务重试请求 2 次,然后得出结论,现在现在不可能了获得客户服务的成功回复。

要模拟来自客户服务的随机故障,请将以下操作方法添加到客户服务中。这种方法是随机返回数据或错误。为了实现这种随机行为,我们生成一个 1 到 10 之间的数字,如果这个生成的数字是偶数,那么我们将返回一个带有 HTTP 状态代码 500 的服务器错误,如果生成的数字不是偶数,即它是奇数,那么我们将返回根据客户代码使用客户名称的成功响应。

因此,此客户服务操作方法 GetCustomerNameWithTempFailure 将随机运行,即有时会返回错误或在某些情况下会返回成功响应

[HttpGet] [Route("GetCustomerNameWithTempFailure/{customerCode}")] public ActionResult<string> GetCustomerNameWithTempFailure(int customerCode) { try { Random rnd = new Random(); int randomError = rnd.Next(1, 11); // creates a number between 1 and 10 if (randomError % 2 == 0) throw new Exception(); if (_customerNameDict != null && _customerNameDict.ContainsKey(customerCode)) { return _customerNameDict[customerCode]; } return "Customer Not Found"; } catch { //Log Error return StatusCode(StatusCodes.Status500InternalServerError); } }

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

//Remaining Code has been removed for readability private readonly RetryPolicy _retryPolicy; public OrderController(ILogger<OrderController> logger, IHttpClientFactory httpClientFactory) { //Remaining Code has been removed for readability _retryPolicy = Policy .Handle<Exception>() .Retry(2); }

上面的代码示例将创建一个重试策略,如果 HTTP 服务调用失败并且策略处理异常,该策略将重试最多两次。在这里,我们指定了重试策略处理通用异常,因此它将重试所有类型的异常,但您甚至可以为更具体的异常(如 HttpRequestException)配置重试策略,然后它只会重试类型为 HttpRequestException 的异常。

接下来,我们将在订单服务中添加一个新的操作方法,它将利用 RetryPolicy 对象向客户服务的新操作方法 (GetCustomerNameWithTempFailure) 发出 HTTP 请求,该方法随机返回错误。重试策略用于处理来自客户服务的随机故障。

[HttpGet] [Route("GetOrderByCustomerWithRetry/{customerCode}")] public OrderDetails GetOrderByCustomerWithRetry(int customerCode) { _httpClient = _httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri(apiurl); var uri = "/api/Customer/GetCustomerNameWithTempFailure/" + customerCode; var result = _retryPolicy.Execute(() => _httpClient.GetStringAsync(uri).Result); _orderDetails.CustomerName = result; return _orderDetails; }

RetryPolicy 对象使用委托在 Execute() 委托中对客户服务执行所需的 HTTP 调用。如果 HTTP 调用引发由重试策略处理的异常,则 HTTP 调用将重试配置的次数。

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

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

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

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