轻拢慢捻,微服务熔断大总管
本文經授權轉載自微信公眾號:小姐姐味道
我這篇文章來的晚了些,因為hystrix已經進入維護模式。但已經有非常多的同學入坑了,那么本篇文章就是及時雨。本文將說明熔斷使用的一些注意事項,可能會細的讓你厭煩。
前半段,是理論部分,各種熔斷都適用。后半段,是參數部分,適合微調。
那我們開始。
通常來說,皇帝在微服務里想夜生活過得舒服,能夠大刀闊斧單刀直入,不因私事丟江山,就不得不靠熔斷大總管。
時過境遷。提到熔斷大總管就不得不說他手下最突出的三位公公:sentinel,或hystrix,也可能是resilience4j。
這三位都是解決一類問題的,如著名的雪崩:A→B→C互相依次調用,但C項目很可能出現問題(流量過大或者報錯等),引發線程一直進行等待,導致拖垮整個鏈路層,線程資源耗盡。
一、背景
假如是用的spring全家桶系列,在接口調用上大多會走這個路線。我們這里依然是在說hystrix,雖然現在不再受寵。
Feign —-→
具體如下圖所示:
二、配置
首先來點理論性的東西。好吃不貴。
Ⅰ隔離方式
線程隔離(默認):使用一個線程池來存儲當前的請求,線程池對請求作處理,設置任務返回處理超時時間,堆積的請求堆積入線程池隊列。這種方式需要為每個依賴的服務申請線程池,有一定的資源消耗,好處是可以應對突發流量(流量洪峰來臨時,處理不完可將數據存儲到線程池隊里慢慢處理)
信號隔離:使用一個原子計數器(或信號量)來記錄當前有多少個線程在運行,請求來先判斷計數器的數值,若超過設置的最大線程個數則丟棄改類型的新請求,若不超過則執行計數操作請求來計數器+1,請求返回計數器-1。這種方式是嚴格的控制線程且立即返回模式,無法應對突發流量(流量洪峰來臨時,處理的線程超過數量,其他的請求會直接返回,不繼續去請求依賴的服務)
Ⅱ熔斷
如果某個目標服務調用慢或者大量超時,則此時熔斷該服務的調用,對于后續調用請求,不再繼續調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉,則恢復調用。
這個過程,可以想象成保險絲的行為。
行為雖然簡單,但需要調節的參數卻非常多。
使用方式
1.引入依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>2.配置參數
feign:hystrix: #不配置或為false則不生效enabled: true hystrix:command:default:execution:isolation:thread: #若配置了重試則超時時間= (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeouttimeoutInMilliseconds: 60000threadpool:default:coreSize: 10maxQueueSize: 50queueSizeRejectionThreshold: 30keepAliveTimeMinutes: 33.配置fallback
因業務處理不同,建議每個feign client使用不同的fallback
到此,hystrix已經可以走馬上任,至于干活兒穩不穩那是后話。
4.配置的其他姿勢
hystrix到任務后,發現有的服務接口1s內就完事兒 ,還有的5s到10幾秒才堪堪返回。一刀切的配置已難以管理諸多服務&接口。
想必已經有人發現,之前配置中混進了奇怪的東西——default關鍵詞。這是對全局配置,那么對應的肯定有局部的配置。
如:對服務的,對某個接口的…
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 60000threadpool: #全局配置default:coreSize: 10maxQueueSize: 50queueSizeRejectionThreshold: 30keepAliveTimeMinutes: 3 #對某個服務配置,寫service-idbase-rpc:coreSize: 10maxQueueSize: 30queueSizeRejectionThreshold: 20keepAliveTimeMinutes: 3 #對某個接口配置BaseApiClient#searchItemSkuList(PosSkuSearch):coreSize: 10maxQueueSize: 40queueSizeRejectionThreshold: 30keepAliveTimeMinutes: 1另外,還可以使用@HystrixCommand注解進行配置。
5.配置的動態修改
很多情況下,不能修改個配置,特別是臨時修改配置就重啟下服務,能動態刷新就最好了。
archaius是Netflix公司開源項目之一,基于java的配置管理類庫,主要用于多配置存儲的動態獲取。
說了這么多那該怎么整呢?以下就是簡單的示例。
//撈配置 AbstractConfiguration config = ConfigurationManager.getConfigInstance();//提取關注的部分,比如hystrix.threadpool Iterable<String> iterable = () -> config.getKeys("hystrix.threadpool"); List<Property> result = StreamSupport.stream(iterable.spliterator(), false).map(t -> new Property(t, config.getString(t, ""))).sorted(Comparator.comparing(Property::getName)).collect(Collectors.toList());//修改配置 config.setProperty("hystrix.threadpool.base-rpc.coreSize", 20);//移除配置 config.clearProperty(hystrix.threadpool.base-rpc.coreSize");三、其他參數
要是覺得hystrix這么聽話,那就太小看它了。別忘了前面有feign,后面還有ribbon,再往后http client呢!一堆超時參數,當代的八門金鎖陣
1.feign超時
feign:hystrix:enabled: trueclient:config:default:connectTimeout: 5000readTimeout: 5000rpc-pos:connectTimeout: 5000readTimeout: 8000xx-rpc:connectTimeout: 5000readTimeout: 12000order-rpc:connectTimeout: 5000readTimeout: 8000feign是暴露給用戶使用的,Spring在處理這一塊的時候,會有意識地使用feign的超時時間來設置后面的ribbon 和http client組件。
2.ribbon超時
#全局配置 ribbon:ReadTimeout: 60000ConnectTimeout: 10000#false to only allow get method to retryOkToRetryOnAllOperations: true# Max number of next servers to retry (excluding the first server)MaxAutoRetriesNextServer: 2# Max number of retries on the same server (excluding the first try)MaxAutoRetries: 0# Interval to refresh the server list from the sourceServerListRefreshInterval: 5000retryableStatusCodes: 404,500 #服務配置 base-rpc:ribbon:ReadTimeout: 60000ConnectTimeout: 10000#false to only allow get method to retryOkToRetryOnAllOperations: true# Max number of next servers to retry (excluding the first server)MaxAutoRetriesNextServer: 2# Max number of retries on the same server (excluding the first try)MaxAutoRetries: 0# Interval to refresh the server list from the sourceServerListRefreshInterval: 5000retryableStatusCodes: 404,500當feign設置了超時時間,Ribbon會依據feign的設置同步。Ribbon的這個超時時間,用于指導真正調用接口時,設置真正實現者的超時時間。
httpclient超時
feign:hystrix:enabled: trueokhttp:enabled: truehttpclient:enabled: false //連接池最大連接數,默認200max-connections: 500 //每一個IP最大占用多少連接 默認 50max-connections-per-route: 50 //默認連接超時時間:2000毫秒connection-timeout: 8000 //連接池管理定時器執行頻率:默認 3000毫秒connection-timer-repeat: 6000 //連接池中存活時間,默認為5time-to-live: 5time-to-live-unit: minutes超時設置遵循的基本原則是:依賴方的超時配置覆蓋被依賴方的配置,而其配置覆蓋的形式,則是使用的Spring Boot 的 AutoConfiguration 機制實現的
如:若開啟feign.okhttp.enabled=true,則okhttp的超時時間是feign.httpclient.connectionTimeout的值,默認2000毫秒
總結:超時——還是 ?feign ?說了算!
四、hystrix dashboard
能夠將這些狀態可視化,是非常棒的,需要引入一個jar包。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency>下面這張圖,就是針對后臺監控的一些解釋。
(圖片來自網絡)
附:配置參數說明
一、Command Properties
以下屬性控制HystrixCommand,前綴hystrix.command.default
1、Execution
以下屬性控制HystrixCommand.run()如何執行。
2、Fallback
以下屬性控制HystrixCommand.getFallback()如何執行。這些屬性適用于ExecutionIsolationStrategy.THREAD和ExecutionIsolationStrategy.SEMAPHORE。
3、Circuit Breaker
斷路器屬性控制HystrixCircuitBreaker。
4、Metrics
以下屬性與從HystrixCommand和HystrixObservableCommand執行捕獲指標有關。
5、Request Context
這些屬性涉及HystrixCommand使用的HystrixRequestContext功能
二、Command Properties
下列屬性控制HystrixCollapser行為。前綴:hystrix.collapser.default
三、ThreadPool Properties
以下屬性控制Hystrix命令在其上執行的線程池的行為。
End
這貨,說不更新,還真不更新了。但我們的遺留系統,有很多模塊在用著,所以我還是把它的細節參數給摳出來了。這應該是絕版吧,因為hystrix是絕更了。
本文只適合收藏,不適合分享。分享出去,會等于拿著大喇叭告訴別人,你正在給某個遺留系統填坑呢。
在 GitHub 更新中,歡迎關注,歡迎star。
直面Java第262期:volatile是如何解決有序性問題的?
深入并發第009期:到底什么是Java內存模型?
- MORE | 更多精彩文章 -
如果你喜歡本文,
請長按二維碼,關注?Hollis.
轉發至朋友圈,是對我最大的支持。
好文章,我在看
總結
以上是生活随笔為你收集整理的轻拢慢捻,微服务熔断大总管的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s之informer简单理解
- 下一篇: Golang之pprof使用