Hystrix入門執行過程


netflix-hystrix團隊開發了hystrix-javanica,使用流行的java注解以及函數式編程,來替代hystrix枯燥的編程方法.

其主要是HystrixCommand注解的使用.
/**
 *  Sync Execution
 */
@HystrixCommand(fallback="syncFallback")
public List<User> findUsers(User param){
    return userRepository.find(param);
}
/**
 * Aysync Execution
 * 
 */
@HystrixCommand(fallback="asyncFallback")
public Future<List<User>> findUsers(User param){
    return new AsyncResult<List<User>>(){
         public List<User> invoke() {return userRepository.find(param)}
    };
}
Future<List<User>> future = userService.findUser(param);
List<User> users = funture.get();
/**
 * Reactive Execution
 */
@HystrixCommand
public Observable<List<User>> findUsers(User param){
    return new Observer.create(subscriber->{
        if(!subscriber.isUnscribed(){
            subscriber.onNext(userRepository.find(param);
            subscriber.onCompleted ();
        }
    })
}
Observable obsevable = userService.findUser(param);
List<User> users = observable.toBlocking().single();
/**
  *  降級方法必須的參數應該與被執行的方法參數一致,否則hystrix不會查詢到降級方法,會直接拋出異常
  *  降級方法也可以同步異步執行
  /
@HystrixCommand(fallback="defaultFallback")
private List<User> syncFallback(User param){
     return Lists.newArrayList(new User("zhangsan",23));
}
/**
  *  Async Execution Command Async Fallback
  *  Throwable 參數是可選的  
  *  
  /
@HystrixCommand(fallback="defaultFallback")
private Future<List<User>> async(User param,Throwable e){
    return new AysncResult<List<User>>(){
         public List<User> invoke() { return Lists.newArrayLists(new User("default",22))}
    }
}
降級(fallback)方法也可以被降級
private List<User> defaultFallback(User param){
    return null;
}

忽略元數據末尾 回到原數據開始處

1.hystrixCommand 有三種執行方式,分別是同步執行,異步執行和Reactive execution(沒翻譯出來).
其工作方式如上圖所示(netflix最新提供),在hystrixCommand執行時,需要提前聲明是哪種執行方式
2.hystrix 會選擇提前設定好的方式執行HystrixCommand
3.如果你使用了Request Cache,並且這個請求的響應剛好在這個緩存中, 這個響應就會立即返回Observe對象.
4.如果斷路器是打開狀態,hystrixCommand就不會執行,而會直接執行降級(fallback)方法.
5.如果hystrix的線程池或者隊列或者是信號量是滿負荷,hystrixCommand將不會執行,直接執行降級(fallback)方法.
6.執行我們所編寫的業務邏輯.並且判斷是否執行成功.超時. 如果執行分業務邏輯既沒有拋出異常 也沒有超時,則直接返回成功的執行結果
7. 如果執行失敗或者執行超時,則需要hystrix降級策略,並且上報斷路器,用於統計和計算斷路器的狀態.
8.通過上面的流程 可以總結出 hystrix 觸發降級策略主要有以下幾個原因:執行業務邏輯時拋出了非HystrixBadRequestException異常,
業務邏輯執行超時,斷路器開啟直接阻斷以及線程池/信號量滿負荷直接拒絕.
當一個hystrixCommand沒有給出降級策略時,直接拋出異常
如果降級邏輯失敗,則直接拋出異常或者執行降級的降級邏輯.
9.執行成功,返回執行成功的結果. 對於返回執行成功接結果hystrix做出了如下圖的執行策略
執行成功后會返回一個Observer對象, 然后根據設定的執行策略,再返回結果

HystrixCommand 是怎樣打開一個斷路器?

hystrixCommand通過四個參數來確定是否需要開啟斷路器
circuitBreakerRequestVolumeThreshold 
metricsRollingStatisticalWindowBuckets
metricsRollingStatisticalWindow
circuitBreakerErrorThresholdPercentage

hystrixCommand 對於每個斷路器默認維護10個bucket ,通過 metricsRollingStatisticalWindowBuckets參數來設置,

metricsRollingStatisticalWindow的默認值是10秒,對於每個bucket分配1秒
circuitBreakerRequestVolumeThreshold 的默認值是20 

這幾個參數的意思是10秒鍾之內必須統計出20次請求的失敗,超時, 或者線程池或信號量拒絕的次數

circuitBreakerErrorThresholdPercentage 這個參數的意思是失敗率的百分比閾值,如果失敗率超過了這個比率,斷路器就會被打開.

HystrixCommand 怎樣關閉一個斷路器?

當斷路器打開一段時間后,就會進入半開(Half-Open State)狀態,通過circuitBreakerSleepWindowInMilliseconds來設置這個時間

當一個請求通過這個斷路器時,斷路器就不會阻斷這個請求而會直接將這個請求通過,如果這個請求仍然是失敗的,那么斷路器會直接回到打開狀態.

如果這個請求是成功的,斷路器就會關閉.並且開始進行下一次統計.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM