吾嘗終日而思矣涧偷,不如須臾之所學以莽鸭。
相關實現(xiàn):
繼承HystrixCommand/HystrixObservableCommand
并重寫run()/construct()
劣摇,執(zhí)行對應的execute()/queue()/observe()/toObservable()
方法,就算是用上這頭豬茁裙。
客戶端底層代碼也必須要有超時設置塘砸,不能無限制的阻塞以致線程池一直飽和。
.withExecutionTimeoutInMilliseconds(5000)
- 熔斷器
開啟熔斷晤锥,10s內(nèi)請求滿足3個掉蔬,且80%的都失敗了,熔斷矾瘾。
熔斷后每隔5秒女轿,放進來一部分請求, 成功了就取消熔斷。
.withCircuitBreakerEnabled(true)
.withCircuitBreakerRequestVolumeThreshold(3)
.withCircuitBreakerErrorThresholdPercentage(80)
.withCircuitBreakerSleepWindowInMilliseconds(5)
- 線程池
3個線程壕翩,超過就降級蛉迹。
.withCoreSize(3)
- 信號量
開啟信號量,并發(fā)超過3就降級放妈。降級并發(fā)超過1北救,拋異常荐操。
比起線程池,減少了線程開銷珍策,適用于緩存場景托启。
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
.withExecutionIsolationSemaphoreMaxConcurrentRequests(3)
.withFallbackIsolationSemaphoreMaxConcurrentRequests(1)
- 降級
一般在run方法中出現(xiàn)受檢異常就會走這個降級方法。我們也可以在run方法中攘宙,拋出非受檢異常屯耸,就不會走降級方法了。
重寫這個方法就實現(xiàn)了模聋〖缑瘢可以在這里完成各種玩法,返回默認值链方,讀redis,調(diào)用另外服務等灶搜。
@Override
protected String getFallback() {
return "fallback: " + name;
}
- 走緩存
HystrixRequestContext.initializeContext()
中間執(zhí)行的祟蚀,如果getCacheKey一樣,會走緩存割卖。
context.shutdown()
重寫此方法前酿,根據(jù)返回值判斷是否走緩存。
@Override
protected String getCacheKey() {
return String.valueOf(value) + value1;
}
- 合并
HystrixRequestContext.initializeContext()
中間執(zhí)行的鹏溯,運行間隔太短就會合并請求(還沒搞明白罢维。。)丙挽。
context.shutdown()