五分钟带你玩转springcloudNetflix(五)熔断与降级

举报
小鲍侃java 发表于 2021/09/10 00:24:37 2021/09/10
【摘要】 总结来说就是如果下游服务挂了,而上游有多个服务去调用他,那么上游的服务就全部挂掉了,这样会造成雪崩效应,从而使服务大面积的失效。 在连接下游服务超时会降级走我们定义的方法。 在一段时间内失败的比例大于配置,那么熔断器会打开,即使正确调用还是会走降级方法。 Hystrix代码 需要在application中开启Hystrix ...

总结来说就是如果下游服务挂了,而上游有多个服务去调用他,那么上游的服务就全部挂掉了,这样会造成雪崩效应,从而使服务大面积的失效。

在连接下游服务超时会降级走我们定义的方法。

在一段时间内失败的比例大于配置,那么熔断器会打开,即使正确调用还是会走降级方法。

Hystrix代码

需要在application中开启Hystrix


  
  1. @EnableFeignClients #开启feign
  2. @EnableCircuitBreaker #开启Hystrix

添加配置文件


  
  1. feign:
  2. hystrix:
  3. enabled: true #默认hystrix是不开启的 需要开启
  4. ribbon:
  5. ConnectTimeout: 5000 # 请求连接的超时时间 默认的时间为 1 秒
  6. ReadTimeout: 5000 # 请求处理的超时时间
  7. hystrix:
  8. command:
  9. default: #default全局有效,service id指定应用有效
  10. execution:
  11. timeout:
  12. #如果enabled设置为false,则请求超时交给ribbon控制,为true,则超时作为熔断根据
  13. enabled: true
  14. isolation:
  15. strategy: SEMAPHORE
  16. thread:
  17. timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms
  18. circuitBreaker:
  19. enabled: true
  20. requestVolumeThreshold: 10 #默认20 ,熔断的阈值,如何user服务报错满足10次,熔断器就会打开,就算order之后请求正确的数据也不行。
  21. sleepWindowInMilliseconds: 8000 #默认5S , 等5S之后熔断器会处于半开状态,然后下一次请求的正确和错误讲决定熔断器是否真的关闭和是否继续打开
  22. errorThresholdPercentage: 0.5

新建UserClientFallBack


  
  1. import org.springframework.stereotype.Component;
  2. @Component
  3. public class UserClientFallBack implements DcClient {
  4. @Override
  5. public String consumer() {
  6. String error= "对不起又是我的错";
  7. System.out.println(error);
  8. return error;
  9. }
  10. @Override
  11. public String consumer2() {
  12. // TODO Auto-generated method stub
  13. return null;
  14. }
  15. }

依赖于上文 只要在DcClient 加入fallback =UserClientFallBack.class 然后在调用失败之后,会直接返回定义的错误,而不会抛出异常。


  
  1. import org.springframework.cloud.openfeign.FeignClient;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. @FeignClient(name = "eureka-client",fallback =UserClientFallBack.class )
  4. public interface DcClient {
  5. @GetMapping("/aaa/dc?dk=3002")
  6. String consumer();
  7. @GetMapping("/aaa/dc?dk=3002")
  8. String consumer2();
  9. }

相对于ribbon使用不同的请求类型需要不同的方法 feign 通过接口的参数就可以 如


  
  1. #post请求 入参为user对象
  2. @PostMapping("/x/x")
  3. Result getDept(@RequestBody User user);
  4. #get请求 入参为 string
  5. @GetMapping("/x/x/{userName}")
  6. Result getDept(@PathVariable String userName);

正常调用后

失败的调用获取是连接超时

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/104740653

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。