首页 > 其他分享 >【工具使用】【OpenFeign 】OpenFeign 下的重试机制

【工具使用】【OpenFeign 】OpenFeign 下的重试机制

时间:2024-09-07 17:25:22浏览次数:13  
标签:OpenFeign interval long 重试 maxPeriod 工具 超时

1  前言

服务间的调用,大家可能会用到 OpenFeign 方式。那么当被调用服务可能会因为某种情况导致调用失败(这个失败可能好似下游服务重启了或者超时断开等)的情况下,我们想重试的情况下该怎么做呢?本节我们就来看看。

2  环境准备

首先准备一下,我这里有两个服务,一个是 demo 一个是 virtuous,本地启动的 Eureka。

一个简单的调用过程,我这里简单画个图描述一下:

Virutous 服务通过 TestFeign 继而调用到 Demo 服务的 testFeign 接口。

3  重试

那我们看看这个重试,重试的话怎么让调用失败呢?

(1)可以在 Demo 服务接口里让他睡眠,触发 OpenFeign 的响应超时

# 响应超时时间
feign.client.config.default.read-timeout=1000

(2)可以把 Demo 服务停掉,这样就会导致 OpenFeign 连接超时 ?是这样么?其实不会,因为连接超时,意味着最起码我能去连接或者说是在连接,而停掉 Demo 服务意味着压根连接不上比如我们常见的 Connection Refused 甚至 Load balancer does not have available server for client: demo。所以简单的停掉并不会触发连接超时。至于怎么能触发可能就是那种 Demo 服务比较频繁,并发量大的情况下吧,这个我不太敢断言,还请有知道的小伙伴指点告知。

# 连接超时时间
feign.client.config.default.connect-timeout=1000

那我们这里就用睡眠来触发响应超时吧,响应超时设置 1秒,Demo 服务睡眠 2秒,然后就会出现 Read Timeout:

OpenFeign 默认情况下是不会自动开启超时重试的,要想重试的话,有两种方式:

(1)启用默认的超时重试,在 Retryer 接口中有一个默认的重试器,但是在重试的过程中你想看这是重试第几次等看到一些自定义的行为是不行的,所以可以用第二种方式自定义重试器

(2)自定义重试器,实现 Retryer 接口即可

3.1  启用默认的重试器

简单一点儿的我们可以直接在配置上设置默认的重试器:

feign.client.config.default.retryer=feign.Retryer.Default

但是这种默认的是 间隔100毫秒,重试5次,如果你想改变默认重试器的间隔等,可以这样:

@Configuration
public class RetryConfig {
    @Bean
    public Retryer retryer() {
        return new Retryer.Default(
                1000,   // 重试间隔时间
                1000,       // 最大重试间隔时间
                3           // 最大重试次数
        );     
    }
}

看效果总共耗时 8秒,第一次耗时1秒触发超时重试间隔 1秒,第3秒发送第一次重试,间隔 1秒,第5秒发送第二次重试,间隔1秒,第7秒发送第三次重试还超时达到最大重试次数,第8秒返回。

3.2  自定义重试器

这里我们直接在默认的基础上加上一点日志信息:

package com.virtuous.demo.config;
 
import feign.RetryableException;
import feign.Retryer;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author kuku
 */
@Slf4j
public class VirtuousFeignRetryer extends Retryer.Default {

    private final int maxAttempts;
    private final long period;
    private final long maxPeriod;
    int attempt;
    long sleptForMillis;

    public VirtuousFeignRetryer() {
        // 默认间隔 1秒 最大间隔 1秒 重试3次
        this(1000L, TimeUnit.SECONDS.toMillis(1L), 3);
    }

    public VirtuousFeignRetryer(long period, long maxPeriod, int maxAttempts) {
        this.period = period;
        this.maxPeriod = maxPeriod;
        this.maxAttempts = maxAttempts;
        this.attempt = 1;
    }

    protected long currentTimeMillis() {
        return System.currentTimeMillis();
    }

    public void continueOrPropagate(RetryableException e) {
        log.info("当前重试:第{}次,最大重试:{}", this.attempt, this.maxAttempts);
        if (this.attempt++ >= this.maxAttempts) {
            throw e;
        } else {
            long interval;
            if (e.retryAfter() != null) {
                interval = e.retryAfter().getTime() - this.currentTimeMillis();
                if (interval > this.maxPeriod) {
                    interval = this.maxPeriod;
                }

                if (interval < 0L) {
                    return;
                }
            } else {
                interval = this.nextMaxInterval();
            }

            try {
                Thread.sleep(interval);
            } catch (InterruptedException var5) {
                Thread.currentThread().interrupt();
                throw e;
            }

            this.sleptForMillis += interval;
        }
    }

    long nextMaxInterval() {
        long interval = (long)((double)this.period * Math.pow(1.5, (double)(this.attempt - 1)));
        return interval > this.maxPeriod ? this.maxPeriod : interval;
    }

    public Retryer clone() {
        return new VirtuousFeignRetryer(this.period, this.maxPeriod, this.maxAttempts);
    }
}

最后修改配置:

feign.client.config.default.retryer=com.virtuous.demo.config.VirtuousFeignRetryer

看效果:

4  小结

好啦,本节我们简单尝试了下 OpenFeign 的重试,至于原理的话,我们下节空了看,有理解不对的地方,欢迎指正。

标签:OpenFeign,interval,long,重试,maxPeriod,工具,超时
From: https://www.cnblogs.com/kukuxjx/p/18401803

相关文章

  • Rsync: 高效的文件同步工具
    rsync是一个非常流行的命令行工具,用于高效地同步文件和目录。它广泛用于Linux和UNIX系统,但也可以在Windows上通过Cygwin或WSL(WindowsSubsystemforLinux)使用。本文将介绍rsync的基本概念、特点以及如何使用它来同步文件。什么是Rsync?rsync(remotesynchroniza......
  • 数仓工具之:Flume
    Flume是一个日志数据抽取工具Agent:是Flume中的基本单位,一个Flume配置文件,可以有多个Agent.每一个Agent中有三个组件组成,缺一不可:1、Source来源,数据过来的地方2、channel通道传递数据用的通道,一般比较的长,一个Channel中可以存储多个数据3、Sink数据下沉的地方......
  • Node.js版本管理工具之NVM
    目录一、NVM介绍二、NVM的下载安装1、NVM下载2、卸载旧版Node.js3、安装三、NVM配置及使用1、设置nvm镜像源2、安装Node.js3、卸载Node.js4、使用或切换Node.js版本5、设置全局安装路径和缓存路径四、常用命令 一、NVM介绍在工作中,不同的项目可能需要不同NodeJS版本,所以维护多......
  • 探索最佳 Shell 工具:全面测评 Bash、Zsh、Fish、Tcsh 和 Ksh
    感谢浪浪云支持发布浪浪云活动链接:https://langlangy.cn/?i8afa52文章目录1.简介2.测评工具3.测评标准4.Bash测评4.1易用性4.2功能特性4.3性能4.4可定制性4.5社区和支持5.Zsh测评5.1易用性5.2功能特性5.3性能5.4可定制性5.5社区和支持6.Fish测......
  • NAT技术介绍+缺陷(内网穿透+工具),NAPT(介绍,替换过程,原理,NAT转换表)
    目录NAT技术介绍NAT转换表引入介绍NAPT技术介绍 NAPT替换过程NAPT原理注意点NAT缺陷无法直接访问其他内网主机内网穿透工具其他 NAT技术介绍NAT是一种网络技术,它允许在一个公共IP地址和多个私有IP地址(入口路由器的wan口地址和私网内的私有ip)之......
  • MySQL 性能压测工具-sysbench使用详解
    sysbench是一个开源的、基于LuaJIT(LuaJIT是Lua的即时编译器,可将代码直接翻译成机器码,性能比原生lua要高) 的、可自定义脚本的多线程基准测试工具,也是目前用得最多的MySQL性能压测工具。基于sysbench,我们可以对比MySQL在不同版本、不同硬件配置、不同参数(操作系统和数据......
  • 我司使用了两年的高效日志打印工具,非常牛逼!
    为了更方便地排查问题,电商交易系统的日志中需要记录用户id和订单id等字段。然而,每次打印日志都需要手动设置用户id,这一过程非常繁琐,需要想个办法优化下。log.warn("user:{},orderId:{}订单提单成功",userId,orderId);log.warn("user:{},orderId:{}订单支付成功",userId,orde......
  • 安卓玩机工具-----ADB方式的刷机玩机工具“秋之盒”’ 测试各项功能预览
    秋之盒    安卓玩机工具-秋之盒是一款ADB刷机工具箱,基于谷歌ADB的一款绿色安装,具备了海量扩展模块,支持ADB刷机救砖、一键激活黑域、adb指令修复等功能,是一款开源、免费、易用的手机刷机工具!      并且是一款开源、免费、易用的图形化ADB工具箱,一切功能......
  • 推荐我常用的5个爬虫插件&工具,非常强大~
    爬虫,又称为网络爬虫或网页爬虫,是一种自动浏览互联网的程序,它按照一定的算法顺序访问网页,并从中提取有用信息。爬虫软件通常由以下几部分组成:- 用户代理(User-Agent):模拟浏览器访问,避免被网站识别为机器人。- 请求处理:发送HTTP请求,获取网页内容。- 内容解析:使用正则表达式或......
  • Kali 安装炫彩蛇(MSF图形化工具)
    本教程使用手动安装的形式。参考文献:首次安装(yuque.com) 准备安装文件这里在KaliLinux系统进行安装。切换到root用户。 将install.sh添加到虚拟机的某个目录(我直接上传到家目录里面了),脚本从raw.githubusercontent.com/docker/docker-install/master/install.sh下载 ......