9.hystrix服务降级、熔断


1.简介

hystrix有三个主要功能:降级,熔断,限流

2.降级使用场景

一般在客户端使用

3.降级分为3类

a.单个方法降级

b.控制器中所有方法降级

c.所有控制器中方法降级

4.单个方法降级

以客户端为例,在控制器中

    /**
     * 测试单一服务降级方法
     * @param id
     * @return
     */
    @HystrixCommand(fallbackMethod = "paymentErrorStandby",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    @GetMapping("/timeout/{id}")
    public Object error(@PathVariable("id") Integer id){

        try{
            TimeUnit.SECONDS.sleep(5);
        }catch (Exception e){
            e.printStackTrace();
        }
        return paymentService.error(id);

        // 程序异常
        // return 10/0;
    }


    public String paymentErrorStandby(Integer id) {
        return "8080端口返回:兜底方法";
    }

5.单个控制器中方法降级

@RestController
@Slf4j
@RequestMapping("consumer")
//@DefaultProperties(defaultFallback = "globalFallbackMethod")
public class OrderController {

    /**
     * 测试(控制器中服务降级)默认全局统一降级服务处理方法
     * @HystrixCommand 如果不指定备用方法,会调用默认备用方法globalFallbackMethod
     * @return
     */
    @GetMapping("/test")
    @HystrixCommand
    public Object test(){
        return 10/0;
    }

    /**
     * 全局统一降级服务处理方法
     * @return
     */
    public String globalFallbackMethod(){
        return "兜底方法";
    }
}

6.所有控制器中方法降级

此处使用的是feign

 写一个全局降级方法实现该接口,在上图中加入fallback指定的这个实现类

 7.yml

server:
  port: 8080

spring:
  application:
    name: cloud-consumer-hystrix-order8080

eureka:
  client:
    register-with-eureka: true #表示向注册中心注册自己
    fetch-registry: true # 获得注册表
    service-url: # 请求注册服务的地址
      defaultZone: http://eureka7001:7001/eureka/


feign:
  hystrix:
    enabled: true

8.启动类

@SpringBootApplication
@EnableFeignClients
// 感觉下面那个加不加都行
@EnableHystrix
public class OrderMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderMain80.class, args);
        }
}

9.pom

        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
        

10.个人总结

c方法中:客户端请求服务端,才会服务降级,自己请求接口内部报错,降级是有问题的。

11.hytrix熔断

与降级一样的注解,只是注解内容有点区别,在controller层中

    public String globalFallbackMethod(Integer id){
        return "全局统一降级服务处理方法";
    }


    /**
   *
   * 熔断流程 * 1.统计时间为10秒,10秒内请求次数达到请求次数阈值10次,开启断路器 * 2.10秒内假设请求10次,如果有6次及以上请求失败,断路器开始熔断;否则,达不到条件不会熔断 * 3.熔断初始期间,无论请求是否正确,都做降级处理;中期阶段,正确请求次数达到一定次数,则半开接口,否则继续熔断;熔断后期,正确请求次数达到一定次数,则完全恢复接口,否则继续熔断 * @param number * @return */ @GetMapping("test2/{number}") @HystrixCommand(fallbackMethod = "globalFallbackMethod",commandProperties = { @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 开启断路器 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 请求次数阈值 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),// 跳闸持续时间 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")// 失败阈值占比 }) public String test2(@PathVariable("number") Integer number){ if (number < 0){ throw new RuntimeException("number小于0"); } return UUID.randomUUID().toString(); }