springcloud之Feign超时问题的解决


Posted in Java/Android onJune 24, 2021

问题背景

最近公司项目有个功能需进行三层Feign调用,且还要调外部接口,延迟挺大,造成Feign一直提示Read timed out executing POST。

feign.RetryableException: Read timed out executing POST http://******
        at feign.FeignException.errorExecuting(FeignException.java:67)
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:104)
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
        at com.sun.proxy.$Proxy113.getBaseRow(Unknown Source)
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:170)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
        at feign.Client$Default.convertResponse(Client.java:152)
        at feign.Client$Default.execute(Client.java:74)

解决方案

首先,我们看下Feign的简介

Feign 是一个声明式的web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign.

这么说吧,Feign接口调用分两层,Ribbon的调用和Hystrix调用,理论上设置Ribbon的时间即可,但是Ribbon的超时时间和Hystrix的超时时间需要结合起来,按照木桶原则最低的就是Feign的超时时间,建议最好配置超时时间一致。经过配置一下application设置后,完美解决了问题。因为第三方接口中需要3~20秒不等的时间,所以这个数值也是根据自己的业务系统情况设置的。

application.xml

#hystrix的超时时间
hystrix:
    command:
        default:
            execution:
              timeout:
                enabled: true
              isolation:
                    thread:
                        timeoutInMilliseconds: 30000
#ribbon的超时时间
ribbon:
  ReadTimeout: 30000
  ConnectTimeout: 30000

springcloud之Feign 负载均衡请求超时时间

SpringCloud:Greenwich.SR4

SpringBoot:2.1.9.RELEASE

Feign调用服务的默认时长是1秒钟,也就是如果超过1秒没连接上或者超过1秒没响应,那么会相应的报错。

但是在实际的业务中,我们的服务可能因为特别原因(网络、处理压力大等)导致相应速度超过1秒钟,那么就会报错,下面我们就来处理如何手动配置Feigin的负载均衡超时等参数

全局配置

SpringCloud负载均衡底层用的就是Ribbon

#--------------Feign负载均衡配置 配置全局超时时间
ribbon:
  ConnectTimeout: 5000 #请求连接的超时时间,默认时间为1秒
  ReadTimeout: 5000 #请求处理的超时时间

5秒没有响应成功就报如下错误(真实情况下,会比5s多一些,因为发送请求也需要时间的,模拟超时可以在请求处理的方法上用Thread.sleep()设置休眠时间超过5s)

springcloud之Feign超时问题的解决

局部配置(就是指定提供者)

#--------------Feign负载均衡配置 局部配置超时时间等
feign-product-provider: #指定配置的服务名称
  ribbon:
    OkToRetryOnAllOperations: true # 对所有请求都进行重试
    MaxAutoRetries: 2 # 对当前实例的重试次数
    MaxAutoRetriesNextServer: 0 # 切换实例的重试次数(集群状态下,其它对其它实例服务重试的次数)
    ConnectTimeout: 3000 # 请求连接的超时时间
    ReadTimeout: 3000 # 请求处理的超时时间

上述提到的服务名称如下配置

spring:
  application:
    name: feign-product-provider # 随意设置

执行的代码

springcloud之Feign超时问题的解决

输出结果

springcloud之Feign超时问题的解决

不是一共重试两次吗?这里边就涉及到了一个公式

共重试次数 = (MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries * MaxAutoRetiresNextServer)
      = 2 + 0 + (2 * 0)
      = 2

在加上我们手动请求一次那就是:2 + 1=3次

公式很重要!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
Java循环队列与非循环队列的区别总结
Jun 22 Java/Android
Springboot集成阿里云OSS上传文件系统教程
Jun 28 Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 Java/Android
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
Java Socket实现多人聊天系统
Jul 15 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
Jpa Specification如何实现and和or同时使用查询
Nov 23 Java/Android
InterProcessMutex实现zookeeper分布式锁原理
Mar 21 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
前端与RabbitMQ实时消息推送未读消息小红点实现示例
Jul 23 Java/Android
Feign调用全局异常处理解决方案
总结一下关于在Java8中使用stream流踩过的一些坑
IDEA使用SpringAssistant插件创建SpringCloud项目
使用feign服务调用添加Header参数
详解Java实现数据结构之并查集
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 #Java/Android
详解Java实现设计模式之责任链模式
Jun 23 #Java/Android
You might like
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
extJs 下拉框联动实现代码
2010/04/09 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
Python进阶-函数默认参数(详解)
2017/05/18 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
人事主管的岗位职责
2013/11/16 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
企业人事任命书
2014/06/05 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
MySQL 字符集 character
2022/05/04 MySQL