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

news2024/11/17 16:35:28

一,概述

我们在微服务调用服务的时候,会使用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);
    }
}

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

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

相关文章

Vue3系列--provide与inject

目录 Provide inject 在Vue3项目开发的过程中&#xff0c;会创建很多组件&#xff0c;那么避免不了组件之间的通信&#xff0c;在父子组件通信我们可以使用defineProps、defineEmits、defineExpose和Emit方法完成通信&#xff0c;在使用这些方法的前提是需要引用对应的组件。…

第36步 深度学习图像识别:TensorFlow-gpu环境配置

基于WIN10的64位系统演示 一、写在前面 从这一期开始分享基于深度学习图像识别的学习笔记和代码&#xff0c;相比于之前的ML分类模型&#xff0c;图像识别的门槛会更高&#xff0c;包括硬件方面、代码复杂度和基础理论知识等。同样&#xff0c;首先把必要的深度学习框架&…

Nginx 轻松搞定跨域问题

当你遇到跨域问题&#xff0c;不要立刻就选择复制去尝试&#xff0c;请详细看完这篇文章再处理&#xff0c;我相信它能帮到你。 分析前准备&#xff1a; 前端网站地址&#xff1a;http://localhost:8080 服务端网址&#xff1a;http://localhost:59200 首先保证服务端是没有…

微软将GitHub Copilot 与 Visual Studio 深度整合有助于便捷开发

近日对于很多的开发者来说将迎来一个好消息&#xff0c;据悉微软目前正在改善Visual Studio的开发体验&#xff0c;并将GitHub Copilot更深度融合入Visual Studio 中&#xff0c;以提升“AI 写代码”的准确性。 值得注意的是&#xff0c;在Copilot 1.84 版本之前&#xff0c;…

亚马逊养号系统之亚马逊批量养号如何操作?

亚马逊新注册的买家号都是需要先养一段时间才可以的&#xff0c;如果想要同时养大量的买家号那么需要借助软件进行辅助操作才行。 亚马逊鲲鹏系统可以批量养亚马逊买家号&#xff0c;养号方法有两种&#xff0c;一种是AI智能一键养号&#xff0c;一种是设置关键词搜索浏览后进行…

编译 Keras 模型

本篇文章译自英文文档 Compile Keras Models 作者是 Yuwei Hu 更多 TVM 中文文档可访问 →TVM 中文站。 本文介绍如何用 Relay 部署 Keras 模型。 首先安装 Keras 和 TensorFlow&#xff0c;可通过 pip 快速安装&#xff1a; pip install -U keras --user pip install -U …

代码随想录算法训练营第五十五天|392.判断子序列|115.不同的子序列

LeetCode392.判断子序列 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。注意这里…

postman中级:导入文件数据,批量化参数

建议阅读对象&#xff1a;已掌握postman的基本使用&#xff08;参见&#xff1a;postman入门-主界面认识&#xff0c;模拟请求&#xff09; 本地安装的版本&#xff1a;Postman for Windows Version 10.14.9 1.创建csv文件 或 txt文件 文件数据格式&#xff1a; 第一行写下参…

python生成excel文件的三种方式

在我们做平常工作中都会遇到操作excel&#xff0c;那么今天写一篇&#xff0c;如何通过python操作excel。当然python操作excel的库有很多&#xff0c;比如pandas&#xff0c;xlwt/xlrd&#xff0c;openpyxl等&#xff0c;每个库都有不同的区别&#xff0c;具体的区别&#xff0…

day19--栈

用两个栈实现队列 栈&#xff1a;先进后出&#xff1b;队列&#xff1a;先进先出>因此两个栈即可模拟队列 class Solution { public:void push(int node) {//进队stack1.push(node);//进栈}int pop() {//出队int t;if(stack2.empty()){//栈2空while(!stack1.empty()){//栈1…

vue table页展示

<template><el-container><el-header><el-tabsv-model"groupId"tab-click"tabChange"class"w-full pt-11 ml-5"><el-tab-panelabel"登记进度"name"0"></el-tab-pane><el-tab-panela…

MarkDown使用教程

MarkDown使用教程 1.标题 #: 一级标题 ##: 二级标题 ###: 三级标题 一共分为六级 2.字体 斜体文本 斜体文本 粗体文本 粗体文本 粗斜体文本 粗斜体文本 3.列表 无序号的使用*、、- 作为列表的标记&#xff0c;这些标记后面添加一个空格 第一项第二项第三项 第一项第二项…

ArcGIS如何统计面内点的数量

本文来源&#xff1a;GIS科研实验室公众号 1 数据来介绍 本次教程使用的数据为&#xff1a;各小区的点坐标&#xff08;来源房天下&#xff0c;坐标为CGCS2000&#xff09;&#xff1b;基础教育设施、商业服务设施、金融保险设施、医疗卫生设施的POI坐标&#xff08;来源高德…

java:找不到符号 符号:变量:log get set

问题&#xff1a;java&#xff1a;找不到符号&#xff1a;变量&#xff1a;log get set解决方法&#xff1a;在idea中&#xff0c;点击file-Settings&#xff0c;打开配置页面&#xff0c;如图红框位置&#xff0c;输入&#xff1a; -Djps.track.ap.dependenciesfalse

pyecharts案例四——动态GDP柱状图绘制

思路 for循环每一年的数据&#xff0c;基于每一年的数据&#xff0c;创建每一年的Bar对象&#xff0c;并且将该对象添加到时间线timeline中&#xff0c;最后设置自动播放并绘图 实现代码 from pyecharts.charts import Bar, Timeline from pyecharts.options import * from …

(7)自动调优

文章目录 前言 1 在自动调优模式下飞行前的设置 2 如何调用自动调优 3 在位置保持下调用自动调优 4 如果自动调优失败 5 补充说明 6 常见的问题 7 Dataflash日志记录 8 地面控制站消息 前言 AutoTune 试图自动调优稳定P&#xff0c;速率P和 D&#xff0c;以及最大旋转…

交流(直流)电流采集方案

芯片原理图 注意途中的绿色部分&#xff0c;说明此芯片可以采集交流或者直流 内部霍尔工作原理图 通过曲线可以确定再0A时输出电压为2.5v 只有随着电流的变化是大于2.5v或者小于2.5v&#xff08;交流负方向&#xff0c;或者直流负方向&#xff09; 下面是一个插排的拆解视频截…

9. ThreadLocal

9.1 ThreadLocal简介 9.1.1 面试题 ● ThreadLocal中ThreadLocalMap的数据结构和关系 ● ThreadLocal的key是弱引用&#xff0c;这是为什么&#xff1f; ● ThreadLocal内存泄漏问题你知道吗&#xff1f; ● ThreadLocal中最后为什么要加remove方法&#xff1f; 9.1.2 是什么&a…

KaiwuDB 受邀亮相山东省数字化转型论坛

4月21日&#xff0c;第十五届信博会暨中国&#xff08;济南&#xff09;数字经济高端峰会成功举办。KaiwuDB 受邀出席峰会重要论坛—山东省数字化转型论坛&#xff0c;并发表《工业物联网时代&#xff0c;数据库赋能企业数字化转型落地实践》主题演讲&#xff0c;与来自国内的 …

Java动态代理:优化静态代理模式的灵活解决方案

文章目录 代理模式定义具体实现分析优缺点 优化使用动态代理解决优化相关知识动态代理种类场景应用 代理模式 定义 代理模式&#xff0c;为其他对象提供一种代理以控制对这个对象的访问 具体实现 代理模式的具体实现描述可以分为以下几个步骤&#xff1a; 创建抽象对象接…