天天看点

springcould(4)服务熔断

消费方来实现容错,当调用服务方的接口出现错误时,消费方可以将后备方法返回给前台

使用熔断的前提,服务与服务之间的调用才可以使用熔断

文章目录

      • 1.方法级熔断
          • 1、引入hystrix依赖
          • 2、在启动类上使用@EnableHystrix注解开启Hystrix
          • 3、在方法上对熔断进行配置
          • 3、在本类中定义后备方法
      • 2.通过feign回调实现熔断,并通过实现类来提供后备方法
          • 1、在application.yml配置文件中对hystrix进行配置
          • 2、创建一个实现类来实现对应的FeignClient接口类(这个类就是后备方法类)
          • 3、在FeignClient接口类的`@FeignClient`注解上配置fallback
      • 3.通过feign回调实现熔断,并通过回调工厂来实现后备方法
          • 1、创建回调工厂接口的实现类
          • 2、在FeignClient接口类的`@FeignClient`注解上配置fallbackFactory

1.使用熔断时引入hystrix依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
           

2.在启动类上使用@EnableHystrix注解开启Hystrix

1.方法级熔断

1、引入hystrix依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
           
2、在启动类上使用@EnableHystrix注解开启Hystrix

在启动类上使用

@EnableHystrix

注解启开启Hystrix

3、在方法上对熔断进行配置

在需要使用熔断的方法上,使用

@HystrixCommand

注解对该方法进行标注,标注了

@HystrixCommand

的方法就是熔断方法,在

@HystrixCommand

中对熔断进行配置

@HystrixCommand

的属性

fallbackMethod

用于指定备用方法

@HystrixProperty

:配置熔断的状态

所有的

@HystrixProperty

的值,都使用HystrixPropertiesManager的常量,避免写错

CIRCUIT_BREAKER_ENABLED

是否开启熔断

EXECUTION_ISOLATION_STRATEGY

指定隔离策略,线程模式THREAD和信号量模式SEMAPHORE两种

CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD

指定当请求达到指定数量之后,再开启熔断

CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE

指定错误数量,当错误率达到指定数量之后,再开启熔断

CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS

指定自我修复时间(毫秒),当达到指定的请求数量和错误数量后,会在指定时间内随机抽取被熔断的方法来执行,如果执行成功则恢复该方法,若执行不成功则执行后备方法,该方法依然被熔断

例如在这个方法上使用熔断

@RequestMapping(value = "/getAnswerQuestionStudentList",method = RequestMethod.POST,name = "PROFILE")
//HystrixCommand注解标注的方法就是熔断方法,在HystrixCommand中对熔断进行配置
@HystrixCommand(fallbackMethod = "getAnswerQuestionStudentListFallBack",commandProperties = {
        //是否开启熔断
        @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
        //隔离策略,线程模式THREAD和信号量模式SEMAPHORE两种
        @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY,value = "SEMAPHORE"),
        //指定当请求达到指定数量之后,再开启熔断
        @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value="1"),
        //指定错误数量,当错误率达到指定数量之后,再开启熔断
        @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "1"),
        ///指定自我修复时间
        @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "1000")
})
public Result getAnswerQuestionStudentList(@RequestBody Exam exam){
    return studentExamService.getAnswerQuestionStudentList(exam);
}
           
3、在本类中定义后备方法

当调用的服务出现错误时,hystrix会熔断该方法并且执行这个后备方法作为替补,那么这个后备方法可以根据业务需求返回数据

后备方法需要与原方法的访问修饰符一致、返回值类型一致、参数一致

public Result getAnswerQuestionStudentListFallBack(Exam exam){
    return new Result(ResultCode.FAIL,"方法级后备--请求错误,服务调用失败,启用后备方法");
}
           

2.通过feign回调实现熔断,并通过实现类来提供后备方法

1、在application.yml配置文件中对hystrix进行配置

因为feign集成了hystrix,在使用hystrix时,需要在feign中配置hystrix来启动hystrix

feign:
  client:
    config:
      default:
          connectTimeout: 5000
          readTimeout: 5000
          loggerLevel: full
  hystrix: #启动hystrix
    enabled: true

# 配置熔断
hystrix:
  command:
    default:
      circuitBreaker:
        enabled: true   #是否启动熔断
        requestVolumeThreshold: 1  #指定请求数量,达到指定数量后启动熔断
        sleepWindowInMilliseconds: 10000  #指定自我修复时间
        errorThresholdPercentage: 50    #指定错误数量
      execution:
        isolation:
          thread: #熔断策略:线程模式
            timeoutInMilliseconds: 5000  #指定请求超时时间(默认是一秒) 超时后熔断并且走后备方法
           
2、创建一个实现类来实现对应的FeignClient接口类(这个类就是后备方法类)

实现FeignClient接口的类就是后备方法类,为该接口类的所有服务提供后备方法

在FeignClient接口的实现类上,加入

@Component

注解注入到spring容器中

@Component
public class UserClientFallback implements UserClient {
    //省略了其它没有用到的方法
    
    @Override
    public Result getQuestionExamTeacherList(Exam exam) {
        return new Result(ResultCode.FAIL,"启动了userClient实现类的后备方法");
    }
}
           
3、在FeignClient接口类的

@FeignClient

注解上配置fallback

通过fallback指定该FeignClient接口的实现类

@FeignClient(name = "JWXT-TEACHER",fallback = UserClientFallback.class)
           

3.通过feign回调实现熔断,并通过回调工厂来实现后备方法

使用回调工厂的好处是可以获取到是哪个方法出现错误被熔断掉了

工厂回调与类级熔断在application.yml的配置一样

1、创建回调工厂接口的实现类

创建接口

FallbackFactory

的实现类,

FallbackFactory

是hystrix中的一个接口类,

FallbackFactoryd

的泛型是相应的FeignClient

实现

FallbackFactory

create

方法,在

create

方法中return new 对应的FeignClient接口类(当new一个接口类时,必须实现该接口类的全部接口),实现的FeignClient接口类的接口,这些方法就是后备方法

回调工厂接口的实现类也需要加入

@Component

注解来注入到spring容器

@Component
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    private static final Logger LOGGER = LoggerFactory.getLogger(UserClientFallbackFactory.class);

    @Override
    public UserClient create(Throwable e) {
        LOGGER.warn("错误服务回调:{}",e.getMessage());
        return new UserClient() {
        
            //省略了其它没有用到的方法
        
            @Override
            public Result getQuestionExamTeacherList(Exam exam) {
                return new Result(ResultCode.FAIL,"启动了回调工厂");
            }
        };
    }
}
           
2、在FeignClient接口类的

@FeignClient

注解上配置fallbackFactory

通过fallbackFactory指定该FeignClient接口的回调工厂实现类

@FeignClient(name = "JWXT-TEACHER",fallbackFactory = UserClientFallbackFactory.class)
           

继续阅读