用 Hystrix 构建高可用服务架构
1 hystrix是什么
在分布式系統中,每個服務都可能會調用很多其他服務,被調用的那些服務就是依賴服務,有的時候某些依賴服務出現故障也是很正常的。
Hystrix 可以讓我們在分布式系統中對服務間的調用進行控制,加入一些調用延遲或者依賴故障的容錯機制。
Hystrix 通過將依賴服務進行資源隔離,進而阻止某個依賴服務出現故障時在整個系統所有的依賴服務調用中進行蔓延;同時Hystrix 還提供故障時的 fallback 降級機制。
總而言之,Hystrix 通過這些方法幫助我們提升分布式系統的可用性和穩定性。
2 hystrix可以干什么
阻止任何一個依賴服務耗盡所有的資源,比如 tomcat 中的所有線程資源。
避免請求排隊和積壓,采用限流和 fail fast 來控制故障。
提供 fallback 降級機制來應對故障。
使用資源隔離技術,比如 bulkhead(艙壁隔離技術)、swimlane(泳道技術)、circuit breaker(斷路技術)來限制任何一個依賴服務的故障的影響。
通過近實時的統計/監控/報警功能,來提高故障發現的速度。
通過近實時的屬性和配置熱修改功能,來提高故障處理和恢復的速度。
保護依賴服務調用的所有故障情況,而不僅僅只是網絡故障情況
3 怎么使用hystrix
3.1、構建一個HystrixCommand或者HystrixObservableCommand 一個HystrixCommand或一個HystrixObservableCommand對象,代表了對某個依賴服務發起的一次請求或者調用 構造的時候,可以在構造函數中傳入任何需要的參數 HystrixCommand主要用于僅僅會返回一個結果的調用 HystrixObservableCommand主要用于可能會返回多條結果的調用 HystrixCommand command = new HystrixCommand(arg1, arg2); HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2); 3.2、調用command的執行方法 執行Command就可以發起一次對依賴服務的調用 要執行Command,需要在4個方法中選擇其中的一個:execute(),queue(),observe(),toObservable() 其中execute()和queue()僅僅對HystrixCommand適用 execute():調用后直接block住,屬于同步調用,直到依賴服務返回單條結果,或者拋出異常 queue():返回一個Future,屬于異步調用,后面可以通過Future獲取單條結果 observe():訂閱一個Observable對象,Observable代表的是依賴服務返回的結果,獲取到一個那個代表結果的Observable對象的拷貝對象 toObservable():返回一個Observable對象,如果我們訂閱這個對象,就會執行command并且獲取返回結果 K value = command.execute(); Future<K> fValue = command.queue(); Observable<K> ohValue = command.observe(); Observable<K> ocValue = command.toObservable(); execute()實際上會調用queue().get().queue(),接著會調用toObservable().toBlocking().toFuture() 也就是說,無論是哪種執行command的方式,最終都是依賴toObservable()去執行的 3.3、檢查是否開啟緩存 從這一步開始,進入我們的底層的運行原理啦,了解hysrix的一些更加高級的功能和特性 如果這個command開啟了請求緩存,request cache,而且這個調用的結果在緩存中存在,那么直接從緩存中返回結果 3.4、檢查是否開啟了短路器 檢查這個command對應的依賴服務是否開啟了短路器 如果斷路器被打開了,那么hystrix就不會執行這個command,而是直接去執行fallback降級機制 3.5、檢查線程池/隊列/semaphore是否已經滿了 如果command對應的線程池/隊列/semaphore已經滿了,那么也不會執行command,而是直接去調用fallback降級機制 3.6、執行command 調用HystrixObservableCommand.construct()或HystrixCommand.run()來實際執行這個command HystrixCommand.run()是返回一個單條結果,或者拋出一個異常 HystrixObservableCommand.construct()是返回一個Observable對象,可以獲取多條結果 如果HystrixCommand.run()或HystrixObservableCommand.construct()的執行,超過了timeout時長的話,那么command所在的線程就會拋出一個TimeoutException 如果timeout了,也會去執行fallback降級機制,而且就不會管run()或construct()返回的值了 這里要注意的一點是,我們是不可能終止掉一個調用嚴重延遲的依賴服務的線程的,只能說給你拋出來一個TimeoutException,但是還是可能會因為嚴重延遲的調用線程占滿整個線程池的 即使這個時候新來的流量都被限流了。。。 如果沒有timeout的話,那么就會拿到一些調用依賴服務獲取到的結果,然后hystrix會做一些logging記錄和metric統計 3.7、短路健康檢查 Hystrix會將每一個依賴服務的調用成功,失敗,拒絕,超時,等事件,都會發送給circuit breaker斷路器 短路器就會對調用成功/失敗/拒絕/超時等事件的次數進行統計 短路器會根據這些統計次數來決定,是否要進行短路,如果打開了短路器,那么在一段時間內就會直接短路,然后如果在之后第一次檢查發現調用成功了,就關閉斷路器 3.8、調用fallback降級機制 在以下幾種情況中,hystrix會調用fallback降級機制:run()或construct()拋出一個異常,短路器打開,線程池/隊列/semaphore滿了,command執行超時了 一般在降級機制中,都建議給出一些默認的返回值,比如靜態的一些代碼邏輯,或者從內存中的緩存中提取一些數據,盡量在這里不要再進行網絡請求了 即使在降級中,一定要進行網絡調用,也應該將那個調用放在一個HystrixCommand中,進行隔離 在HystrixCommand中,上線getFallback()方法,可以提供降級機制 在HystirxObservableCommand中,實現一個resumeWithFallback()方法,返回一個Observable對象,可以提供降級結果 如果fallback返回了結果,那么hystrix就會返回這個結果 對于HystrixCommand,會返回一個Observable對象,其中會發返回對應的結果 對于HystrixObservableCommand,會返回一個原始的Observable對象 如果沒有實現fallback,或者是fallback拋出了異常,Hystrix會返回一個Observable,但是不會返回任何數據 不同的command執行方式,其fallback為空或者異常時的返回結果不同 對于execute(),直接拋出異常 對于queue(),返回一個Future,調用get()時拋出異常 對于observe(),返回一個Observable對象,但是調用subscribe()方法訂閱它時,理解拋出調用者的onError方法 對于toObservable(),返回一個Observable對象,但是調用subscribe()方法訂閱它時,理解拋出調用者的onError方法 3.9、不同的執行方式 execute(),獲取一個Future.get(),然后拿到單個結果 queue(),返回一個Future observer(),立即訂閱Observable,然后啟動8大執行步驟,返回一個拷貝的Observable,訂閱時理解回調給你結果 toObservable(),返回一個原始的Observable,必須手動訂閱才會去執行8大步驟?4 總結:
由上圖對微服務技術進行了分析,可以知道dubbo服務并不是很好的做到這個,在很早的時候電商開發的時候就是采用這個進行解決的,對服務進行控制.但是相對于springcloud中使用起來更簡單,
轉載于:https://www.cnblogs.com/xiufengchen/p/10749719.html
總結
以上是生活随笔為你收集整理的用 Hystrix 构建高可用服务架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在在苏州当网管一个月能拿多少工资?
- 下一篇: 求一个关于夏目的个性签名。