消費方來實作容錯,當調用服務方的接口出現錯誤時,消費方可以将後備方法傳回給前台
使用熔斷的前提,服務與服務之間的調用才可以使用熔斷
文章目錄
-
-
- 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)