spring cloud -->hystrix(二)
spring cloud: Hystrix(二):簡單使用@HystrixCommand的commandProperties配置@HistrixProperty隔離策略
某電子商務網站在一個黑色星期五發生過載.過多的併發請求,導致使用者支付的請求延遲很久沒有響應,在等待很長時間後最終失敗。支付失敗又導致使用者重新重新整理頁面並再次嘗試支付,進一步增加了伺服器的負載,最終整個系統都崩潰了。
斷路器模式
一個遠端呼叫對應著一個執行緒/程序。如果響應太慢,這個執行緒/程序就得不到釋放。資源就會被耗盡,最終導致服務不可用。
斷路器可以理解為對容易導致錯誤的操作的代理。這種代理能夠統計一段時間內呼叫失敗的次數,並決定是正常請求依賴的服務還是直接返回。
斷路器也可以自動診斷依賴的服務是否已經恢復正常。
1 2 3 |
正常情況下斷路器關閉,可正常請求依賴的服務。
當一段時間內,請求失敗率達到一定閾值,斷路器就會開啟。此時,不會再去請求依賴的服務。
斷路器開啟一段時間後,會自動進入‘半開’狀態。此時,斷路器可允許一個請求訪問依賴的服務。如果請求能夠呼叫成功,則關閉斷路器;否則繼續保持開啟狀態。
|
Hystrix執行緒隔離策略與傳播上下文
Hystrix的隔離策略兩種: 分別是執行緒隔離和訊號量隔離。
THREAD(執行緒隔離):使用該方式,HystrixCommand將會在單獨的執行緒上執行,併發請求受執行緒池中執行緒數量的限制。
SEMAPHORE(訊號量隔離):使用該方式,HystrixCommand將會在呼叫執行緒上執行,開銷相對較小,併發請求受到訊號量個數的限制。
Hystrix中預設並且推薦使用執行緒隔離(THREAD),因為這種方式有一個除網路超時以外的額外保護。
一般來說,只有當呼叫負載異常高時(例如每個例項每秒呼叫數百次)才需要訊號量隔離,因為這種場景下使用THREAD開銷會比較高。訊號量隔離一般僅適用於非網路呼叫的隔離。
正常情況下,預設為執行緒隔離, 保持預設即可。
如果發生找不到上下文執行時異常,可考慮將隔離策略設定為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
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@GetMapping( "/movie/{id}" )
@HystrixCommand(fallbackMethod = "notfindback" , commandProperties=@HystrixProperty(name= "execution.isolation.strategy" , value= "SEMAPHORE" ) )
public User findById(@PathVariable Long id)
{
//http://localhost:7900/simple/
return restTemplate.getForObject( "http://spring-boot-user/simple/" + id, User. class );
}
public User notfindback(Long id)
{
User user = new User();
user.setId(0L);
return user;
}
}
|
這一段程式碼:
1 2 3 4 5 6 7 |
@GetMapping( "/movie/{id}" )
@HystrixCommand(fallbackMethod = "notfindback" , commandProperties=@HystrixProperty(name= "execution.isolation.strategy" , value= "SEMAPHORE" ) )
public User findById(@PathVariable Long id)
{
//http://localhost:7900/simple/
return restTemplate.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