如何使用 netflix hystrix 获取断路器状态的状态?
Posted
技术标签:
【中文标题】如何使用 netflix hystrix 获取断路器状态的状态?【英文标题】:How to get status for circuit breaker status with netflix hystrix? 【发布时间】:2021-01-17 23:20:55 【问题描述】:这是我的 AppService 类,我需要在其中添加逻辑以获取断路器的状态(如果它是打开或关闭的),但我找不到方法。另外,我使用了ignoreExceptions,但似乎有麻烦。刚接触编码和此功能,无法获得适当的答案。我不知道如何使用 isCircuitBreakerOpen()。
@Service
public class AppService
private static final Logger LOG = LoggerFactory.getLogger(AppService.class);
private final RestTemplate restTemplate;
public AppService(RestTemplate rest)
this.restTemplate = rest;
@HystrixCommand(fallbackMethod = "reliable", commandProperties=
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "100"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "10000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10")
)
public ResponseEntity<String> answerList() throws Exception
return callingDownStreamService404();
@HystrixCommand(fallbackMethod = "reliable", commandProperties=
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "100"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "10000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10")
)
public ResponseEntity<String> answerList503() throws Exception
return callingDownStreamService503();
private ResponseEntity<String> callingDownStreamService404() throws Exception
URI uri = URI.create("http://localhost:8090/recommended/404");
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
HttpEntity<Object> entity = new HttpEntity<Object>(headers);
ResponseEntity<String> out = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
System.out.println("Application code : " + out.getStatusCode());
return out;
private ResponseEntity<String> callingDownStreamService503() throws Exception
URI uri = URI.create("http://localhost:8090/recommended/503");
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
HttpEntity<Object> entity = new HttpEntity<Object>(headers);
ResponseEntity<String> out = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
System.out.println("Application code : " + out.getStatusCode());
if (out.getStatusCode().toString().startsWith("5"))
throw new HystrixBadRequestException("bad request messageg");
return out;
@HystrixCommand(commandKey = "MyHystrixCommand",fallbackMethod = "myHystrixFallback", threadPoolKey = "ThreadPoolKey",commandProperties=
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "100"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "10000"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10"),
ignoreExceptions = HttpServerErrorException.class, HystrixBadRequestException.class, HttpClientErrorException.class)
public ResponseEntity<String> getServiceCallResponse(String serviceUrl, HttpEntity<?> entity)
serviceUrl = "http://localhost:8090/recommended/500";
ResponseEntity<String> resp = null;
try
System.out.println("Calling -----" + serviceUrl);
resp = restTemplate.exchange(serviceUrl, HttpMethod.POST, entity, String.class);
catch(RestClientException e)
System.out.println("Calling -----" + serviceUrl + "Exception is this" + e.getRootCause());
handleExceptionForHystrix("getServiceCallResponse", e);
return resp;
private void handleExceptionForHystrix(String function, Exception e)
if (e instanceof HttpStatusCodeException)
HttpStatus httpStatusCode = ((HttpStatusCodeException)e).getStatusCode();
if(httpStatusCode.equals(HttpStatus.BAD_REQUEST) || httpStatusCode.equals(HttpStatus.INTERNAL_SERVER_ERROR))
throw new HystrixBadRequestException("Hystrix Bad Request Exception Occurred" + httpStatusCode, e);
throw new RuntimeException(function, e);
throw new RuntimeException(function, e);
public ResponseEntity<String> myHystrixFallback(String serviceUrl, HttpEntity<?> entity, Throwable hystrixCommandExp)
return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
@Recover()
public ResponseEntity<String> reliable()
return new ResponseEntity<String>(
"The downstream application is unavailable and the circuit is open", HttpStatus.OK);
这是我放置端点的主要类。我也在使用 AppStore,它是下游应用程序,并且在那里配置了相同的端点。
@EnableHystrixDashboard
@EnableCircuitBreaker
@RestController
@SpringBootApplication
public class DavinciCircuitbreakerApplication
@Autowired
private AppService appService;
@Bean
public RestTemplate rest(RestTemplateBuilder builder)
return builder.build();
@RequestMapping("/to-answer/404")
public ResponseEntity<String> toAnswer()
ResponseEntity<String> response = null;
try
response = appService.answerList();
catch(Exception e)
System.out.println("excpetion"+ e.getMessage());
return new ResponseEntity<String>("failure", HttpStatus.valueOf(500));
return response;
@RequestMapping("/to-answer/503")
public ResponseEntity<String> toAnswer503()
ResponseEntity<String> response = null;
try
response = appService.answerList503();
catch(Exception e)
System.out.println("excpetion"+ e.getMessage());
return new ResponseEntity<String>("failure", HttpStatus.valueOf(503));
return response;
@RequestMapping("/to-answer/500")
public ResponseEntity<String> toAnswer500()
ResponseEntity<String> response = null;
try
response = appService.getServiceCallResponse(null, response);
catch(Exception e)
System.out.println("excpetion"+ e.getMessage());
return new ResponseEntity<String>("Internal Server Error", HttpStatus.valueOf(500));
return response;
public static void main(String[] args)
SpringApplication.run(DavinciCircuitbreakerApplication.class, args);
【问题讨论】:
【参考方案1】:您可以使用HystrixCircuitBreaker.Factory.getInstance(...)
获取HystrixCommand 的实例。详情请参阅link。
您还可以在此 HystrixCommand
实例上调用 isCircuitBreakerOpen()
。
【讨论】:
以上是关于如何使用 netflix hystrix 获取断路器状态的状态?的主要内容,如果未能解决你的问题,请参考以下文章
springcloud 断路器-Spring Cloud Netflix Hystrix
企业级 SpringCloud 教程 断路器(Hystrix)
企业级 SpringCloud 教程 断路器(Hystrix)
SpringCloud学习系列之三----- 断路器Hystrix和断路器监控Dashboar