8.9.9-hystrix&ribbon超时与线程池配置

1. hystrix、ribbon超时、重试配置

准备工作:
feign调用的接口,sleep10秒返回数据
springboot2

1.1. 要开启feign.hystrix.enabled

先要开启feign.hystrix.enabled,否则hystrix.command下面的配置是不生效的。

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 5000

ribbon:
#  http:
#    client:
#      enabled: true
  ReadTimeout: 12000

上面的配置,hystrix会先超时。

打开了hystrix开关,默认hystrix.command.default.execution.timeout.enabled = true

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 打开了hystrix开关,下面的配置默认就是true,所以可以不写。
#        timeout:
#          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 5000

ribbon:
#  http:
#    client:
#      enabled: true
  ReadTimeout: 12000

如果关闭hystrix的timeout:

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 关闭hystrix的timeout
        timeout:
          enabled: false
        isolation:
          thread:
            timeoutInMilliseconds: 5000

ribbon:
#  http:
#    client:
#      enabled: true
  ReadTimeout: 12000

那就是hystrix不生效,以ribbon配置为准。

1.2. ribbon超时时间 < hystrix超时时间

很有意思,配置ribbon 5s超时,hystrix 11s超时,结果:还是要等到10s之后才能拿到结果

问题来了,为什么是10s?为什么要等10s?理论上不是应该5s就超时了吗?

观察到服务提供者,有4次被调用,所以问题原因是出在ribbon有重试机制,默认是4次,而且我们的计算(end-start)/1000是整数运算,所以有精度问题。结果可能输出是10或11s。

所以,下面就是关闭重试,并且调小ribbon的超时时间,看看超时报错情况。

1.3. 设置ribbon超时重试次数为0,并且ReadTimeout=1500。

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
#        timeout:
#          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 11000

ribbon:
# 这个默认配置也是打开的
#  http:
#    client:
#      enabled: true
  ReadTimeout: 1500
  MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
  MaxAutoRetriesNextServer: 0  #更换实例的次数

此例,日志报错是:(看起来是hystrix fallback due to: Read timed out,但是,还有一个现象,为什么是2.25s左右之后报错呢?我们配置的是ribbon1.5s超时…)

2022-09-22 14:09:10.044 DEBUG 6000 --- [feign-service-5] feign.hystrix.FallbackFactory$Default    : fallback due to: Read timed out executing GET http://feign-service/instance/feign-service

feign.RetryableException: Read timed out executing GET http://feign-service/instance/feign-service
	at feign.FeignException.errorExecuting(FeignException.java:67) ~[feign-core-9.5.1.jar:na]
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:104) ~[feign-core-9.5.1.jar:na]
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-9.5.1.jar:na]
	at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108) ~[feign-hystrix-9.5.1.jar:na]
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302) ~[hystrix-core-1.5.12.jar:1.5.12]
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298) ~[hystrix-core-1.5.12.jar:1.5.12]
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.Observable.unsafeSubscribe(Observable.java:10151) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) [rxjava-1.2.0.jar:1.2.0]
	at rx.Observable.unsafeSubscribe(Observable.java:10151) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.Observable.unsafeSubscribe(Observable.java:10151) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) [rxjava-1.2.0.jar:1.2.0]
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56) [hystrix-core-1.5.12.jar:1.5.12]
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47) [hystrix-core-1.5.12.jar:1.5.12]
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69) [hystrix-core-1.5.12.jar:1.5.12]
	at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) [rxjava-1.2.0.jar:1.2.0]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191]
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_191]
	at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_191]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_191]
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_191]
	at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_191]
	at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_191]
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) ~[na:1.8.0_191]
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) ~[na:1.8.0_191]
	at java.io.BufferedInputStream.read(BufferedInputStream.java:345) ~[na:1.8.0_191]
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735) ~[na:1.8.0_191]
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) ~[na:1.8.0_191]
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587) ~[na:1.8.0_191]
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) ~[na:1.8.0_191]
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) ~[na:1.8.0_191]
	at feign.Client$Default.convertResponse(Client.java:152) ~[feign-core-9.5.1.jar:na]
	at feign.Client$Default.execute(Client.java:74) ~[feign-core-9.5.1.jar:na]
	at org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.execute(FeignLoadBalancer.java:89) ~[spring-cloud-openfeign-core-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.execute(FeignLoadBalancer.java:55) ~[spring-cloud-openfeign-core-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at com.netflix.client.AbstractLoadBalancerAwareClient$1.call(AbstractLoadBalancerAwareClient.java:104) ~[ribbon-loadbalancer-2.2.5.jar:2.2.5]
	at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:303) ~[ribbon-loadbalancer-2.2.5.jar:2.2.5]
	at com.netflix.loadbalancer.reactive.LoadBalancerCommand$3$1.call(LoadBalancerCommand.java:287) ~[ribbon-loadbalancer-2.2.5.jar:2.2.5]
	at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:231) ~[rxjava-1.2.0.jar:1.2.0]
	at rx.internal.util.ScalarSynchronousObservable$3.call(ScalarSynchronousObservable.java:228) ~[rxjava-1.2.0.jar:1.2.0]
	at rx.Observable.unsafeSubscribe(Observable.java:10151) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.drain(OnSubscribeConcatMap.java:286) ~[rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.onNext(OnSubscribeConcatMap.java:144) ~[rxjava-1.2.0.jar:1.2.0]
	at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:185) ~[ribbon-loadbalancer-2.2.5.jar:2.2.5]
	at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.2.5.jar:2.2.5]
	at rx.Observable.unsafeSubscribe(Observable.java:10151) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94) ~[rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42) ~[rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.2.0.jar:1.2.0]
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.2.0.jar:1.2.0]
	at rx.Observable.subscribe(Observable.java:10247) [rxjava-1.2.0.jar:1.2.0]
	at rx.Observable.subscribe(Observable.java:10214) [rxjava-1.2.0.jar:1.2.0]
	at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:444) ~[rxjava-1.2.0.jar:1.2.0]
	at rx.observables.BlockingObservable.single(BlockingObservable.java:341) ~[rxjava-1.2.0.jar:1.2.0]
	at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112) ~[ribbon-loadbalancer-2.2.5.jar:2.2.5]
	at org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:63) ~[spring-cloud-openfeign-core-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:97) ~[feign-core-9.5.1.jar:na]
	... 32 common frames omitted

2022-09-22 14:09:10.045  INFO 6000 --- [feign-service-5] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
2022-09-22 14:09:10.047  INFO 6000 --- [ taskExecutor-3] c.x.c.h.controller.InstanceController    : 耗时【2.256】秒完成了第【2】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
2022-09-22 14:09:10.048  INFO 6000 --- [ taskExecutor-2] c.x.c.h.controller.InstanceController    : 耗时【2.257】秒完成了第【1】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
2022-09-22 14:09:10.047  INFO 6000 --- [ taskExecutor-1] c.x.c.h.controller.InstanceController    : 耗时【2.257】秒完成了第【0】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
2022-09-22 14:09:10.048  INFO 6000 --- [ taskExecutor-5] c.x.c.h.controller.InstanceController    : 耗时【2.257】秒完成了第【4】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
2022-09-22 14:09:10.049  INFO 6000 --- [ taskExecutor-4] c.x.c.h.controller.InstanceController    : 耗时【2.258】秒完成了第【3】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0

再执行一次,又变成了1.5s左右超时:(所以,这可能是第一次惩罚?尝试启动后多执行几次,然后再尝试重新启动后调用,分别看执行情况。)

多次运行后发现的确是第一次调用的时候,时间长。非第一次调用,都为1.5s超时。

1.4. 只配置hystrix超时时间,不配置ribbon超时间

再尝试,如果只配置hystrix超时时间,不配置ribbon超时间的话,会怎么样:

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
#        timeout:
#          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 11000

ribbon:
# 这个默认配置也是打开的
#  http:
#    client:
#      enabled: true
#  ReadTimeout: 1500
  MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
  MaxAutoRetriesNextServer: 0  #更换实例的次数

结论:1s后超时。ribbon默认1s超时。所以ribbon的超时是一定要配置的。

1.5. 不配置hystrix超时间,ribbon超时配置的足够大

不配置hystrix超时间,ribbon超时配置的足够大的时候,默认hystrix是1s超时

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
        timeout:
          enabled: true
#        isolation:
#          thread:
#            timeoutInMilliseconds: 11000

ribbon:
# 这个默认配置也是打开的
#  http:
#    client:
#      enabled: true
  ReadTimeout: 30000
  # 关于重试的,一定要配置,不然会重试并影响最终的响应时间。
  MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
  MaxAutoRetriesNextServer: 0  #更换实例的次数

所以,又有结论:hystrix和ribbon,默认都是1s超时,都配置时,以小的为准进行超时控制。

最后总结一下配置:

# feign集成的hystrix开关要打开,否则下面的hystrix相关的配置都不会生效,hystrix也不会起作用。
feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
#        timeout:
#          enabled: true
				# hystrix的超时时间,不配置的话默认1s超时
        isolation:
          thread:
            timeoutInMilliseconds: 11000

ribbon:
# 这个默认配置也是打开的
#  http:
#    client:
#      enabled: true
	# ribbon的读超时时间,不配置的话默认1s超时。当hystrix和ribbon都配置的时候,超时时间以谁小为准。
  ReadTimeout: 30000
  # 关于重试的,一定要配置,不然会重试并影响最终的响应时间(默认重试4次)
  MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
  MaxAutoRetriesNextServer: 0  #更换实例的次数

2. hystrix线程池

2.1. 当没有指定hystrix线程池情况,看看发送9和11个请求会怎么样。

服务端会sleep 10s

配置hystrix 20s超时

配置ribbon 20s超时

	# feign集成的hystrix开关要打开,否则下面的hystrix相关的配置都不会生效,hystrix也不会起作用。
feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
        #        timeout:
        #          enabled: true
        # hystrix的超时时间,不配置的话默认1s超时
        isolation:
          thread:
            timeoutInMilliseconds: 20000

ribbon:
  # 这个默认配置也是打开的
  #  http:
  #    client:
  #      enabled: true
  # ribbon的读超时时间,不配置的话默认1s超时。当hystrix和ribbon都配置的时候,超时时间以谁小为准。
  ReadTimeout: 20000
  # 关于重试的,一定要配置,不然会重试并影响最终的响应时间(默认重试4次)
  MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
  MaxAutoRetriesNextServer: 0  #更换实例的次数
  • 同时发送9个请求,都拿到了正确的结果:

  • 再看同时发送11个请求

可见,第11个请求直接熔断了。所以可以推测,hystrix线程池默认是10个。那怎么修改hystrix线程池大小呢?

2.2. 设置hystrix线程池大小

# feign集成的hystrix开关要打开,否则下面的hystrix相关的配置都不会生效,hystrix也不会起作用。
feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
        #        timeout:
        #          enabled: true
        # hystrix的超时时间,不配置的话默认1s超时
        isolation:
          thread:
            timeoutInMilliseconds: 20000
  # 线程池
  threadpool:
    default:
      #默认为10,基本得原则时保持线程池尽可能小,他主要是为了释放压力,防止资源被阻塞
      coreSize: 11
      #BlockingQueue的最大队列数,默认值-1
      maxQueueSize: 5
      #动态控制线程池队列的上限,即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求会被拒绝,默认值5
      queueSizeRejectionThreshold: 3

ribbon:
  # 这个默认配置也是打开的
  #  http:
  #    client:
  #      enabled: true
  # ribbon的读超时时间,不配置的话默认1s超时。当hystrix和ribbon都配置的时候,超时时间以谁小为准。
  ReadTimeout: 20000
  # 关于重试的,一定要配置,不然会重试并影响最终的响应时间(默认重试4次)
  MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
  MaxAutoRetriesNextServer: 0  #更换实例的次数

按照上面的配置,测试发送11个线程:

11个线程都正常处理了,后面要测试一些边界值。

  • 同样的配置,15个呢?

11个线程直接运行,3个在队列,1个直接拒绝。

  • 不配置queueSizeRejectionThreshold,20个线程同时运行

    # feign集成的hystrix开关要打开,否则下面的hystrix相关的配置都不会生效,hystrix也不会起作用。
    feign:
      hystrix:
        enabled: true
    
    hystrix:
      command:
        default:
          execution:
            # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
            #        timeout:
            #          enabled: true
            # hystrix的超时时间,不配置的话默认1s超时
            isolation:
              thread:
                timeoutInMilliseconds: 20000
      # 线程池
      threadpool:
        default:
          #默认为10,基本得原则时保持线程池尽可能小,他主要是为了释放压力,防止资源被阻塞
          coreSize: 11
          #BlockingQueue的最大队列数,默认值-1
          maxQueueSize: 6
          #动态控制线程池队列的上限,即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求会被拒绝,默认值5
    #      queueSizeRejectionThreshold: 3
    
    ribbon:
      # 这个默认配置也是打开的
      #  http:
      #    client:
      #      enabled: true
      # ribbon的读超时时间,不配置的话默认1s超时。当hystrix和ribbon都配置的时候,超时时间以谁小为准。
      ReadTimeout: 20000
      # 关于重试的,一定要配置,不然会重试并影响最终的响应时间(默认重试4次)
      MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
      MaxAutoRetriesNextServer: 0  #更换实例的次数
    

    11个直接运行(coreSize),5个在队列等待执行(queueSizeRejectionThreshold默认5),4个直接拒绝(20-coreSize-queueSizeRejectionThreshold默认值=4)。

    但是这也有例外,当重新启动项目,第一次直接运行20个线程:3个直接拒绝,11个直接运行,6个在队列后续执行:

    2022-09-22 15:14:29.413  INFO 7299 --- [nio-8876-exec-1] c.x.c.h.controller.InstanceController    : Get Instance by serviceId feign-service
    2022-09-22 15:14:29.567  INFO 7299 --- [taskExecutor-17] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:29.567  INFO 7299 --- [taskExecutor-16] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:29.568  INFO 7299 --- [taskExecutor-11] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:29.571  INFO 7299 --- [taskExecutor-17] c.x.c.h.controller.InstanceController    : 耗时【0.154】秒完成了第【16】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:29.572  INFO 7299 --- [taskExecutor-16] c.x.c.h.controller.InstanceController    : 耗时【0.155】秒完成了第【15】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:29.572  INFO 7299 --- [taskExecutor-11] c.x.c.h.controller.InstanceController    : 耗时【0.156】秒完成了第【10】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:29.577  INFO 7299 --- [feign-service-7] s.c.a.AnnotationConfigApplicationContext : Refreshing SpringClientFactory-feign-service: startup date [Thu Sep 22 15:14:29 CST 2022]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4943defe
    2022-09-22 15:14:29.615  INFO 7299 --- [feign-service-7] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
    2022-09-22 15:14:29.838  INFO 7299 --- [feign-service-7] c.netflix.config.ChainedDynamicProperty  : Flipping property: feign-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
    2022-09-22 15:14:29.856  INFO 7299 --- [feign-service-7] c.n.u.concurrent.ShutdownEnabledTimer    : Shutdown hook installed for: NFLoadBalancer-PingTimer-feign-service
    2022-09-22 15:14:29.878  INFO 7299 --- [feign-service-7] c.netflix.loadbalancer.BaseLoadBalancer  : Client: feign-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=feign-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
    2022-09-22 15:14:29.882  INFO 7299 --- [feign-service-7] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
    2022-09-22 15:14:29.905  INFO 7299 --- [feign-service-7] c.netflix.config.ChainedDynamicProperty  : Flipping property: feign-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
    2022-09-22 15:14:29.906  INFO 7299 --- [feign-service-7] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client feign-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=feign-service,current list of Servers=[localhost:8760],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
    },Server stats: [[Server:localhost:8760;	Zone:defaultZone;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
    ]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@110059f1
    2022-09-22 15:14:30.887  INFO 7299 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: feign-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
    2022-09-22 15:14:40.009  INFO 7299 --- [taskExecutor-20] c.x.c.h.controller.InstanceController    : 耗时【10.591】秒完成了第【19】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.009  INFO 7299 --- [ taskExecutor-2] c.x.c.h.controller.InstanceController    : 耗时【10.594】秒完成了第【1】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.010  INFO 7299 --- [taskExecutor-10] c.x.c.h.controller.InstanceController    : 耗时【10.594】秒完成了第【9】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.010  INFO 7299 --- [ taskExecutor-1] c.x.c.h.controller.InstanceController    : 耗时【10.595】秒完成了第【0】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.010  INFO 7299 --- [taskExecutor-13] c.x.c.h.controller.InstanceController    : 耗时【10.593】秒完成了第【12】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.010  INFO 7299 --- [taskExecutor-14] c.x.c.h.controller.InstanceController    : 耗时【10.593】秒完成了第【13】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.011  INFO 7299 --- [taskExecutor-12] c.x.c.h.controller.InstanceController    : 耗时【10.594】秒完成了第【11】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.011  INFO 7299 --- [taskExecutor-19] c.x.c.h.controller.InstanceController    : 耗时【10.593】秒完成了第【18】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.011  INFO 7299 --- [ taskExecutor-9] c.x.c.h.controller.InstanceController    : 耗时【10.594】秒完成了第【8】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.012  INFO 7299 --- [taskExecutor-18] c.x.c.h.controller.InstanceController    : 耗时【10.594】秒完成了第【17】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:40.015  INFO 7299 --- [ taskExecutor-7] c.x.c.h.controller.InstanceController    : 耗时【10.599】秒完成了第【6】个线程请求,获取到结果Instance serviceId is feign-service, host is localhost, port is 8080
    2022-09-22 15:14:49.558  INFO 7299 --- [ HystrixTimer-4] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:49.558  INFO 7299 --- [ HystrixTimer-1] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:49.558  INFO 7299 --- [ HystrixTimer-3] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:49.558  INFO 7299 --- [ HystrixTimer-2] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:49.558  INFO 7299 --- [ taskExecutor-4] c.x.c.h.controller.InstanceController    : 耗时【20.143】秒完成了第【3】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:49.558  INFO 7299 --- [ taskExecutor-6] c.x.c.h.controller.InstanceController    : 耗时【20.142】秒完成了第【5】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:49.559  INFO 7299 --- [ HystrixTimer-4] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:49.559  INFO 7299 --- [ taskExecutor-5] c.x.c.h.controller.InstanceController    : 耗时【20.144】秒完成了第【4】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:49.559  INFO 7299 --- [ HystrixTimer-3] c.x.c.h.c.f.InstanceClientFallBack       : Can not get Instance by serviceId feign-service
    2022-09-22 15:14:49.559  INFO 7299 --- [ taskExecutor-3] c.x.c.h.controller.InstanceController    : 耗时【20.144】秒完成了第【2】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:49.559  INFO 7299 --- [ taskExecutor-8] c.x.c.h.controller.InstanceController    : 耗时【20.143】秒完成了第【7】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    2022-09-22 15:14:49.561  INFO 7299 --- [taskExecutor-15] c.x.c.h.controller.InstanceController    : 耗时【20.144】秒完成了第【14】个线程请求,获取到结果Instance serviceId is error, host is error, port is 0
    
    

    紧接着再次执行,就会有很多意外:这个原因是hystrix的半开机制有关。等待一段时间后,再次执行,就会正常,11正常执行、4个直接拒绝、5个在队列。

    最后的配置,如下:

    # feign集成的hystrix开关要打开,否则下面的hystrix相关的配置都不会生效,hystrix也不会起作用。
    feign:
      hystrix:
        enabled: true
    
    hystrix:
      command:
        default:
          execution:
            # 先要开启feign.hystrix.enabled,然后下面这个配置才会起作用(而且默认是true,所以,这里就可以不用配置了)
            #        timeout:
            #          enabled: true
            # hystrix的超时时间,不配置的话默认1s超时
            isolation:
              thread:
                timeoutInMilliseconds: 20000
      # 线程池(如果不想出意外,coreSize尽量在合理情况下大一些,queueSizeRejectionThreshold一定要配置,maxQueueSize要尽量在合理情况下大一些
      # 否则,hystrix熔断,会影响请求。)
      threadpool:
        default:
          #默认为10,基本得原则时保持线程池尽可能小,他主要是为了释放压力,防止资源被阻塞
          coreSize: 50
          #BlockingQueue的最大队列数,默认值-1
          maxQueueSize: 100
    #      动态控制线程池队列的上限,即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求会被拒绝,默认值5!!!
          queueSizeRejectionThreshold: 100
    
    ribbon:
      # 这个默认配置也是打开的
      #  http:
      #    client:
      #      enabled: true
      # ribbon的读超时时间,不配置的话默认1s超时。当hystrix和ribbon都配置的时候,超时时间以谁小为准。
      ReadTimeout: 20000
      # 关于重试的,一定要配置,不然会重试并影响最终的响应时间(默认重试4次)
      MaxAutoRetries: 0   #当前实例重试的次数,失败之后更换下个实例
      MaxAutoRetriesNextServer: 0  #更换实例的次数
    
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值