前置说明
关于springcloud体系下的超时相关的配置主要有下面的,最初接触时瞬间感觉有点凌乱
ribbon:
ReadTimeout: 10000 #单位ms,请求处理的超时时间
ConnectTimeout: 200 #单位ms,请求连接超时时间
feign:
hystrix:
enabled: true
client:
config:
default:
connect-timeout: 200 #连接超时时间
read-timeout: 10000
hystrix:
threadpool:
default:
#设置feign的核心线程池的数量
coreSize: 200
command:
default:
execution:
isolation:
thread:
#断路器超时设置和请求的超时
timeoutInMilliseconds: 12000
isolation:
semaphore:
#设置回退的最大线程数
maxConcurrentRequests: 10
ribbon,feign和hystrix说明
- 先看ribbon和feign的区别
Ribbon
Ribbon就是一种客户端负载均衡的实现,它是有Netflix发布的一个基于HTTP和TCP的客户端负载均衡工具。
服务消费者继承Ribbon后,只需要配置服务提供者地址,Ribbon就可以基于指定的负载均衡算法,自动帮服务消费者分配请求。
Ribbon提供了很多常见的负载均衡算法,入轮询、随机、权重等。
作为Spring Cloud体系中的一员,Ribbon可以和Eureka方便地集合使用,可以直接从Eureka Server中获取所有服务提供者的节点地址,
然后根据指定的负载均衡策略选择某个节点进行访问。
Feign
Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。
采用接口的方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方法即可, 不需要自己构建http请求。
SpringCloud对Feign进⾏了增强,使Feign⽀持了SpringMVC注解(OpenFeign)
简单总结下:
ribbon 是用来负载均衡的
feign 是基于ribbon的封装,主要作用是让接口的调用更加优雅(接口+注解)
因此可以这样理解: feign的很多配置其实也是对ribbon的配置
- hystrix说明
具体说明和使用可以参考: https://www.cnblogs.com/xfeiyun/p/16221024.html
主要功能
1、服务降级
服务器繁忙,让客户稍后在试兜底的方法,另外的解决方案、哪些原因走兜底的方法呢?
1超时,2程序异常,3熔断触发降级,线程池太高
2、服务熔断
类比保险丝,
达到最大服务访问后,直接拒绝访问,拉闸断电。
3、服务限流
秒杀高并发等操作,严禁一群蜂拥过来,大家排队。有序进行
- ribbon,feign和hystrix时间相关说明
可以简单理解为:
hystrix对应的是断路器的时间
feign/ribbon对应的是请求的时间
ribbon,feign和hystrix配置说明
关于ribbon和Feign默认超时时间,查了资料,网上主要有2个版本
- ribbon和Feign默认超时时间都是1s
- ribbon和Feign默认的connectTimeout时长是10s,readTimeout时长是60s
经过实际测试,无任何配置的情况下,1s后就超时了
源码分析过程可以参考 https://blog.csdn.net/u011523825/article/details/120819416
关于ribbon和Feign超时时间配置说明
- Feign 和 Ribbon 的超时时间只会有一个生效
- 当我们没有显式配饰feign的超时时间的是时候,如果配置了ribbon的超时时间,则只有这个配置会生效,feign默认的1s超时无效
- 如果我们feign和ribbon的超时时间都配置了,会以feign配置的为准
关于hystrix默认超时时间与配置说明
如果配置了hystrix功能,那么它的超时时间默认就是开启的,且该时间是1秒,这个时间和ribbon的超时时间会同时起作用,不像上面的feign的超时时间和ribbon超时时间二选一,我们可以通过上面的配置hystrix的超时时间让它更长,或者显式禁用hystrix的超时时间:
hystrix:
command:
default:
execution:
timeout:
#这里表示禁用hystrix的超时时间限制
enabled: false
时间配置规则案例分析
- 这里分开启/不开启hystrix情况分别分析,开启方式
feign:
hystrix:
enabled: true
- 没有开启hystrix情况
看下下面的配置案例
// 下面的配置,read-timeout是5秒
feign:
client:
config:
default:
connect-timeout: 200 #连接超时时间
read-timeout: 5000
// 下面的配置,read-timeout也是5秒(feign-5秒,ribbon-8秒)
feign:
client:
config:
default:
connect-timeout: 200 #连接超时时间
read-timeout: 5000
ribbon:
ReadTimeout: 10000 #单位ms,请求处理的超时时间
ConnectTimeout: 8000 #单位ms,请求连接超时时间
- 开启hystrix情况
看下下面的配置案例
// 下面超时时间是5秒(feign-5秒,ribbon-8秒,hystrix-12秒)
feign:
hystrix:
enabled: true
client:
config:
default:
connect-timeout: 200 #连接超时时间
read-timeout: 5000
ribbon:
ReadTimeout: 8000 #单位ms,请求处理的超时时间
ConnectTimeout: 200 #单位ms,请求连接超时时间
hystrix:
threadpool:
default:
#设置feign的核心线程池的数量
coreSize: 200
command:
default:
execution:
isolation:
thread:
#断路器超时设置和请求的超时
timeoutInMilliseconds: 12000
isolation:
semaphore:
#设置回退的最大线程数
maxConcurrentRequests: 10
日志
19:30:08.146 [http-nio-8273-exec-5] [587c47b639050fc3,587c47b639050fc3] INFO OrderTestController.testTimeOut[21]- timeout test start
19:30:13.165 [hystrix-JIU-USER-2] [587c47b639050fc3,faf7c02d6b08ad0c] INFO UserFeign$UserFeignFallBackFactory.testTimeOut[29]- testTimeOut fallback
feign、ribbon、hystrix设置单个接口的超时时间
上面的配置主要是针对全局的配置,另外,我们也可以针对方法级别做配置,可以参考
https://blog.csdn.net/qq_35388010/article/details/125448911
单接口配置说明
- feign设置单个接口超时:通过指定的contextId
- ribbon不能指定单个接口超时时间,可以用feign配置单个接口超时,feign和ribbon配置超时同时存在时,feign的配置生效。要实现ribbon的单个接口超时,需要重写ribbon源码。
- Hystrix默认支持:全局(default )或 方法级(类名#方法名(参数类型) )配置。类名#方法名(参数类型) 的方式配置不够方便,可重写feign.hystrix.SetterFactory,自定义CommandKey,使支持类名配置