這篇文章主要介紹了SpringCloud斷路器Hystrix原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
在分布式環境中,許多服務依賴項中的一些必然會失敗。Hystrix是一個庫,通過添加延遲容忍和容錯邏輯,幫助你控制這些分布式服務之間的交互。Hystrix通過隔離服務之間的訪問點、停止級聯失敗和提供回退選項來實現這一點,所有這些都可以提高系統的整體彈性
兩個比較重要的類
HystrixCommand HystrixObservableCommand注解@HystrixCommand(fallbackMethods="methods")methods中可以添加降級策略
除了提供服務降級
還提供了請求緩存
@CacheResult @CacheRemve不過添加CacheResult的時候,說
HystrixRequestContext未初始化。
2020-01-13 16:12:10.273 ERROR 15348 --- [nio-8083-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root causejava.lang.IllegalStateException: Request caching is not available. Maybe you need to initialize the HystrixRequestContext? at com.netflix.hystrix.HystrixRequestCache.get(HystrixRequestCache.java:104) ~[hystrix-core-1.5.18.jar:1.5.18] at com.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:478) ~[hystrix-core-1.5.18.jar:1.5.18] at com.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:454) ~[hystrix-core-1.5.18.jar:1.5.18] at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ~[rxjava-1.3.8.jar:1.3.8] at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.3.8.jar:1.3.8]
查看官方文檔https://github.com/Netflix/Hystrix/wiki/How-To-Use
Typically this context will be initialized and shut down via a ServletFilter that wraps a user request or some other lifecycle hook.
在同一用戶請求的上下文中,相同依賴服務的返回數據始終保持一致。在當次請求內對同一個依賴進行重復調用,只會真實調用一次。在當次請求內數據可以保證一致性。
初始化是在filter中進行(官方建議),但是每一次請求都會進行初始化 。所以說和一般的緩存還是有去別的,可以解決高并發,保證的資源的線程安全。在某些場景很有用。
請求合并
/** * 建議: 服務提供方有較高的延遲。可以考慮使用請求合并 * HystrixCollapser 合并請求的時候會創建一個請求處理器。如果每次合并的請求量不大,只有很少的請求還要合并,會造成合并時間窗 * 并發量增大,時間窗的創建和消耗增大。所以只有在時間窗內有很大的并發量,推薦請求合并。 * * batchMethod 請求合并后的替換方法com.gitee.munan56.cloud.hystrixconsumer.AService#findALl(java.util.List) 注意客戶端要有這個方法 *HystrixProperty 一個屬性合并時間窗100s 這個時間結束后會發起請求,也就是指這個時間是合并處理的時間 * @param id * @return */ @HystrixCollapser(batchMethod = "findALl",collapserProperties = @HystrixProperty(name = "timerDelayInMilliseconds",value = "100")) public String doBFindOne(String id){ System.out.println("begin do provider service"); return restTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody(); }
新聞熱點
疑難解答