伺服器容錯保護二

2021-09-11 09:45:59 字數 3722 閱讀 2628

###觸發斷路器的流程

客戶端通過resttemplate呼叫遠端服務,如果在resttemplate內部已經實現了重試的話,則還會進行重試,當重試完成後,結果還是失敗,則會呼叫fallback裡面指定的方法。

1 建立hystrixcommand或者hystrixobservablecommand物件 2 執行命令 3 結果是否被快取 如果開啟了快取,並且該命令快取命中,則快取的結果立即以observable物件的形式返回 4 斷路器是否開啟

###使用詳解(註解版用法) 基本使用: 建立同步執行

@hystrixcommand

public string hello

()複製**

####建立非同步執行

@hystrixcommand

public futurehelloasync

() };

}複製**

####定義服務降級

@hystrixcommand(fallbackmethod = "hellofallback")

public string hello

() public string hellofallback

()複製**

當降級的服務邏輯返回的結果也有可能不穩定時,也可以對其進行降級

@hystrixcommand(fallbackmethod = "hellofallback")

public string hello

() @hystrixcommand(fallbackmethod = "hellodefaultfallback")

public string hellofallback

() public string hellodefaultfallback

()複製**

有些情況也可以不需要實現降級邏輯 比如:執行寫操作邏輯的命令,執行批處理或離線計算的命令,當這些操作出現異常時,只需要返回錯誤結果即可,不需要進行降級處理。

####異常傳播 在hystrixcommand實現的run()方法中丟擲異常時,除了hystrixbadrequestexception之外,其他的異常均會被hystrix認為命令執行失敗,並觸發服務降級的處理邏輯。@hystrixcommand註解的ignoreexception引數可以忽略指定異常

@hystrixcommand(ignoreexceptions = )

public string hello

()複製**

當hello方法丟擲了型別為badrequestexception的異常時,hystrix會將它包裝在hystrixbadrequestexception中丟擲,這樣就不會觸發後續的fallback邏輯。 ####異常獲取

@hystrixcommand(fallbackmethod = "hellofallback")

public string hello

() public string hellofallback(throwable e)

複製**

通過在降級方法引數列表中加入throwable 型別的引數,獲取異常物件e,可以通過獲取異常資訊或者異常型別來進行處理。

####命令名稱、分組以及執行緒池劃分 通過設定命令組,hystrix會根據組來組織和統計命令的告警、儀錶盤等資訊。那麼為什麼一定要設定命令組呢?因為除了根據組能實現統計之外,hystrix命令預設的執行緒劃分也是根據命令分組來實現的。預設情況下,hystrix會讓相同組名的命令使用同乙個執行緒池,所以我們需要在建立hystrix命令時為其指定命令組名來實現預設的執行緒池劃分。 hystrix還提供了hystrixthreadpoolkey來對執行緒池進行設定,通過它我們可以實現更細粒度的執行緒池的劃分。 如果在沒有特別指定hystrixthreadpoolkey的情況下,依然會使用命令組的方式來劃分執行緒池。通常情況下,盡量通過hystrixthreadpoolkey的方式來指定執行緒池的劃分,而不是通過組名的預設方式實現劃分,因為多個不同的命令可能從業務邏輯上來看屬於同乙個組,但是往往從實現本身上需要跟其他命令進行隔離。

@hystrixcommand(commandkey = "hello",groupkey = "testgroup",threadpoolkey = "hellothread")

public string hello

()複製**

####請求快取

@cacheresult

@hystrixcommand

public user getuserbyid(long id)",user.class,id);

}複製**

通過新增 @cacheresult註解,開啟快取功能。快取的key值使用所有的引數生成。

@cacheresult(cachekeymethod = "getuserbyidcachekey")

@hystrixcommand

public user getuserbyid(long id)",user.class,id);

}private long getuserbyidcachekey(long id)

複製**

第二種方式

@cacheresult

@hystrixcommand

public user getuserbyid(@cachekey("id") long id)",user.class,id);

}複製**

第二種方式@cachekey的優先順序比第一種方式cachekeymethod 的優先順序低 第二種方式還支援訪問user物件裡面的id屬性

@cacheresult

@hystrixcommand

public user getuserbyid(@cachekey("id") long id)",user.class,id);

}@cacheremove(commandkey = "getuserbyid")

@hystrixcommand

public user update(user user)

複製**

####請求合併 微服務架構中的依賴通常通過遠端呼叫實現,而遠端呼叫中最常見的問題就是通訊消耗與連線數占用。在高併發的情況下,因通訊次數的增加,總的通訊時間消耗將會變得不那麼理想。因為依賴服務端 執行緒池資源有限,將會出現排隊等待與響應延遲的情況。hystrix提供了hystrixcollapser來實現請求的合併,以減少通訊消耗和執行緒數的占用。 hystrixcollapser實現了在hystrixcommand之前放置乙個合併處理器,將處於乙個很短的時間窗(預設10毫秒)內對同一依賴服務的多個請求進行整合並以批量方式發起請求的功能(服務提供方也需要提供相應的批量實現介面)。

@hystrixcollapser(batchmethod = "batchgetuserbyids",collapserproperties = )

public user getuserbyid(long id)",user.class,id);

}public listbatchgetuserbyids(listids)",list.class, stringutils.join(ids,","));

}複製**

請求合併額外開銷

####屬性詳解

服務容錯保護Hystrix

服務容錯保護hystrix hystrix服務降級 前言在微服務架構中,我們將系統拆分成了乙個個的服務單元,各單元應用間通過服務註冊與訂閱的方式互相依賴。由於每個單元都在不同的程序中執行,依賴通過遠端呼叫的方式執行,這樣就有可能因為網路原因或是依賴服務自身問題出現呼叫故障或延遲,而這些問題會直接導致...

服務容錯保護(Hystrix服務降級)

在微服務架構中,我們將系統拆分成了乙個個的服務單元,各單元應用間通過服務註冊與訂閱的方式互相依賴。由於每個單元都在不同的程序中執行,依賴通過遠端呼叫的方式執行,這樣就有可能因為網路原因或是依賴服務自身問題出現呼叫故障或延遲,而這些問題會直接導致呼叫方的對外服務也出現延遲,若此時呼叫方的請求不斷增加,...

服務容錯保護(5 服務熔斷)

當請求後端服務失敗數量超過一定比例 預設50 斷路器會切換到開路狀態 open 這時所有請求會直接失敗而不會傳送到後端服務.斷路器保持在開路狀態一段時間後 預設5秒 自動切換到半開路狀態 half open 和服務降級很相似,但是服務降級沒有熔斷策略的設定。斷路器確定是否開啟需要統計一些請求和錯誤資...