【Spring Cloud 源码解读】之 【如何配置好OpenFeign的各种超时时间!】

OpenFeign 的超时重试机制以及底层实现原理 阅读详情

关于Feign的超时详解:

在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常。

1、关于hystrix的熔断超时

如果Feign开启了熔断,必须要重新设置熔断超时的时间,因为默认的熔断超时时间太短了,只有1秒,这容易导致业务服务的调用还没完成然后超时就被熔断了。

如何配置熔断超时:

#Feign如何开启熔断
feign.hystrix.enabled=true

#是否开始超时熔断,如果为false,则熔断机制只在服务不可用时开启(spring-cloud-starter-openfeign中的HystrixCommandProperties默认为true)
hystrix.command.default.execution.timeout.enabled=true

#设置超时熔断时间(spring-cloud-starter-openfeign中的HystrixCommandProperties默认为1000毫秒)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000

注意:关于hystrix在application.properties配置是没提示的,但是HystrixCommandProperties是会获取的。

// 构造函数
protected HystrixCommandProperties(HystrixCommandKey key, HystrixCommandProperties.Setter builder, String propertyPrefix) {
        
	// .... 省略很多其他配置
  
  	// propertyPrefix:hystrix,key:default
    this.executionTimeoutInMilliseconds = getProperty(propertyPrefix, key, "execution.isolation.thread.timeoutInMilliseconds", builder.getExecutionIsolationThreadTimeoutInMilliseconds(), default_executionTimeoutInMilliseconds);
}

// 具体获取属性的方法
private static HystrixProperty<String> getProperty(String propertyPrefix, HystrixCommandKey key, String instanceProperty, String builderOverrideValue, String defaultValue) {
   return HystrixPropertiesChainedProperty.forString().add(propertyPrefix + ".command." + key.name() + "." + instanceProperty, builderOverrideValue).add(propertyPrefix + ".command.default." + instanceProperty, defaultValue).build();
}

2、关于Ribbon超时。

Feign调用默认是使用Ribbon进行负载均衡的,所以我们还需要了解关于Ribbon的超时。

①、Feign的调用链路

看一下Feign的请求是否有使用Ribbon的超时时间,而且是如何读取Ribbon的超时时间的?

(1)、org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute

(2)、com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer(S, com.netflix.client.config.IClientConfig)

(3)、org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory#create

	​创建Client,这里会判断对应ClientName的链接Client是否创建过,如果创建过复用之前的Client;
	如果不存在则创建一个并且放入cache缓存。
public FeignLoadBalancer create(String clientName) {
		FeignLoadBalancer client = this.cache.get(clientName);
		if(client != null) {
			return client;
		}
		IClientConfig config = this.factory.getClientConfig(clientName);
		ILoadBalancer lb = this.factory.getLoadBalancer(clientName);
		ServerIntrospector serverIntrospector = this.factory.getInstance(clientName, ServerIntrospector.class);
    	// 判断是否有重试
		client = loadBalancedRetryFactory != null ? new RetryableFeignLoadBalancer(lb, config, serverIntrospector,
			loadBalancedRetryFactory) : new FeignLoadBalancer(lb, config, serverIntrospector);
		this.cache.put(clientName, client);
		return client;
	}

(4)、com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer(S, com.netflix.client.config.IClientConfig)

	​负载均衡器抽象类

(5)、org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer#execute

​	Feign的负载均衡器实现类。到这里我们可以看到,连接超时和读超时的配置都在这里:
	如果application.properties配置文件中的超时时间不为空,则使用配置的超时时间。
	如果为空则使用默认值,而从FeignLoadBalancer的构造函数可以看到,默认值也是取的RibbonProperties的默认超时时间。
public RibbonResponse execute(RibbonRequest request, IClientConfig configOverride)
			throws IOException {
    Request.Options options;
    // 设置超时时间。,如果orride的配置为空,则用默认值
    if (configOverride != null) {
        RibbonProperties override = RibbonProperties.from(configOverride);
        options = new Request.Options(
            override.connectTimeout(this.connectTimeout),
            override.readTimeout(this.readTimeout));
    }
    else {
        options = new Request.Options(this.connectTimeout, this.readTimeout);
    }
    // 发起请求
    Response response = request.client().execute(request.toRequest(), options);
    return new RibbonResponse(request.getUri(), response);
}

// 构造函数
public FeignLoadBalancer(ILoadBalancer lb, IClientConfig clientConfig, ServerIntrospector serverIntrospector) {
    super(lb, clientConfig);
    this.setRetryHandler(RetryHandler.DEFAULT);
    this.clientConfig = clientConfig;
    this.ribbon = RibbonProperties.from(clientConfig);
    RibbonProperties ribbon = this.ribbon;
    this.connectTimeout = ribbon.getConnectTimeout();
    this.readTimeout = ribbon.getReadTimeout();
    this.serverIntrospector = serverIntrospector;
}

②、Ribbon的默认超时时间

在RibbonClientConfiguration中:

public static final int DEFAULT_CONNECT_TIMEOUT = 1000;
public static final int DEFAULT_READ_TIMEOUT = 1000;

③、如何自定义Ribbon超时时间

首先,RibbonProperties的超时时间的读取的源码如下:

public Integer getConnectTimeout() {
    return (Integer)this.get(CommonClientConfigKey.ConnectTimeout);
}

public Integer getReadTimeout() {
    return (Integer)this.get(CommonClientConfigKey.ReadTimeout);
}

然后,可以在CommonClientConfigKey中可以看到两个超时时间的名称:

// ConnectTimeout:
public static final IClientConfigKey<Integer> ConnectTimeout = new CommonClientConfigKey<Integer>("ConnectTimeout") {};

// ReadTimeout:
public static final IClientConfigKey<Integer> ReadTimeout = new CommonClientConfigKey<Integer>("ReadTimeout") {};

然后,在IClientConfig的默认实现类:DefaultClientConfigImpl中,可以发现Ribbon配置的前缀

public static final String DEFAULT_PROPERTY_NAME_SPACE = "ribbon";

所以,最后Ribbon该这么配置超时时间:

ribbon.ConnectTimeout=5000
ribbon.ReadTimeout=5000

总结

如何配置好Hystrix和Ribbon的超时时间呢?
其实是有套路的。因为Feign的请求:其实是Hystrix+Ribbon。Hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。Hystrix的熔断时间必须大于Ribbon的 ( ConnectTimeout + ReadTimeout )。而如果Ribbon开启了重试机制,还需要乘以对应的重试次数,保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。

feign 获取请求真实目的ip地址 需求 最近小编的项目中出现了很多feign 调用出现 Read Time out 的异常,但因为没有集成链路追踪的第三方框架,查不到原因。所以想到打印请求的ip地址,判断是指定的服务器出现的问题还是所有服务器都有这个问题,但是feign 打印异常日志不会显示目的端地址,这就很难受了没办法只能自己改装下 大致想法 需要改装肯定需要知道feign 具体请求调用的源码,大致需要知道下面几个问题 feign 集成了ribbon 如何在负载均衡之后获取真实的ip地址 feign 实际请求 http 源码在哪 能否替 阅读详情

相关推荐

SpringCloud-Feign【超时时间设置】

  Feign调用服务的默认时长是1秒钟,也就是如果超过1秒没连接上或者超过1秒没响应,那么会相应的报错。而实际情况是因为业务的不同可能出现超出1秒的情况,这时我们需要调整超时时间。本文来看下怎么去设置。 全局配置   在application.properties中添加如下配置,超过5秒没连接上报连接超时,如果超过5秒没有响应,报请求超时 #全局配置 # 请求连接的超时时间 默认的时间为 1 秒...

波波烤鸭的博客 6万+

Feign超时时间设置

Feign超时时间设置起因feign超时时间配置发现了两个问题问题一排查首先看入口类FeignAutoConfiguration配置文件对应类FeignClientPropertiesFeignClientFactoryBean类用于读取配置参数来进行feign配置问题二排查LoadBalancerFeignClientSpringClientFactory 起因 最近发现登录功能有时会报timeout错误,经排除发现是服务与服务之间feign调用超时导致的。于是想通过配置feign超时时长来解决该问题。

u011523825的博客 2万+

15.springcloud_openfeign之FeignClientFactoryBean

在上一篇中我们介绍了通过注解扫描并注册每个标识的接口对应的到spring容器中, 本节我们来了解一下这个类的具体内容。本节主要介绍了springcloud_openfeign如何根据注解和以及父子容器来构建Feign.Builder对象, 并处理Target需要的url, 最后通过Feign.Builder#target构建feign接口的代理对象。本文没有具体介绍其中父子容器的相关细节, 以及配置的一些具体内容, 这些将会在后面的文章中介绍到通过@Import注解给spring容器注入了。

joeyhhhhh的博客 923

Feign 如何设置超时时间

在Spring Cloud中,使用Feign客户端进行服务间通信时,可以通过配置来设置Feign客户端的超时时间。Feign客户端默认的超时时间是一秒钟。你可以在Spring Boot应用的配置文件(如或)中设置Feign客户端的超时时间。

不积跬步,无以至千里;不积小流,无以成江海。 7905

WPS集成DeepSeek最新教程,附详细图文,让文案生成更智能

本文将为大家详细介绍如何将 DeepSeek 功能集成到 WPS 中,通过 OfficeAI 插件,你无需进行复杂的本地部署,只需通过官网连接即可快速启用 DeepSeek 强大的 AI 功能。不论是文案生成、翻译校对,还是深度推理、决策支持,DeepSeek 都能为你提供便捷的解决方案。让我们一起来看看如何操作吧!

Java徐师兄的博客 6万+

【Python 实战基础】如何绘制热力图来模拟绘制北京景区热度图

Python如何绘制热力图来模拟绘制北京景区热度图 文件读写 基础语法 字符串处理 文件生成 数据构建

菜鸟实战的博客 3401

【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 + 源码详解

书接上文,我们掌握了Feign的基本使用、核心原理,以及Spring Cloud Alibaba如何快速整合Feign,真的太简单了!你是不是觉得这样就够了?但在实际项目使用OpenFeign时,我们常常会遇到各种需求,需要用到它提供的扩展,例如日志分析、自定义统一拦截器、客户端组件配置、GZIP压缩等等,这也正是我接下来在本文中分享的内容:首先我会从原生Feign扩展点配置入手,然后进行OpenFeign扩展点配置实战,最后对OpenFeign是如何实现的进行了源码解读,内容很详细,Let’s go!

天罡gg的专栏 5001

Qt6导入QtChart绘制图表(添加组件)

我在按照大佬们的说明添加QtChart时发现,我的电脑上并不能正确的添加QtChart并编译通过,所以在综合了两位大佬的说明又自己探索了一番后,正确编译通过,分享出来,以便同志们节省一些时间。

Nuaa0719301zyx的博客 2951

Spring Cloud OpenFeign源码解析

spring cloud openfign源码分析

1118

Windows Server 2008 R2装不上VMware Tools?别急,手动安装驱动补丁的保姆级教程来了

本文提供了Windows Server 2008 R2手动安装VMware Tools驱动补丁的详细教程,解决驱动签名验证失败问题。通过获取特定补丁文件、创建安装介质、挂载虚拟机并安装补丁等步骤,帮助用户顺利完成VMware Tools安装,提升虚拟机功能与性能。

weixin_28335283的博客 468

Appstore开发者必读:3.2(f)违规预警与高效申诉指南

本文为AppStore开发者提供了应对3.2(f)违规通知的完整指南。文章深度解析了3.2(f)条款下的隐瞒性、关联性与真实性违规类型,并提供了黄金48小时内的自查、申诉信撰写与提交全流程策略。同时,文章强调遵循App Review Guidelines,建立内部合规清单与保持账号独立,是预防违规、维护开发者账号安全的关键。

weixin_29214559的博客 272

Spring Cloud OpenFeign 终极指南:从入门到生产级实战

在微服务架构中,服务间调用是系统的“血管”。如何优雅、高效、安全地实现这一过程?OpenFeign 给出了标准答案。本文将带你从零基础入门,深入理解其核心原理,掌握高级定制技巧,并解析一个真实的生产级配置案例,助你彻底驾驭 OpenFeign。OpenFeign是一个声明式的 HTTP 客户端。传统方式:你需要手动构建 URL、拼接参数、处理序列化、管理连接。OpenFeign 方式:你只需定义一个 Java 接口,加上注解,剩下的交给框架。代码写起来就像调用本地方法一样简单。定义接口。

西凉的悲伤博客 1032

2023东华大学OJ机试题22-70

东华大学计算机考研复试机试22 约瑟夫环223、整除的尾数24、回文质数25、汽水瓶26、阶乘最后的非0位27、算菜价28、 水果价格29、求奇数的乘积30、求最晚和最早日期31、素数32、计算e33 数字之和34 繁殖问题35 奇妙的数字36 整除的尾数37 黑色星期五38 树39 约瑟夫环40 最大与最小41 环42 求数列项43 最高频率44 三艘船45 回文数46 特殊四位数47 最大值48 数列149 修理牛棚50 按要求输出序列51 部落人乘法52 序列53 双重回文数54 等差数列55 人见人

m0_49263811的博客 2599

【源码】Spring Cloud —— OpenFeign 1 FeignClientsRegistrar FeignClientSpecification 等

【源码】Spring Cloud —— OpenFeign 1 FeignClientsRegistrar前言版本 前言 版本 spring-cloud-openfeign:2.0.0.RELEASE

小水牛的博客 1464

把 Client 当成 ABAP 系统的多租户底座:从 sy-mandt 到 CDS_CLIENT 的隔离机制与工程实践

本文深入解析SAP ABAP系统中Client概念的本质与应用。Client不仅是数据表的MANDT字段,更是会话级别的隔离边界,贯穿用户登录、授权和数据访问控制全过程。文章从ABAP SQL的隐式Client处理机制出发,详细介绍了USING CLIENT、USING ALL CLIENTS等安全跨客户端访问方式,并对比了传统CLIENT SPECIFIED的风险。同时阐述了ABAP CDS中@ClientHandling注解的类型与算法选择,包括#AUTOMATED自动拼接和#SESSION_VARIA

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 182

2019年高教社杯全国大学生数学建模竞赛 C 题:《机场的出租车问题》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 3453

深度吃透Spring Cloud OpenFeign:从核心原理到源码底层全解析

在Spring Cloud微服务体系中,服务间HTTP远程调用是核心刚需。传统调用方式如RestTemplate、HttpClient存在大量冗余代码:手动拼接URL、封装请求头、处理参数序列化、解析响应结果、处理异常重试,代码臃肿且复用性极差。作为Spring Cloud官方声明式HTTP调用组件,彻底解决了这一痛点:仅需定义接口+注解,即可实现无感远程调用,像调用本地方法一样调用远程服务。声明式编程,极简开发:基于接口注解定义请求,零HTTP硬编码,大幅降低微服务通信开发成本;

荏苒夕阳的博客 366

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SpringCloud之OpenFeign调用解读

如果我们利用RestTemplate发起远程调用的代码时会存在一些问题比如:•代码可读性差,编程体验不统一•参数复杂URL难以维护OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。

一个菜鸡的博客 2646

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring Cloud OpenFeign超时重试的坑:为什么你的幂等接口被调了两次

<think>我们只需要根据提供的内容生成一个≤150字的文章摘要。内容是关于微服务中Feign超时重试导致非幂等接口重复执行的陷阱,重点讲了GET隐式重试和POST/PUT重试条件误判以及Feign与LoadBalancer重试叠加放大问题。摘要需要简洁概括核心问题与要点。注意字数限制。输出仅摘要。</think>Feign超时重试常被误认为安全,但超时≠失败,可能引发非幂等接口重复执行。文章揭示三大陷阱:GET默认隐式重试、POST/PUT重试条件过粗,以及Feign Retryer与LoadBalan

码到三十五 531

Spring Cloud 源码分析之OpenFeign

OpenFeign是一个远程客户端请求代理,它的基本作用是让开发者能够以面向接口的方式来实现远程调用,从而屏蔽底层通信的复杂性,它的具体原理如下图所示。在今天的内容中,我们需要详细分析OpenFeign它的工作原理及源码,我们继续回到这段代码。 从这段代码中,先引出对于OpenFeign功能实现的思考。带着这些疑问,开始去逐项分析OpenFeign的核心源码从这个结果来看,可以得到两个结论注解是在什么时候被解析的呢?基于我们之前所有积累的知识,无非就以下这几种在这几个选项中,似乎更合适,因为第一个是批量

wadfdhsajd的博客 405

Spring Cloud教程 第七弹 spring cloud openfeign

更多Spring与微服务相关的教程请戳这里Spring与微服务教程合集 1、概述 1.1、Feign是什么 feign是一个声明式的web service客户端,它使得编写web service客户端更加容易。 创建一个接口并且打上注解就可以使用Feign了,它具有可插拔的注解支持,包括Feign注解和JAX-RS注解 feign同样支持可插拔的编码器和解码器 spring cloud为spring mvc的注解添加了支持,可以像spring web一样使用HttpMessageConve.

学无止境! 1437

OpenFeign 服务调用原理与源码分析

OpenFeign 是 Java 生态中一种声明式的服务调用框架,广泛用于微服务架构中,特别是在 Spring Cloud 生态中。它通过注解定义服务接口,屏蔽了底层的 HTTP 请求细节,让开发者能够像调用本地方法一样调用远程服务。以下是对 OpenFeign 服务调用原理的详细分析,以及核心源码的解读。OpenFeign 的核心目标是提供声明式的 REST 客户端,通过动态代理和注解解析,简化 HTTP 请求的发送和响应处理。,这是 Feign 的入口类,用于配置和生成代理对象。

算法小生 1822

Spring Cloud & SpringCloud Alibaba(一套标准化的微服务解决方案)

本文介绍了Spring Cloud微服务架构的基本概念、系统架构演变过程以及核心组件。主要内容包括:Spring Cloud作为微服务落地方案的优势,支持分布式系统开发,提供服务发现、负载均衡等功能;Spring Cloud Alibaba作为补充方案,具备高性能、高可用特性;微服务基础环境搭建步骤,创建父工程聚合管理多个微服务模块。文章通过架构图对比了单体架构、动静分离架构、分布式架构和微服务架构的差异,并提供了Spring Cloud与Spring Boot版本对应关系参考。

m0_48853274的博客 845

【源码】Spring Cloud —— Ribbon 4 Ribbon 与 OpenFeign、RestTemplate 的整合

【源码】Spring Cloud —— Ribbon 4 Ribbon 与 OpenFeign、RestTemplate 的整合前言版本Ribbon 与 RestTemplateLoadBalancerAutoConfigurationLoadBalancerInterceptorRibbon 与 OpenFeignLoadBalancerFeignClient 前言 至此,对 Ribbon 的部分核心接口和实现类做了解读。通常的,我们使用 Spring Cloud 单独整合 Ribbon 时,可以通过在

小水牛的博客 546

OpenFeign 源码解析

基于版本2.2.3.RELEASE 一、核心注解 1.@EnableFeignClients 作用:扫描被指定位置的feign客户端,生成其代理类并作为bean注册到容器中 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { String[] value()

炸酱面的博客 566

基于 spring-cloud-alibaba 的 Sentinel 流量治理实战:从限流埋点到熔断降级

本文以 `spring-cloud-alibaba-examples/sentinel-example` 示例集为核心,系统讲解如何在 Spring Cloud 应用中基于 `spring-cloud-starter-alibaba-sentinel` 接入阿里巴巴开源的流量防卫组件 Sentinel,实现流量控制、熔断降级与系统保护。读完本文,你将掌握 Sentinel 控制台的搭建、HTTP

gitblog_00311的博客 211
上一篇: 【Spring Cloud 源码解读】之 【@LoadBalanced 注解怎么使 RestTemplate 实现负载均衡!】
下一篇: 【Spring Boot 源码解读】之 【为何引入了 Jedis 依赖最后用的还是 Lettuce 客户端?】
Howinfun
博客等级 码龄10年 165粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值