在上面的屏幕上选择操作 /api/Order/GetOrderByCustomerWithCircuitBreaker/(customerCode) 它应该展开,然后单击 Try it out 按钮。之后,您应该会看到以下屏幕,您需要在其中输入客户代码的值并单击执行按钮。
如上所示,点击执行后,我们得到了一个成功的响应(即使客户服务永久失败),客户名称与 catch 块中配置的回退值一致。
但是订单服务中的 GetOrderByCustomerWithCircuitBreaker 操作正在对客户服务进行 HTTP 调用,该调用返回错误,因此让我们检查日志,看看在客户服务中对 GetCustomerNameWithPermFailure 进行 HTTP 调用期间发生了什么
![Polly 与断路器策略](/Users/zouding/文档/blog/文章/如何使用polly/
)
正如我们在上面日志的屏幕截图中看到的那样,当我们从订单服务调用客户服务时,它返回了一个错误,订单服务使用了来自 catch 块的客户名称的替代值。此外,我们可以从日志中看到,当我们在电路打开时尝试致电客户服务时,Polly 没有致电客户服务,而是为该 Policy.CircuitBreaker.BrokenCircuitException 提供了一个异常 – 电路现在已打开并且不允许通话。
Bulkhead策略要在 ASP.NET Core 中使用 Polly 实现舱壁隔离逻辑,我们需要声明 BulkheadPolicy 类型的对象并定义策略,如下面的代码所示
private static BulkheadPolicy _bulkheadPolicy; public OrderController(ILogger<OrderController> logger, IHttpClientFactory httpClientFactory) { _bulkheadPolicy = Policy.Bulkhead(3, 6); }上面的代码示例将创建一个Bulkhead策略,该策略定义在调用服务时限制调用服务的资源数量,即通过隔板的最多 3 个并行执行和最多 6 个可能正在排队的请求数(等待获取执行槽)随时。
接下来,我们将在 order 服务中添加一个新的 action 方法,它将使用 Bulkhead Isolation Policy 对象向客户服务的 action 方法 (GetCustomerName) 发出 HTTP 请求。隔板隔离策略用于限制用于调用客户服务的资源,即在任何给定时间将有 3 个并行请求执行,另外 6 个请求可以在队列中。这样如果客户服务的响应被延迟或阻塞,那么我们不会在订单服务上使用太多资源,也会导致订单服务发生级联故障。
[HttpGet] [Route("GetOrderByCustomerWithBulkHead/{customerCode}")] public OrderDetails GetOrderByCustomerWithBulkHead(int customerCode) { _httpClient = _httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri(apiurl); var uri = "/api/Customer/GetCustomerName/" + customerCode; var result = _bulkheadPolicy.Execute(() => _httpClient.GetStringAsync(uri).Result); _orderDetails.CustomerName = result; return _orderDetails; }隔板隔离策略对象使用委托在 Execute() 委托中执行所需的对客户服务的 HTTP 调用。
隔板隔离策略适用于一个错误不应导致整艘船瘫痪的策略!即当服务开始失败时,它会建立大量请求,这些请求都在并行缓慢失败,这可能导致订单服务中资源(CPU/线程/内存)的使用,从而降低能力或导致服务失败订购服务。
对于缓存策略,我建议不要实现基于异常缓存数据的逻辑,而是根据数据设计缓存逻辑,即静态/动态数据、常用数据等。您可以阅读我关于在 ASP 中缓存的详细文章。 NET Core在这里
到目前为止,我们已经了解了 ASP.NET Core 中 Polly 的重要策略。此外,可以在 ASP.NET Core 中为单个服务调用组合 Polly 的多个策略,例如
fallback.Wrap(waitAndRetry).Wrap(breaker).Execute(action); fallback.Execute(() => waitAndRetry.Execute(() =>breaker.Execute(action))); 概括我们在 ASP.NET Core Web API 中了解了 Polly 的各种策略。我们在本文中看到的只是冰山一角,即我们刚刚开始并查看了策略的基本实施。
您甚至可以尝试组合多个策略,称为策略包装,您可以将重试策略与回退策略或断路器策略相结合。
我们看到了 ASP.NET Core 中 Polly 的实现以及策略的同步方法,所有策略也存在类似的异步方法。