zuul集成hystrix的细节踩坑

隔离模式

信号量

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

你可能感兴趣的:(hystrix,hystrix)