记 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秒 或者自定义 等
如果大家有更好的方法,请不吝指教,谢谢