SpringCloud-Hystrix

以你之姓@ 2023-02-09 11:47 56阅读 0赞

hystrix
hystrix工作原理

1.Hystrix

在这里插入图片描述
pom

  1. <!--新增hystrix-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  5. </dependency>

采用的是消费端去调用服务端(注册中心eureka):
openfeign pom:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

在这里插入图片描述

  1. @Component
  2. @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
  3. public interface PaymentHystrixService {
  4. @GetMapping("/payment/hystrix/ok/{id}")
  5. public String paymentInfo_OK(@PathVariable("id") Integer id);
  6. @GetMapping("/payment/hystrix/timeout/{id}")
  7. public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
  8. }

回调类:

  1. /** * 下面方法一一对应一个fallback方法 */
  2. @Component
  3. public class PaymentFallbackService implements PaymentHystrixService {
  4. @Override
  5. public String paymentInfo_OK(Integer id) {
  6. return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";
  7. }
  8. @Override
  9. public String paymentInfo_TimeOut(Integer id) {
  10. return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";
  11. }
  12. }

controller:

  1. @RestController
  2. @Slf4j
  3. public class OrderHystrixController {
  4. @Resource
  5. private PaymentHystrixService paymentHystrixService;
  6. @Value("${server.port}")
  7. private String serverPort;
  8. @GetMapping("/consumer/payment/hystrix/ok/{id}")
  9. @HystrixCommand
  10. public String paymentInfo_OK(@PathVariable("id") Integer id) {
  11. String result = paymentHystrixService.paymentInfo_OK(id);
  12. log.info("*******result:" + result);
  13. return result;
  14. }
  15. @GetMapping("/consumer/payment/hystrix/timeout/{id}")
  16. public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
  17. String result = paymentHystrixService.paymentInfo_TimeOut(id);
  18. return result;
  19. }
  20. }

服务降级

设置服务提供方的超时兜底方法

在这里插入图片描述
配置 超时的兜底方法paymentInfo_TimeOutHandler:
只要是服务不可用了超时或者抛出异常都可以调用兜底方法

  1. //失败
  2. @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", commandProperties = {
  3. @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000") //3秒钟以内就是正常的业务逻辑
  4. })
  5. public String paymentInfo_TimeOut(Integer id) {
  6. // int timeNumber = 5;
  7. int age = 10 / 0;
  8. // try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}
  9. //return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"呜呜呜"+" 耗时(秒)"+timeNumber;
  10. return "线程池:" + Thread.currentThread().getName() + " paymentInfo_TimeOut,id: " + id + "\t" + "呜呜呜" + " 耗时(秒)";
  11. }
  12. //超时兜底方法
  13. public String paymentInfo_TimeOutHandler(Integer id) {
  14. return "线程池:" + Thread.currentThread().getName() + " 系统繁忙, 请稍候再试 ,id: " + id + "\t" + "哭了哇呜";
  15. }

主启动类激活熔断功能:
在这里插入图片描述
测试:
在这里插入图片描述

消费方降级保护:

yml

  1. feign:
  2. hystrix:
  3. enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。

在这里插入图片描述
controller添加超时兜底方法:

  1. @GetMapping("/consumer/payment/hystrix/timeout/{id}")
  2. @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",
  3. commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500") //3秒钟以内就是正常的业务逻辑 80只等1.5秒
  4. })
  5. public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
  6. String result = paymentHystrixService.paymentInfo_TimeOut(id);
  7. return result;
  8. }
  9. //兜底方法
  10. public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {
  11. return "我是消费者80,对付支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,(┬_┬)";
  12. }

在这里插入图片描述

全局兜底方法

注意:@HystrixCommond没有特别指明用全局兜底方法

在这里插入图片描述

  1. //下面是全局fallback方法
  2. public String payment_Global_FallbackMethod() {
  3. return "Global异常处理信息,请稍后再试,(┬_┬)";
  4. }

在Service层配置统一降级

  1. @Component
  2. @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class) //指名方法对应兜底方法
  3. public interface PaymentHystrixService {
  4. @GetMapping("/payment/hystrix/ok/{id}")
  5. public String paymentInfo_OK(@PathVariable("id") Integer id);
  6. @GetMapping("/payment/hystrix/timeout/{id}")
  7. public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
  8. }
  9. /** * 下面方法一一对应一个fallback方法 */
  10. @Component
  11. public class PaymentFallbackService implements PaymentHystrixService {
  12. @Override
  13. public String paymentInfo_OK(Integer id) {
  14. return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";
  15. }
  16. @Override
  17. public String paymentInfo_TimeOut(Integer id) {
  18. return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";
  19. }
  20. }

服务熔断

在这里插入图片描述
存在逐渐恢复链路过程是熔断的主要特性,即能够恢复
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

服务提供方

  1. /** * ====服务熔断 * * @param id * @return */
  2. @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = {
  3. @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //是否开启断路器
  4. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求次数
  5. @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //时间范围
  6. @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //失败率达到多少后跳闸
  7. })
  8. public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
  9. if (id < 0) {
  10. throw new RuntimeException("*****id 不能负数");
  11. }
  12. String serialNumber = IdUtil.simpleUUID();
  13. return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber;
  14. }
  15. public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {
  16. return "id 不能负数,请稍候再试,(┬_┬)/~~ id: " + id;
  17. }

在这里插入图片描述

服务限流

  1. @HystrixCommand(fallbackMethod = "helloError",
  2. commandProperties = {
  3. @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
  4. @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
  5. @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
  6. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2")},
  7. threadPoolProperties = {
  8. @HystrixProperty(name = "coreSize", value = "5"),
  9. @HystrixProperty(name = "maximumSize", value = "5"),
  10. @HystrixProperty(name = "maxQueueSize", value = "10")
  11. })

How it works?

在这里插入图片描述
在这里插入图片描述

发表评论

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

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

相关阅读