Spring Cloud 断路器 - 如何控制打开的 http 状态电路
Posted
技术标签:
【中文标题】Spring Cloud 断路器 - 如何控制打开的 http 状态电路【英文标题】:Spring cloud circuit breaker - how control on what http status circuit gets opened 【发布时间】:2020-08-29 05:50:08 【问题描述】:我正在通过使用带有 hystrix 的 Spring 云断路器抽象 https://spring.io/projects/spring-cloud-circuitbreaker 来实现断路器。 我按照这里的例子https://github.com/spring-cloud-samples/spring-cloud-circuitbreaker-demo/tree/master/spring-cloud-circuitbreaker-demo-hystrix
默认情况下,从端点返回的 HTTP 状态组 5.x.x 和 4.x.x 都是断开电路的信号。 我想将其仅限于服务器错误 5.x.x 并排除 4.x.x 之类的错误请求。在我的情况下,服务的客户应该被告知他的请求是不正确的,不应该得到回退的响应。
我不知道如何实现它。使用 Spring Cloud Circuit Breaker 抽象对我来说很重要,因此使用 @HystrixCommand(ignoreExceptions=...) 不是一种选择。我想以更具声明性的方式进行配置,例如配置。
【问题讨论】:
【参考方案1】:您可以尝试此处提到的堆栈溢出本身的答案之一 -> Configuring hystrix command properties using application.yaml in Spring-Boot application
【讨论】:
谢谢。不幸的是,我的问题没有答案。【参考方案2】:RestTemplate 抛出这些运行时异常-
HttpClientErrorException
- 对于客户端错误,即 HTTP 4XX
HttpServerErrorException
- 用于服务器端错误,即 HTTP 5XX
Hystrix 只关心底层资源的故障。此外,它使用异常来推断底层资源发生故障。
如果您不希望您的电路在 HTTP 4XX 上打开,只需在您的 HttpBinService.java
类中 catch
HttpClientErrorException
。您修改后的方法将是-
public Map get()
try
return rest.getForObject("https://httpbin.org/get", Map.class);
catch(HttpClientErrorException e)
// Log something
// return null or something
【讨论】:
以上是关于Spring Cloud 断路器 - 如何控制打开的 http 状态电路的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud——分布式spring应用如何获得重试、负载均衡和断路器的好处
Spring Cloud Eureka 服务治理学习1 简介与系统搭建
Spring Cloud (10) Hystrix-监控面板
Spring Cloud:Hystrix 监控面板Finchley 版