一次线上超时问题,看Ribbon 超时机制

news2024/11/18 22:38:04

一、线上问题

项目上线后,一段时间内运行都没有问题,突然运营人员说,某个接口一直失败。遂查看线上日志:

spring-cloud-openfeign 通过服务名调用的,服务发现没有找到可用服务实例?这是第一反应,应为没有看到目标 IP ,这个想法通过另外一个ping 接口调用被推翻了,于是怀疑是超时参数设置问题。

默认参数一定是有的,而且我的 OkhttpClient 对象已经设置了超时:

@Configuration
@ConditionalOnClass({Feign.class})
@AutoConfigureBefore({FeignAutoConfiguration.class})
public class OKHttpConfig {
    @Value("${feign.okhttp.maxidleConnections}")
    private Integer maxidleConnections;
    @Value("${feign.okhttp.keepAliveDuration}")
    private Integer keepAliveDuration;

    public OKHttpConfig() {
    }

    @Bean
    @LoadBalanced
    public OkHttpClient okHttpClient() {
        return (new OkHttpClient()).newBuilder().retryOnConnectionFailure(true).connectionPool(this.pool()).connectTimeout(100000L, TimeUnit.SECONDS).readTimeout(100000L, TimeUnit.SECONDS).writeTimeout(100000L, TimeUnit.SECONDS).build();
    }

    @Bean
    public ConnectionPool pool() {
        return new ConnectionPool(this.maxidleConnections, (long)this.keepAliveDuration, TimeUnit.MINUTES);
    }
}

按照推测,明显这个没起作用,所以只能去看下具体调用时超时参数到底是怎么起作用的:

二、源码剖析

Ribbon 作为负载均衡调用 openFeign。会涉及到两个超时,一个是 Ribbon 的超时设置,一个是 openFeign 底层使用的 delegate 的超时。比如 httClient 或者 OkhttpClient。

下面看下这两个超时参数的设置方法:

# 注意这里对应的 org.springframework.cloud.openfeign.FeignClientProperties,并不是直接给 okhttp 使用的,会覆盖 okhttpClient 对象构造时设置的超时参数!
feign:
  client:
    config:
      default:
        connect-timeout: 20000
        read-timeout: 20000
  httpclient:
    enabled: false
  okhttp:
    enabled: true
    maxidleConnections: 150
    keepAliveDuration: 10

ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 10000    

这两个参数同时设置或者只设置一个时到底会怎么作用呢,通过源码我们去了解下:

通过上面的代码可以看出,如果没有显式配置 configOverride,会使用 默认的 1s ,所以线上随着数据量的增加,接口一旦返回慢一点就会报超时错误!!

 

Ribbon 的默认配置在下面这里:

如果上面图看的有点晕,那下面这张图一定让你茅塞顿开:

总结一句话: Feign 集成了 Ribbon, 通过 LoadBalancerFeignClient 直接调用,而 LoadBalancerFeignClient 又通过代理 OkhttpClient (这里是feign包里的),继续往下代理,会调用真正的 okhttp3.OkHttpClient。

参数配置优先级:feign 没有配置会使用ribbon的,否则会使用 feign 配置的,如果feign 配置的和 okhttp3.OkHttpClient 参数不一致,会使用 feign 配置的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何添加PDF书签?学会这三种方法

随着PDF文档和书籍已经成为我们工作和生活中不可或缺的一部分,许多PDF书签制作器和编辑器应运而生。了解使用 Windows、Mac 兼容或在线软件免费将书签添加到 PDF的多种方法。 什么是 PDF 书签? PDF 文件中的书签与印刷书籍中的纸质或织物书签的工作方式…

1609_PC汇编语言_汇编简介以及first例程后续

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 看了一下,当前看的这个章节还剩下几页没有看完。看完之后,做一个简单的整理。 在上一篇笔记中我提到了关于DJGPP的疑惑,也自己找…

RocketMQ源码-NameServer架构设计及启动流程

本文我们来分析NameServer相关代码,在正式分析源码前,我们先来回忆下NameServer的功能: NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能&…

【每日阅读】前端进阶知识点1

如何更改网页中语言属性值 声明当前语言类 html标签更改属性值 lang属性中不区分大小写 en-us en-US 一致 具体可使用 window,document.querySelector(“html”)?.setAttribute(“lang”,newValue); qs库 qs是一个流行的查询参数序列化和解析库。可以将一个普通的object序列…

09_FreeRTOS任务调度器

目录 开启任务调度器vTaskStartScheduler函数 xPortStartScheduler开启任务调度器函数 启动第一个任务 prvStartFirstTask开启第一个任务函数 vPortSVCHandler SVC中断服务函数 出栈/压栈汇编指令详解 开启任务调度器vTaskStartScheduler函数 作用:用于启动任务调度器,…

LaoCat带你认识容器与镜像(实践篇一上)

实践篇主要以各容器的挂载和附加命令为主。 本章内容 Dockerfile基础命令详解。 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 Docker > 20.10.22 从该章开始,我们就进入了Docker实践篇系列了,主要介绍Docker相关附加命令,…

Python中的字符串多样的操作方法

文章目录1.字符串中大小写字母的转变2.字符串的左右中对齐3.字符串查找的方法4.字符串的替换5. 字符串的判断6.字符串的截取7.字符串的拆分8.字符串的拼接9.格式化字符串10.格式化字符串的语法10.12.1 对齐选项([align])10.2 填充选项([fill]…

切入点(pointcut)的申明规则

Spring AOP 用户可能会经常使用 execution切入点指示符。执行表达式的格式如下:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)ret-type-p…

HandlerInterceptorAdapter拦截器多个拦截器时执行的顺序

前提:拦截器加载顺序是 1 2 3.Configuration public class InterceptorConfig implements WebMvcConfigurer {Autowiredprivate Test1neInterceptor test1neInterceptor;Autowiredprivate Test2neInterceptor test2neInterceptor;Overridepublic void addIntercepto…

【Android -- 开源库】权限适配 RxPermissions 的基本使用

运行时权限 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 系统权限分为两类: 正常权限:只需在你应用的 Androidmanifest.xml 中列出,安装时…

大数据---Hadoop安装教程(一)

Hadoop安装教程前期工作 以下步骤基于网络配置完成,并且能连接xshell和xftp工具 Linux安装: Linux—CentOS 7 64位安装教程 Xshell连接: Linux—Xshell连接 文章目录Hadoop安装教程前期工作安装vim编辑器免密登录ssh登录过程免密登录的原理操作1.免密登录2.开启远程…

比较排序——三路快速排序

快速排序(Quicksort),计算机科学词汇,适用领域Pascal,c等语言,是对冒泡排序算法的一种改进。一、单路排序流程快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设…

e^(-x^2)的原函数(本求法为负面典型,仅供参考)

先放正确答案 ∫−∞∞e−x2π\int _{-\infin} ^{\infin} e^{-x^{2}}\sqrt{\pi}∫−∞∞​e−x2π​ 证法有许多 这是选自点我的一个证明方法。 首先要明确这是一个超越函数 求不了原函数 所以以下部分……纯属失败案例 注:原本在desmos上完成的推导,复制…

stable-diffusion-webui的基础功能手动安装,了解代码结构、依赖、模型出处

前言 虽然,当前有很多stable-diffusion-webui 的一键安装包,但是不易于彻底理解该项目 主要介绍了,手动安装 stable-diffusion-webui 基础功能的过程,手动安装,了解代码结构、依赖、模型出处 一、手动下载stable-dif…

2023 如何学好 Python web 开发?走心局送给大家

1.走心 我在没有接触互联网这个行业的时候, 就一直好奇网站是怎么构建的。 我现在虽然从事互联网相关的工作, 但是也一直没有接触过Web开发之类的东西, 不过兴趣终归还是要有的,还要自己动手去实践的。 Web开发的途径有好多种&am…

Linux 三剑客命令之 awk 详解

目录 一、Awk 实战讲解 1.1 awk 的原理 1.2 BEGIN 和 END 模块 1.3 运算符 1.4 常用 awk 内置变量 1.5 awk 正则 1.6 awk 常用字符串函数 一、Awk 实战讲解 awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些…

Fisco Bcos区块链五(后端区块链应用开发框架及流程)

文章目录项目框架:开发流程:1、创建一个Java工程2、引入FISCO BCOS Java SDK3、配置SDK证书4、业务逻辑开发第一步.将3编译好的Java合约引入项目中第二步.开发业务逻辑5. 运行应用项目框架: |-- build.gradle // gradle配置文件 |-- gradle …

element-ui组件的使用,导航菜单(NavMenu)组件、分页组件的使用

一、ElementUI 1、简介:是饿了么公司推出的基于Vue2的组件库 2、使用方法:具体可见官网https://element.eleme.cn/#/zh-CN/component/installation ​ (1)在vue项目中安装:npm install element-ui ​ (…

win10 在线、离线安装microsoft store 版 WSL

实验环境: 操作系统:windows版本 10.0.19045.2486 WSL版本:Microsoft.WSL_1.0.3.0_x64_ARM64.msixbundle 离线安装 获取WSL安装包: 在此页面获取发布网址: Microsoft Store 中适用于 Linux 的 Windows 子系统的发行…

深度卷积对抗神经网络 基础 第七部分 StyleGAN

深度卷积对抗神经网络 基础 第七部分 StyleGAN 深度卷积神经网络模型已经应用在非常多的领域,但是其总包含了很多潜在的问题,比如说训练速度过慢,生成器与判别器的进化程度不平衡等等。那么,随着各种方法和算法的普及和进化&…