寫寫前面用的東西吧 spring cloud的熔斷器Hystrix 也就是->豪豬

摘要: 生下來 活下去 一言可以盡 就是可以閒下來吧前面忙了幾個月的東西 做個大概記錄 怎麼說來著 什麼記性什麼爛筆頭來著····· 恩 就醬

首先 熔斷是嘛玩意······什麼開閉路什麼的 ·····就不詳述了

下面上點軟貨

先介紹點概念 以我的感官出發:spring boot 其實走的路線是大量的代碼移到配置文件中 各種 .properties中 可能也是趨勢吧(猜測猜測)現在新的東西中越來越多的是往這個方向走

(概念很多是別人總結好的)

1. hystrix介紹

斷路器, 當Hystrix Command請求後端服務失敗數量超過一定比例(默認50%), 斷路器會切換到開路狀態(Open). 這時所有請求會直接失敗而不會發送到後端服務. 斷路器保持在開路狀態一段時間後(默認5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(CLOSED), 否則重新切換到開路狀態(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦後端服務不可用, 斷路器會直接切斷請求鏈, 避免發送大量無效請求影響系統吞吐量, 並且斷路器有自我檢測並恢復的能力

(我的理解:一方面解決依賴隔離 一方面服務掛掉後 斷掉鏈接 防止整個系統崩潰 後面會進入判斷是否恢復的狀態 恢復就重連)

2. Fallback介紹

相當於是降級操作. 對於查詢操作, 我們可以實現一個fallback方法, 當請求後端服務出現異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設置的默認值或者來自緩存

•SUCCESS:run()成功,不觸發getFallback()

•FAILURE:run()拋異常,觸發getFallback()

•TIMEOUT:run()超時,觸發getFallback()

•BAD_REQUEST:run()拋出HystrixBadRequestException,不觸發getFallback()

•SHORT_CIRCUITED:斷路器開路,觸發getFallback()

•THREAD_POOL_REJECTED:線程池耗盡,觸發getFallback()

•FALLBACK_MISSING:沒有實現getFallback(),拋出異常

3.資源隔離

在Hystrix中, 主要通過線程池來實現資源隔離. 通常在使用的時候我們會根據調用的遠程服務劃分出多個線程池. 例如調用產品服務的Command放入A線程池, 調用賬戶服務的Command放入B線程池. 這樣做的主要優點是運行環境被隔離開了. 這樣就算調用服務的代碼存在bug或者由於其他原因導致自己所在線程池被耗盡時, 不會對系統的其他服務造成影響. 但是帶來的代價就是維護多個線程池會對系統帶來額外的性能開銷. 如果是對性能有嚴格要求而且確信自己調用服務的客戶端代碼不會出問題的話, 可以使用Hystrix的信號模式(Semaphores)來隔離資源.

4.配置HystrixCommand(詳細的可以在第三個博客了裡看或者跟源碼進去大量的配置在hystrix-core裡HystrixCommandProperties裡面)

hystrix.config.stream.maxConcurrentConnections=10hystrix.stream.bus.enabled=truehystrix.command.default.execution.timeout.enabled=truehystrix.command.default.execution.isolation.thread.interruptOnTimeout=true#hystrix.command.default.execution.isolation.strategy=SEMAPHOREhystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000#hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=500(此條)
#Thread配置hystrix.command.default.execution.isolation.strategy=THREAD#core數量(默認10)hystrix.threadpool.default.coreSize=50#啟用阻塞模式 hystrix.threadpool.default.maxQueueSize=-1#排隊隊列指標超過則拋出異常hystrix.threadpool.default.queueSizeRejectionThreshold=20#開啟短路數(默認20)hystrix.command.default.circuitBreaker.requestVolumeThreshold=20#回覆短路(默認5)hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5

其中在熔斷器中有兩種模式 一種是信號模式一種是線程模式 其中maxConcurrentRequests在信號模式下才能生效(個人業務場景不同 選擇不同)

至於原理及其他詳細配置以下幾篇文章給我很多幫助

https://my.oschina.net/yu120/blog/656199

http://hot66hot.iteye.com/admin/blogs/2155036

http://www.tuicool.com/articles/VVbuaeZ

謝謝幾位博主大大

網上大篇幅的介紹原理源碼 我就不班門弄斧了 介紹實現場景 只用一個簡單的註解即可解決

使用中 可以選擇feign

其中集成了很多spring cloud的插件

使用

@EnableHystrix

即可開啟熔斷@EnableFeignClients(basePackages = "com.provider.client")

掃描feign的發現服務端

@ComponentScan(basePackages = {"com.system.provider.fallback"})

此包可對所有的方法進行一個回調

@Componentpublic class xxxClientFallbackFactory implements FallbackFactory

自定義回調方法

@FeignClient(name = "我是服務名會註冊在註冊中心", fallbackFactory = xxxClientFallbackFactory.class, configuration = FeignClientConfiguration.class)

其中斷路器fallback回調可以以上面模式實現

最後一句 其實想完全走一遍 還是要跟進去看一遍源碼 看hystrix源碼時一定要去看rxjava 裡面很多觀察者模式 一層套一層一層 我是挺暈····


分享到:


相關文章: