hystrix ,feign,ribbon的超时时间配置,以及原理分析
背景,网上看到很多关于hystrix的配置都是没生效的,如:
一.先看测试环境搭建:
order 服务通过feign 的方式调用了product 服务的getProductInfo 接口
- //------------ order 服务的调用接口---------------
- @FeignClient(name ="product",fallback =ProductHystrix.class)
- @Primary
- public interface ProductService {
- @RequestMapping("/info/{id}")
- Product getProductInfo(@PathVariable("id") Integer id);
- }
- @Component
- public class ProductHystrix implements ProductService{
- @Override
- public Product getProductInfo(Integer id) {
- System.out.println("被熔断;了");
- Product product = new Product();
- product.setName("熔断了。。。。。");
- return product;
- }
- }
- // product 服务提供的接口------------------
- @Controller
- public class ProductController {
- @RequestMapping("/info/{id}")
- @ResponseBody
- @MyLogAnnotation
- public Product getProductInfo(@PathVariable("id") Integer id){
- Product product = new Product();
- product.setId(id);
- product.setName("苹果手机");
- return product;
- }
- }
order 服务的application.yml 开启feign:hystrix:enabled: true
二. Hystrix 的超时时间怎么设置:
直接上代码:hystrix 任何相关配置都可以在下面的配置类配置,我这里修改了核心线程数和最大队列数已经超时时间
- package com.yang.xiao.hui.order.controller;
- import com.netflix.hystrix.*;
- import feign.Feign;
- import feign.Target;
- import feign.hystrix.HystrixFeign;
- import feign.hystrix.SetterFactory;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Scope;
- import java.lang.reflect.Method;
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })
- public class FeignConfig {
- @Bean
- @Scope("prototype")
- @ConditionalOnProperty(name = "feign.hystrix.enabled")
- public Feign.Builder feignHystrixBuilder() {
- HystrixFeign.Builder builder = HystrixFeign.builder();
- SetterFactory setterFactory= new SetterFactory(){
- @Override
- public HystrixCommand.Setter create(Target<?> target, Method method) {
- String groupKey = target.name();
- String commandKey = Feign.configKey(target.type(), method);
- //HystrixThreadPoolProperties 线程池相关配置
- HystrixThreadPoolProperties.Setter setter = HystrixThreadPoolProperties.Setter().withCoreSize(100).withMaxQueueSize(200);
- //HystrixCommandProperties 熔断器相关属性配置
- HystrixCommandProperties.Setter setter1 = HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(6000);
- return HystrixCommand.Setter
- .withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey))
- .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey))
- .andThreadPoolPropertiesDefaults(setter)
- .andCommandPropertiesDefaults(setter1);
- }
- };
- builder.setterFactory(setterFactory);
- return builder;
- }
- }
启动服务:通过浏览器输入http://localhost:8674/info/3 调用order 服务
跟进去看HystrixCommand的创建:
由此可见线程池和熔断超时时间都已经改变了,证明我们的配置生效了
原理分析:
在FeignClientsConfiguration这个配置类中有一段代码:
然后跟进看到默认的对象:
HystrixCommandProperties对象有个默认的超时时间,默认是1s:
那么,我们根据上面的分析,当容器中存在HystrixFeign.builder就不会再创建该bean 了,所以我们可以自己创建一个HystrixFeign.builder 然后调用setterFactory(SetterFactory setterFactory)来修改默认的配置,也就是上面我们自己定义的配置类
熔断器的熔断时间是从调用下面的方法开始计算的:
三.feign超时时间怎么设置?
我们继续跟进刚才的调用方法:
在这里默认连接时间是10s,读取时间是60s,那么这个类是怎么创建的呢?
从上面可以知道,Options对象默认已经有个时间配置了,然而我们继续跟踪代码:
我们看这里:
Options对象经过getClientConfig(options, clientName) 方法,就从10s的连接时间变成了1s,60s的读取时间也变成了1s,上面源码分析可以知道:
如果我们配置了feign的超时时间,那么就会以我们配置的时间为准,如果没有配置,那么就取ribbon的超时时间,2者只能有一个生效,而ribbon默认超时时间是1秒
继续跟进:
上述代码可见,feign或者ribbon所配置的超时时间,最终都是在HttpUrlConnection中生效
那么,我们如何修改feign的配置时间呢?
我们回到这里:
这里说了,如果容器没有该bean才会默认创建,那我们就自己创建一个注入到spring容器中:
在order 服务中:
- @Configuration
- public class Config {
- @Bean
- public Request.Options feignRequestOptions() {
- Request.Options options = new Request.Options(2000, TimeUnit.MILLISECONDS,
- 2000, TimeUnit.MILLISECONDS,
- true);
- return options;
- }
- }
重启,重新调用:
看到配置已经生效了:
我们这里readTimeout 设置了2秒,如果我们在product服务睡眠3s看看:
product 服务没有睡眠时,正常情况调用结果如下:
product 服务代码修改:
order 服务再次调用:
可见,跟我们想象的一样
如果feign的超时时间设置为4s,而hystrix的熔断时间设置为2s看看:
再次调用:
重点是product服务的日志打印:
证明order 服务熔断了,但product 服务还是被调用了,说明feign的时间设置是没问题的
根据上面分析,Hystrix的熔断时间要大于Feign或Ribbon的connectTimeout+readTimeout
feign的超时时间如果要在application.yml中配置,改如何配置呢:
- feign:
- hystrix:
- enabled: true
- client:
- config:
- default:
- #连接到目标的时间,此处会收到注册中心启动中的影响。设置为3秒钟,如果注册中心有明显的不在线,基本是毫秒级熔断拒绝
- connectTimeout: 3000
- #获取目标连接后执行的最长时间,设置为32秒,即服务最长时
- readTimeout: 32000
为何能这样配置呢?
我们再次启动order服务,调用跟踪:
那ribbon的超时时间如何配置:
- ribbon:
- ReadTimeout: 3000
- ConnectTimeout: 3000
再次启动测试:
那么有人要问了,如果feign和ribbon同时配置,那么以谁的为准,前面已经分析过了,这里再次分析:
重新调用跟踪:
继续跟踪:
最后总结:
hystrix的熔断时间配置通过yml配置没法生效,可以通过配置类的方法来修改,feign的超时时间可以通过代码或者yml配置,ribbon的超时时间可以通过yml来配置
feign和ribbon的超时时间只能二选一,只要feign的超时时间配置了,就以feign的为准,hystrix的超时时间要大于feign/riboon的connectTimeout+readTimeout的和
最后一张图来总结:
hystrix ,feign,ribbon的超时时间配置,以及原理分析的更多相关文章
- springcloud之Feign、ribbon设置超时时间和重试机制的总结
一 超时时间配置 如果在一个微服务当中对同一个接口同时配置了Hystrix与ribbon两个超时时间,则在接口调用的时候,两个计时器会同时读秒. 比如,访问一个接口需要2秒,你的ribbon配置的超时 ...
- Spring Cloud之Feign客户端超时时间配置
关于雪崩效应: 默认情况下tomcat只有一个线程去处理客户端发送的所有请求.高并发情况下,如果客户端请求都在同一接口,tomcat的所有线程池去处理,导致其他接口服务访问不了,等待. Tomcat有 ...
- Nginx中超时时间配置(转)
本文介绍 Nginx 的 超时(timeout)配置.分享给大家,具体如下: Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提 ...
- Java发送邮件必带超时时间配置
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在线上遇到了一个发送邮件的问题,记录一下. 一.先说 ...
- Nacos 配置中心原理分析
我们从原生SDK代码中入手,可以发现最核心的两行代码: ConfigService configService=); 首先我们先来看 NacosFactory.createConfigService ...
- hystrix 线程数,超时时间设置测试
拜读了大拿的文章,收藏起来 https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247483791&idx=1&sn= ...
- 解读mysql主从配置及其原理分析(Master-Slave)
在windows下配置的,后面会在Linux下配置进行测试,需要配置mysql数据库同步的朋友可以参考下. 1.在主数据库服务器为从服务器添加一个拥有权限访问主库的用户:GRANT REPLICATI ...
- Mybatis-spring-boot-starter自动配置的原理分析
相信大家在使用SpringBoot的过程中,经常会使用到mybatis,通过使用mybatis-spring-boot-starter依赖进行自动配置,省去了自己依赖配置和Bean配置的很多麻烦. 有 ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
随机推荐
- NET Core Kestrel部署HTTPS 一个服务器绑一个证书 一个服务器绑多个证书
.net core 3.0 网站发布到centos后,绑定ssl证书,一个服务器绑一个证书,一个服务器绑多个证书 开始之前:对于windows服务器不存在这个问题,在iis中绑定证书是非常简单的一件事 ...
- Json解析方式汇总 excel vba
一. 这种方式比较复杂,因为office版本的原因,所以要加其它函数 Private Function parseScript(strJson As String) Dim objJson As Ob ...
- 一台主机的最大TCP连接数是多少?
在没接触过这个问题之前,自然会想到服务器端连接数是由服务器端口号限制的.但这其实是一个很严重的误解,要解决这个问题,必须理解socket的连接过程. 以python为例,tcp服务端socket需要经 ...
- drf中View和router的详解
Rest Framework 视图和路由 因为涉及到视图层面了,而且下面的例子会反复用到request.data,所以我决定带大家稍微看下源码,感兴趣的可以自己深入了解 无论是View还是APIVie ...
- 关于Chrome浏览器自动同步的问题
Chrome浏览器是开发者最喜欢的浏览器,没有之一,那么公司办公和在家办公的话数据需要有一致性,这个时候就用到了浏览器的自动同步的功能 因为网络的问题,谷歌账户很难登录,基本需要VPN翻墙处理之后才能 ...
- UnitTest单元测试框架解析【实用篇】
UnitTest是展开自动化测试的基础——这个框架很重要!首先我们先自己写一个测试类: 1.被测试类 Widthget.py: # coding: utf-8class Widthget: def _ ...
- ssm简单整合
pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...
- 理解Word2Vec
一.简介 Word2vec 是 Word Embedding 的方法之一,属于NLP 领域.它是将词转化为「可计算」「结构化」的向量的过程.它是 2013 年由谷歌的 Mikolov 提出了一套新的词 ...
- 5000字 | 24张图带你彻底理解Java中的21种锁
本篇主要内容如下: 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观锁 synch ...
- USB Key
随着互联网和电子商务的发展,USB Key作为网络用户身份识别和数据保护的“电子钥匙”,正在被越来越多的用户所认识和使用.本文对USB Key的产生和未来的发展趋势作了一个简单的介绍. 目前市场上见到 ...