天天看點

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)
           

繼續閱讀