Feign、Ribbon、Hystrix超时时间分析与配置

前置说明

关于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的配置

主要功能
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

image.png

关于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,使支持类名配置
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容