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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值