記 spring cloud gateway Hystrix 調優?
spring cloud gateway : 2.1.2
使用
根據官方配置,通過下面的方式就能添加 Hystrix
添加到 default-filters 所有的路由都可以使用到
spring.cloud.gateway.default-filters:
- name: Hystrix
args:
name: globalcmd
fallbackUri: forward:/errorFallback
分析
這裏有一個隱患,也就是所有,所有的 路由 都會共享一個 Hystrix 池(globalcmd)。
A服務出錯短路,導致B服務也訪問不了,這肯定不科學
希望服務之間能隔離,不要相互影響,也就是應該有獨立線程池( A_cmd,B_cmd,... 等)
通過查看源碼,也無法通過繼承重寫比較優雅的方式實現隔離(也就是每個服務獨立聲明cmd)
如果願意手動配置服務的路由另說,但是這種方式放棄了註冊中心幫我們自動創建的路由,感覺不是很優雅,遂放棄。
解決
通過服務發現配置實現隔離
經過資料查找,發現服務的配置支持sple,可以達到我們的需求
配置如下:
spring.cloud.gateway.discovery.locator.filters:
- name: Hystrix
args:
name: serviceId+'_globalcmd'
fallbackUri: "'forward:/errorFallback'"
請注意與 default-filters 的區別,default-filters 是所有的路由
這裏只是服務發現(註冊中心)的路由
結束語
這種方式 Hystrix 的配置都是統一配置了,如下:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
semaphore:
maxConcurrentRequests: 500
比如 A服務6秒超時,B服務3秒超時 等 更定製化的需求就沒法滿足(願意手動配就當我沒說)
目前我的做法是,通過調整部署架構達到,比如 A網關 6秒,B網關3秒 或者自定義 等
如果大家有更好的方法,請不吝指教,謝謝