hystrix ,feign,ribbon的超时时间配置,以及原理分析

时间:2023-01-31 10:07:17

背景,网上看到很多关于hystrix的配置都是没生效的,如:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

一.先看测试环境搭建:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

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 服务

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

跟进去看HystrixCommand的创建:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

由此可见线程池和熔断超时时间都已经改变了,证明我们的配置生效了

原理分析:

在FeignClientsConfiguration这个配置类中有一段代码:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

然后跟进看到默认的对象:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

HystrixCommandProperties对象有个默认的超时时间,默认是1s:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

那么,我们根据上面的分析,当容器中存在HystrixFeign.builder就不会再创建该bean 了,所以我们可以自己创建一个HystrixFeign.builder 然后调用setterFactory(SetterFactory setterFactory)来修改默认的配置,也就是上面我们自己定义的配置类

熔断器的熔断时间是从调用下面的方法开始计算的:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

三.feign超时时间怎么设置?

我们继续跟进刚才的调用方法:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

在这里默认连接时间是10s,读取时间是60s,那么这个类是怎么创建的呢?

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

从上面可以知道,Options对象默认已经有个时间配置了,然而我们继续跟踪代码:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

我们看这里:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

Options对象经过getClientConfig(options, clientName) 方法,就从10s的连接时间变成了1s,60s的读取时间也变成了1s,上面源码分析可以知道:

如果我们配置了feign的超时时间,那么就会以我们配置的时间为准,如果没有配置,那么就取ribbon的超时时间,2者只能有一个生效,而ribbon默认超时时间是1秒

继续跟进:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

上述代码可见,feign或者ribbon所配置的超时时间,最终都是在HttpUrlConnection中生效

那么,我们如何修改feign的配置时间呢?

我们回到这里:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

这里说了,如果容器没有该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;
} }

重启,重新调用:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

看到配置已经生效了:

我们这里readTimeout 设置了2秒,如果我们在product服务睡眠3s看看:

product 服务没有睡眠时,正常情况调用结果如下:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

product 服务代码修改:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

order 服务再次调用:
hystrix ,feign,ribbon的超时时间配置,以及原理分析

可见,跟我们想象的一样

如果feign的超时时间设置为4s,而hystrix的熔断时间设置为2s看看:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

再次调用:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

重点是product服务的日志打印:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

证明order 服务熔断了,但product 服务还是被调用了,说明feign的时间设置是没问题的

根据上面分析,Hystrix的熔断时间要大于Feign或Ribbon的connectTimeout+readTimeout

feign的超时时间如果要在application.yml中配置,改如何配置呢:

feign:
hystrix:
enabled: true
client:
config:
default:
#连接到目标的时间,此处会收到注册中心启动中的影响。设置为3秒钟,如果注册中心有明显的不在线,基本是毫秒级熔断拒绝
connectTimeout: 3000
#获取目标连接后执行的最长时间,设置为32秒,即服务最长时
readTimeout: 32000

为何能这样配置呢?

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

我们再次启动order服务,调用跟踪:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

那ribbon的超时时间如何配置:

ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000

再次启动测试:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

那么有人要问了,如果feign和ribbon同时配置,那么以谁的为准,前面已经分析过了,这里再次分析:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

重新调用跟踪:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

继续跟踪:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析

最后总结:

hystrix的熔断时间配置通过yml配置没法生效,可以通过配置类的方法来修改,feign的超时时间可以通过代码或者yml配置,ribbon的超时时间可以通过yml来配置

feign和ribbon的超时时间只能二选一,只要feign的超时时间配置了,就以feign的为准,hystrix的超时时间要大于feign/riboon的connectTimeout+readTimeout的和

最后一张图来总结:

hystrix ,feign,ribbon的超时时间配置,以及原理分析

hystrix ,feign,ribbon的超时时间配置,以及原理分析的更多相关文章

  1. springcloud之Feign、ribbon设置超时时间和重试机制的总结

    一 超时时间配置 如果在一个微服务当中对同一个接口同时配置了Hystrix与ribbon两个超时时间,则在接口调用的时候,两个计时器会同时读秒. 比如,访问一个接口需要2秒,你的ribbon配置的超时 ...

  2. Spring Cloud之Feign客户端超时时间配置

    关于雪崩效应: 默认情况下tomcat只有一个线程去处理客户端发送的所有请求.高并发情况下,如果客户端请求都在同一接口,tomcat的所有线程池去处理,导致其他接口服务访问不了,等待. Tomcat有 ...

  3. Nginx中超时时间配置(转)

    本文介绍 Nginx 的 超时(timeout)配置.分享给大家,具体如下: Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提 ...

  4. Java发送邮件必带超时时间配置

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在线上遇到了一个发送邮件的问题,记录一下. 一.先说 ...

  5. Nacos 配置中心原理分析

    我们从原生SDK代码中入手,可以发现最核心的两行代码: ConfigService configService=); 首先我们先来看 NacosFactory.createConfigService ...

  6. hystrix 线程数,超时时间设置测试

    拜读了大拿的文章,收藏起来 https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247483791&idx=1&sn= ...

  7. 解读mysql主从配置及其原理分析&lpar;Master-Slave&rpar;

    在windows下配置的,后面会在Linux下配置进行测试,需要配置mysql数据库同步的朋友可以参考下. 1.在主数据库服务器为从服务器添加一个拥有权限访问主库的用户:GRANT REPLICATI ...

  8. Mybatis-spring-boot-starter自动配置的原理分析

    相信大家在使用SpringBoot的过程中,经常会使用到mybatis,通过使用mybatis-spring-boot-starter依赖进行自动配置,省去了自己依赖配置和Bean配置的很多麻烦. 有 ...

  9. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么&quest;

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

随机推荐

  1. SharePoint Permission Extension

    SharePoint Permission Extension 项目很久没维护了,也没有迁移到sp2013上(貌似只要把2013的Form的RenderMode设置为Server后也是可以用的). 在 ...

  2. phpcms V9 内容模型管理

    [1]理解模型 模型,系统知识的抽象表示.既然抽象了,那就得脑补一下.大家都是面向对象设计的专业人员,类就很抽象的,对比类的定义想象一下模型的概念. 举个例子,一般新闻类的信息,都具有标题.内容.作者 ...

  3. VS SETUP项目更新的问题

    用VS建立了一个SetUp类型的项目,build以后将生成的setup文件在机器上安装,然后再rebuild,再安装新生成的setup文件,会出现如下的提示信息: Another version of ...

  4. 使用eclipse遇到问题:the-package-collides-with-a-type

    相似问题:http://*.com/questions/12236909/the-package-collides-with-a-type

  5. LTE Module User Documentation(翻译5)——Mobility Model with Buildings

    LTE用户文档 (如有不当的地方,欢迎指正!) 8 Mobility Model with Buildings   我们现在通过例子解释如何在 ns-3 仿真程序中使用 buildings 模型(特别 ...

  6. MethodNotAllowedHttpException

    原因:1.没有加表单{{csrf_field()}}:2.除get提交以外,其它提交方式都要csrf_token();3.提交的路由非法,没有定义.

  7. 各设备如何清理dns缓存

    Windows 按下 Windows+R 键,运行 cmd ,在命令提示符运行命令 ipconfig /flushdns OS X 10.10 在[应用程序][实用工具][终端]运行命令 sudo d ...

  8. 在HTML中添加目录

    <a href="#num1">跳转到第一章</a><div id="num1">第一章</div>用a的hre ...

  9. 使用sae定时执行Python脚本

    使用sae定时执行Python脚本 使用sae定时执行Python脚本 12,May,2014 | 57 Views 毕设压力略大,必须是桂林游的锅.去之前放松了几天,回来又休闲了几天,加上桂林的一周 ...

  10. &sol;var&sol;cache&sol;apt&sol;archives&sol;lock - open

    问题: E: 无法获得锁 /var/cache/apt/archives/lock - open (11 资源临时不可用)E: 无法锁定下载目录o rm /var/cache/apt/archives ...