1. 程式人生 > 實用技巧 >spring cloud -->hystrix(二)

spring cloud -->hystrix(二)

spring cloud: Hystrix(二):簡單使用@HystrixCommand的commandProperties配置@HistrixProperty隔離策略

某電子商務網站在一個黑色星期五發生過載.過多的併發請求,導致使用者支付的請求延遲很久沒有響應,在等待很長時間後最終失敗。支付失敗又導致使用者重新重新整理頁面並再次嘗試支付,進一步增加了伺服器的負載,最終整個系統都崩潰了。

斷路器模式
一個遠端呼叫對應著一個執行緒/程序。如果響應太慢,這個執行緒/程序就得不到釋放。資源就會被耗盡,最終導致服務不可用。
斷路器可以理解為對容易導致錯誤的操作的代理。這種代理能夠統計一段時間內呼叫失敗的次數,並決定是正常請求依賴的服務還是直接返回。

斷路器可以實現快速失敗,當它在一段時間內檢測到許多類似的錯誤(例如超時),就會在之後的一段時間內,強迫對該服務的呼叫快速失敗,即不再請求所依賴的服務。這樣,應用程式就不須浪費CPU時間去等待長時間的超時。
斷路器也可以自動診斷依賴的服務是否已經恢復正常。

1 2 3 正常情況下斷路器關閉,可正常請求依賴的服務。 當一段時間內,請求失敗率達到一定閾值,斷路器就會開啟。此時,不會再去請求依賴的服務。 斷路器開啟一段時間後,會自動進入‘半開’狀態。此時,斷路器可允許一個請求訪問依賴的服務。如果請求能夠呼叫成功,則關閉斷路器;否則繼續保持開啟狀態。

  

Hystrix執行緒隔離策略與傳播上下文

Hystrix的隔離策略兩種: 分別是執行緒隔離和訊號量隔離。

THREAD(執行緒隔離):使用該方式,HystrixCommand將會在單獨的執行緒上執行,併發請求受執行緒池中執行緒數量的限制。
SEMAPHORE(訊號量隔離):使用該方式,HystrixCommand將會在呼叫執行緒上執行,開銷相對較小,併發請求受到訊號量個數的限制。
Hystrix中預設並且推薦使用執行緒隔離(THREAD),因為這種方式有一個除網路超時以外的額外保護。
一般來說,只有當呼叫負載異常高時(例如每個例項每秒呼叫數百次)才需要訊號量隔離,因為這種場景下使用THREAD開銷會比較高。訊號量隔離一般僅適用於非網路呼叫的隔離。

可以使用execution.isolation.strategy屬性指定隔離策略。
正常情況下,預設為執行緒隔離, 保持預設即可。
如果發生找不到上下文執行時異常,可考慮將隔離策略設定為SEMAPHORE。

Feign使用Hystrix
前面講的是使用註解@HystrixCommand的fallbackMethod屬性實現回退的。然而,Feign是以介面形式工作的,它沒有方法體。

q請看例文

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @RestController publicclassMovieController { @Autowired privateRestTemplate restTemplate; @GetMapping("/movie/{id}") @HystrixCommand(fallbackMethod ="notfindback", commandProperties=@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") ) publicUser findById(@PathVariable Long id) { //http://localhost:7900/simple/ returnrestTemplate.getForObject("http://spring-boot-user/simple/"+ id, User.class); } publicUser notfindback(Long id) { User user =newUser(); user.setId(0L); returnuser; } }

  

這一段程式碼:

1 2 3 4 5 6 7 @GetMapping("/movie/{id}") @HystrixCommand(fallbackMethod ="notfindback", commandProperties=@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") ) publicUser findById(@PathVariable Long id) { //http://localhost:7900/simple/ returnrestTemplate.getForObject("http://spring-boot-user/simple/"+ id, User.class); }

  

如果不加@HystrixCommand的commandProperties=@HystrixProperty註解配置,那麼:restTemplate.getForObject()請求是一個執行緒;@HystrixCommand()是一個隔離執行緒。

加上@HystrixCommand的commandProperties=@HystrixProperty註解配置後,將2個執行緒合併到一個執行緒裡。

轉載:https://www.cnblogs.com/achengmu/p/9834451.html