隔离模式
信号量
Zuul默认是使用信号量隔离,并且信号量默认大小是100,请求的并发线程超过100就会报错。如果要改变大小用以下配置参数
zuul:
semaphore:
max-semaphores: 200
zuul里信号量隔离是按照服务隔离,也就是一个服务一个信号量,非接口级别的
指定服务的信号隔离级别大小:
zuul:
eureka:
serviceId:
semaphore:
maxSemaphores: 20
线程池
如果要使用线程池的隔离模式,要使用以下配置
zuul:
ribbonIsolationStrategy: THREAD
hystrix:
threadpool:
default:
# 核心线程数
coreSize: 200
# 最大线程数
maximumSize: 600
# 是否允许设置为最大线程数生效
allowMaximumSizeToDivergeFromCoreSize: true
注意
hystrix常规的隔离模式设置,如下
hystrix:
command:
default:
execution:
isolation:
strategy: THREAD
这种在zuul中设置是不生效的,如果把default换成路由的具体服务名
是可以的,如下
hystrix:
command:
test-service:
execution:
isolation:
strategy: THREAD
默认情况下,所有服务是公用一个线程池的。当 zuul.ribbonIsolationStrategy=THREAD
时,Hystrix的线程隔离策略将会作用于所有路由。此时,HystrixThreadPoolKey 默认为 RibbonCommand
这意味着,所有路由的HystrixCommand都会在相同的Hystrix线程池中执行
需要开启每个服务分别有自己的线程池需要配置如下:
zuul:
threadPool:
useSeparateThreadPools: true
使用如上配置后,默认的HystrixThreadPoolkey 将与每个路由的服务标识相同。这时就可以按照服务维度来配置线程池了。如下:
hystrix:
threadpool:
# 服务名
test-service:
# 核心线程数
coreSize: 200
# 最大线程数
maximumSize: 600
# 是否允许设置为最大线程数生效
allowMaximumSizeToDivergeFromCoreSize: true
如果你想HystrixThreadPoolKey 添加前缀,可使用类似如下的配置:
zuul:
threadPool:
useSeparateThreadPools: true
threadPoolKeyPrefix: zuulgw
使用信号量或者线程池的隔离模式,hystrix的超时时间都是生效的,如下
hystrix:
command:
# default全局有效,service id指定应用有效
default:
execution:
timeout:
enabled: true
isolation:
thread:
#熔断超时时间,默认1000ms
timeoutInMilliseconds: 200000