springcloud之Hystrix初识篇—结合ResTeamplate小述

约定不等于承诺〃 2023-07-18 14:07 135阅读 0赞

PS:观看该篇文章前请先参考上一篇文章

捕获熔断异常:降级方法中可以添加一个异常参数,用于抓取正式调用请求异常的信息。

  1. /**
  2. * fallbackMethod:降级方法【PS:该方法最多只能添加下面这2个参数,或只接收请求方法的参数】
  3. * @param body 请求方法的参数
  4. * @param throwable 异常信息
  5. * @return
  6. */
  7. public String sendFail(String body,Throwable throwable){
  8. logger.info("异常信息:"+throwable);
  9. //备用逻辑
  10. return "restTemplate熔断:"+body;
  11. }

再次请求:

20200328212010585.png

ResTeamplate请求的熔断节点:

根据之前的描述可以分析到消费者调用提供者,提供者服务异常消费者执行熔断操作,所以是提供者异常执行的熔断?

示例1:

提供者:

  1. @RequestMapping("/hystrixRestTemplate/Code")
  2. public String hystrixRestTemplateSend(@RequestBody String body){
  3. System.out.println(body);
  4. String[] str = new String[3];
  5. //数组越界
  6. System.out.println(str[3]);
  7. return port+":"+body;
  8. }

消费者调用:
控制台打印异常:20200328213424245.png请求返回:

20200328213335731.png

总结:提供者服务异常,消费者执行熔断操作

示例2:
前提:提供者正常。
消费者:

  1. @HystrixCommand(fallbackMethod="sendFail")
  2. public String hystrixRestTemplateSend(String body) {
  3. String url = "http://test1/eureka-clinet1/hystrixRestTemplate/Code";
  4. ResponseEntity<String> result = restTemplate.postForEntity(url,body,String.class);
  5. System.out.println("提供者返回结果:"+result);
  6. try {
  7. //线程睡眠时间过长,即使服务提供者返回正常方法也会熔断
  8. Thread.sleep(10000);
  9. }catch (Exception e){
  10. }
  11. return result.getBody();
  12. //return "test";
  13. }

调用请求:
控制台信息:2020032821441829.png
请求返回信息:

20200328214440692.png

原因:控制台打印出一个异常HystrixTimeoutException,因为在提供者返回结果后我们让线程sleep10秒,导致熔断器认为方法超时自动执行了熔断操作,走了降级方法。

总结:RestTemplate调用模式中熔断节点在被@HystrixCommand所修饰的方法,而不是被**调用的**提供者方法。

发表评论

表情:
评论列表 (有 0 条评论,135人围观)

还没有评论,来说两句吧...

相关阅读