消费方来实现容错,当调用服务方的接口出现错误时,消费方可以将后备方法返回给前台
使用熔断的前提,服务与服务之间的调用才可以使用熔断
文章目录
-
-
- 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
@FeignClient
通过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
@FeignClient
通过fallbackFactory指定该FeignClient接口的回调工厂实现类
@FeignClient(name = "JWXT-TEACHER",fallbackFactory = UserClientFallbackFactory.class)