Springcloud之Feign、Hystrix、Ribbon如何设置超时时间

一,概述

我们在微服务调用服务的时候,会使用hystrix、feign和ribbon,比如有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然会失败。

所以,为了构建更为健壮的应用系统,我们希望当请求失败的时候能够有一定策略的重试机制,而不是直接返回失败。

这里还会设计一些其他的配置参数,降级和熔断的概念不再赘述。

先看这几个组件的关系

hystrix+ribbon。hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。hystrix的熔断时间必须大于ribbon的 ( ConnectTimeout + ReadTimeout )。而如果ribbon开启了重试机制,还需要乘以对应的重试次数(注意这里的重试可以是ribbon的重试也可能是feign的重试),保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。

二,配置

1,hystrix降级配置

该降级配置会在请求发出30秒未返回或者异常的时候触发降级策略。并中断正在执行的线程。

#开启Feign下面的Hystrix功能
feign.hystrix.enabled=true
#是否开启服务降级
hystrix.command.default.fallback.enabled=true
#全局超时
hystrix.command.default.execution.timeout.enabled=true
#超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000
#超时以后终止线程
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
#取消的时候终止线程
hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel=true

2,hystrix熔断配置

该熔断配置的效果是如果时间窗口20秒内,请求超过5个,且失败率到达50%,也就是一般会进行熔断,比如20秒内6个请求,有三个成功,三个失败,在发送第六个请求结束后,会对下游服务进行熔断。从熔断的时刻开始,15秒后进入半开状态,尝试放过一个请求,如果成功也关闭熔断,否则等下一个15秒。

#熔断的前提条件(请求的数量),在一定的时间窗口内,请求达到5个以后,才开始进行熔断判断
hystrix.command.default.circuitBreaker.requestVolumeThreshold=5
#超过50%的失败请求,则熔断开关开启
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
#当熔断开启以后,经过多少秒再进入半开状态
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=15000
#配置时间窗口
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=20000

#开启熔断功能
hystrix.command.default.circuitBreaker.enabled=true
#强制开启熔断开关
hystrix.command.default.circuitBreaker.forceOpen=false
#强制关闭熔断开关
hystrix.command.default.circuitBreaker.forceClosed=false

3,ribbon配置

该配置会在发生网络异常后进行请求重试,发生网络异常后,重试次数为(1 + MaxAutoRetries) * (1 + MaxAutoRetriesNextServer)因为包含自己的一次正常请求所以要 +1(失败次数和保存到本地的所以服务之间不能互相感知,每次每一个服务都要+1)

所以hystrix的超时时间(timeoutInMilliseconds)应该配置为

timeoutInMilliseconds > (1 + MaxAutoRetries) * (1 + MaxAutoRetriesNextServer)*  (ConnectTimeout + ReadTimeout)

也就是timeoutInMilliseconds >= (1+2)*(1+2)*(1+2) 

#全局配置

#每台机器最大重试次数
ribbon.MaxAutoRetries=2
#可以再重试几台机器
ribbon.MaxAutoRetriesNextServer=2
#连接超时
ribbon.ConnectTimeout=1000
#业务处理超时
ribbon.ReadTimeout=2000
#在所有HTTP Method进行重试,默认只是在GET请求的地方重试
ribbon.OkToRetryOnAllOperations=true

#单个服务配置配置,该设置会覆盖掉全局配置,servicename为调用服务在注册中心注册服务名称

#每台机器最大重试次数
servicename.ribbon.MaxAutoRetries=2
#可以再重试几台机器
servicename.ribbon.MaxAutoRetriesNextServer=2
#连接超时
servicename.ribbon.ConnectTimeout=1000
#业务处理超时
servicename.ribbon.ReadTimeout=2000
#在所有HTTP Method进行重试,默认只是在GET请求的地方重试
servicename.ribbon.OkToRetryOnAllOperations=true

1,ribbon的重试机制

ribbon默认不开启重试,开启后默认只有GET请求进行重试

ribbon 调用重试需要引入此包

<dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.3.0</version>
        </dependency> 

4,feign配置

在项目中,使用feignClient进行http 服务调用,feignClient的默认连接方式为HttpURLConnection,因为HttpURLConnection没有连接池,并发高的时候,会有一定的网络开销,在做项目优化的时候,替换改为okHttp以便复用其连接池(也可以使用apache的httpclient)。

如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,使用 ribbon 的超时时间和重试设置。否则使用 feign 自身的设置。两者是二选一的,且 feign 优先。

 <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
            <version>11.0</version>
        </dependency>
feign:
  #okhttp3的时候压缩不生效
  #  compression:
  #    request:
  #      enabled: true
  #      mime-types:
  #        - text/xml
  #        - application/xml
  #        - application/json
  #      min-request-size: 2048
  okhttp:
    enabled: true
  client:
    config:
      #设置的全局超时时间
      #如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,
      #使用 ribbon 的超时时间和重试设置【默认连接和读取时间各1秒】。否则使用 feign 自身的设置。
      #两者是二选一的,且 feign 优先。
      default:
        #请求连接的超时时间
        #connectTimeout: 10000
        #请求处理的超时时间
        #readTimeout: 60000
        #不打印请求日志
        loggerLevel: NONE
        #配置请求拦截器
#        request-interceptors:
#          - feign.auth.BasicAuthRequestInterceptor
#        decoder: org.springframework.cloud.openfeign.support.SpringDecoder
#        encoder: org.springframework.cloud.openfeign.support.SpringEncoder

1,feign的重试机制

因为ribbon的重试机制和feign的重试机制有冲突,所以源码中默认关闭feign的重试机制。

这里以使用feign的默认实现Default为例配置,这里使用bean的方式配置,这里配置最大重试次次数是5次,最大重试时间1s,每次重试间隔100ms

注意使用feign重试的时候,不需要开启ribbon重试,且需要配置feign的超时时间。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import feign.Retryer;
 
import static java.util.concurrent.TimeUnit.SECONDS;
 
@Configuration
public class AppConfig {
 
    @Bean
    public Retryer feignRetryer(){
        return new Retryer.Default(1,SECONDS.toMillis(1), 5);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美味度配方

8 种配料每种配料可以放 1 到 5 克&#xff0c;美味度为配料质量之和&#xff0c;给定一个美味度 n&#xff0c;求解 8 种配料的所有搭配方案及方案数量 。 (本笔记适合学了 Python 循环&#xff0c;正在熟炼的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a…

prisma 学习记录

1、prisma 可以看做是一个 ORM。 安装 prisma npm install prisma -D 初始化 prisma , 并设置要链接的数据库 npx prisma init --datasource-provider sqlite --datasource-provider 要使用的数据库 2、prisma 中的模型&#xff0c; 表示底层数据库中的表或者集合。 生成 Pri…

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C++)

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK和图像时间戳的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK获取时间戳的方…

shell脚本进阶1——精读ansible+shell脚本

文章目录 一、脚本规划思路二、主控机shell脚本2.1 脚本输出字体特效2.2 生成菜单栏对话框2.3 配置本地yum源仓库2.4 配置受控机yum源2.5 关闭防火墙和selinux2.6 把docker安装包给受控机2.7 安装docker-compose2.8 安装docker2.9 安装ansible2.10 安装pip2.11 主控本机免密登录…

利用谷歌DevTool解决web网页内存泄漏问题

目录 web网页内存泄漏 主要的内存泄漏来源 利用谷歌DevTool定位内存泄漏问题 性能Performance 主要功能 Performance insights性能数据分析 Memory内存 三种模式 相关概念 解决内存泄漏问题 第一步 &#xff1a;是否内存泄漏&#xff1a;js堆直增不降&#xff1b;降…

Unity3d_Cut\Clipping sphere\CSG(boolean)(裁剪模型重合部分)总结

1、https://liu-if-else.github.io/stencil-buffers-uses-in-unity3d/ 下载&#xff1a;https://github.com/liu-if-else/UnityStencilBufferUses 2、手动切割 Unity 模型切割工具,CSG,任意图案,任意切割_unity csg_唐沢的博客-CSDN博客 3、 Shader Unity Shader学习&#x…

CVPR 2023 | 计算机视觉顶会亮点前瞻

在知识和技术都迅速更新迭代的计算机领域中&#xff0c;国际计算机视觉与模式识别会议&#xff08;CVPR&#xff09;是计算机视觉方向的“顶级流量”&#xff0c;引领着学科及相关领域的研究潮流。今天我们为大家带来5篇微软亚洲研究院被 CVPR 2023 收录的论文&#xff0c;主题…

JVM知识点梳理

什么是JVM&#xff1f; JVM是java虚拟机的缩写 &#xff0c;也是java程式可以实现跨平台的关键。 JVM部分需要知道什么东西&#xff1f; JVM的结构和功能、参数配置、GC回收机制、GC回收器极其优缺点。 JVM结构&#xff08;栈&#xff0c;程序计数器&#xff0c;方法区&#xf…

基于深度学习的高精度打电话检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度打电话检测识别系统可用于日常生活中或野外来检测与定位打电话目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的打电话目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

《C# 教程》菜鸟教程学习笔记

学习地址 ######C#有用的网站 C# Programming Guide - 介绍了有关关键的 C# 语言特征以及如何通过 .NET 框架访问 C# 的详细信息。Visual Studio - 下载作为 C# 集成开发环境的 Visual Studio 的最新版本。Go Mono - Mono 是一个允许开发人员简单地创建跨平台应用程序的软件平台…

【每日算法】【203. 移除链表元素】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

Docker基本介绍

一、定义 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 解决了运行环境和配置问题的软件容器&#xff0c; 方便做持续集成并有助于整…

UnityVR--UIManager--UI管理1

目录 前言 UI节点的结构 需要用到的组件 1. CanvasGroup 2. Button等控件的OnClick()监听 3. EventTrigger 建立UI工具集 1. 管理UI节点 2. UIBase包含了以下的工具 建立分面板的管理工具——以主面板MainUi为例 前言 UI在项目中的重要性不言而喻&#xff0c;并且UI控件的…

软件设计师第4题

首先&#xff0c;我是备考2023年上半年的考试。 一、历年考试题 历年的考题如下&#xff0c;从表中分析可以看出&#xff0c;动态规划法、排序算法、回溯法、分治法是很大概率考察的算法&#xff0c;尤其是动态规划法&#xff0c;本身其理解难度较高&#xff0c;且可以出的题型…

【计网】第二章 物理层

文章目录 物理层一、物理层的基本概念二、数据通信的基础知识2.1 数据通信系统的模型2.2 有关信道的基本概念2.3 信道的极限容量2.3.1 奈奎斯特定理2.3.1 香农定理2.3.2 信噪比 三、物理层下面的传输媒体3.1 导引型传输媒体3.2 非导引型传输媒体 四、信道复用技术4.1 频分复用 …

【小沐学Python】Python实现在线电子书(Sphinx + readthedocs + github + Markdown)

文章目录 1、简介2、安装3、创建测试工程4、项目文件结构5、编译为本地文件6、编译为http服务7、更改样式主题8、支持markdown9、修改文档显示结构10、项目托管到github11、部署到ReadtheDocs结语 1、简介 Sphinx 是一个 文档生成器 &#xff0c;您也可以把它看成一种工具&…

STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4

STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4 Proteus仿真小实验&#xff1a; STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4 功能&#xff1a; 硬件组成&#xff1a;STC15W4K32S4单片机 LCD12864显示器4x4矩阵键盘HX711电子秤 1.单片机通…

操作教程:EasyCVR视频融合平台如何配置平台级联?

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;在视频能力上&#xff0c;平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。平台可拓展性强、开放度高、部署轻快&…

NUCLEO-F411RE RT-Thread 体验 (3) - GCC环境 uart驱动的移植以及console的使用

NUCLEO-F411RE RT-Thread 体验 (3) - GCC环境 uart驱动的移植以及console的使用 1、准备工作 在第一节里&#xff0c;我们用stm32cubemx将pa2 pa3管脚配置成usart2&#xff0c;用于跟st-link虚拟串口的打印用&#xff0c;那么我们先重定向printf函数&#xff0c;看这条通道是…

2009年iMac装64位windows7

前言&#xff1a;单位领导会花屏的iMac&#xff08;24寸 2009年初版&#xff09;我捡来用&#xff0c;应该大约是在2020年安装了32位windows7&#xff0c;发现不安装显卡驱动便不会花屏死机&#xff0c;于是就当简单的上网机用着&#xff0c;毕竟iMac的显示屏还是蛮不错的。现在…