文章目录
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 #更换实例的次数