首页 > 其他分享 >openfeign超时重试

openfeign超时重试

时间:2023-04-01 20:35:25浏览次数:30  
标签:feign 调用 openfeign 重试 超时 hello ribbon

通过http调用服务受网络影响较大,当网络波动时,http调用可能会失败,需要去重试,可以手动重试,这样代码会很不优雅。所幸feign有自己的超时重试机制,Ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制。

 

样例搭建

修改Producer模块中的controller,将

@RequestMapping("/hello")
public String hello(String name) {
    return "hello," + name + "," + port;
}

修改为:

private AtomicInteger count = new AtomicInteger();

@RequestMapping("/hello")
public String hello(String name, HttpServletResponse response) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    int i = count.addAndGet(1);
    System.out.println("调用次数:"+i);
    return "hello," + name + "," + port;
}

用睡眠时间模拟处理请求。

 

修改端口为8000,上面的睡眠时间为1000后启动。然后修改端口为8002,上面的睡眠时间为4000,启动。

feign提供的超时重试

feign.client.config.default.connectTimeout=1000
feign.client.config.default.readTimeout=2000

connectTimeout是连接超时时间(ms),readTimeout是业务逻辑超时时间(ms),readTimeout设置为2000ms,上面启动了两个服务,一个睡眠了1000ms,模拟处理不超时,一个睡眠了4000ms,模拟处理超时。default表示对所有feign都起作用,如果要对单个feign起作用将default改成feign要调用的服务名。

 

通过openfeign+ribbon调用服务,访问http://localhost:8003/helloByFeign,第一次调用了端口为8000的服务,得到结果为:hello,张三,8000。再次访问http://localhost:8003/helloByFeign,第一次调用了端口为8002的服务,可以看到:

 
 

openfeign提供的重试次数是默认关闭的。要开启openfeign的重试机制,在application.properties配置:

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

也可以通过配置类配置:

@Bean
public Retryer retryer() {
    return new Retryer.Default(1000,3000,2);
}

第一个参数是重试间隔时间,第二个参数是最大重试间隔时间,第三个参数是最大重试次数。

重启两个Producer服务提供方。然后访问http://localhost:8003/helloByFeign,第一次调用端口为8000的服务,看到控制台:

 

第二次调用,调用端口为8002的服务:

发了一次请求调用了两次服务。多点几次,查看控制台。

 
端口为8000的服务:

 
端口为8002的服务:

可以看到随着调用次数的增多,越来越多的调用往通的服务方,但是还有较少的次数去调用不通的服务方。

 
 

ribbon提供的超时重试

在application.properties配置:

ribbon.connectTimeout=1000
ribbon.readTimeout=2000
ribbon.MaxAutoRetries=2
ribbon.MaxAutoRetriesNextServer=2
ribbon.OkToRetryOnAllOperations=false

connectTimeout和readTimeout与feign的意思相同。MaxAutoRetries表示同一台实例最大重试次数,不包括首次调用,MaxAutoRetriesNextServer表示重试负载均衡其他的实例最大重试次数,不包括首次调用,OkToRetryOnAllOperations表示是否所有操作都重试。结果和上面类似。

标签:feign,调用,openfeign,重试,超时,hello,ribbon
From: https://www.cnblogs.com/shigongp/p/17279135.html

相关文章

  • openfeign开启日志
    openfeign的日志级别有:NONE:默认,不开启日志BASIC:只记录请求方法和URL以及响应状态代码和执行时间HEADERS:记录基本信息以及请求和响应标头。FULL:记录请求和响应的标题、正文和元数据。  全局日志加入Logger.LevelBean:@ConfigurationpublicclassMyConfigration{......
  • SpringCloud之openFeign
    FeignOpenFeign是Netflix开发的声明式、模板化的HTTP请求客户端。可以更加便捷、优雅地调用httpapi。OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。feign主要是构建微服务消费端。只要使用OpenF......
  • mysql,pg连接重试参数配置
    PostgreSQLJDBCURL连接重试的示例:StringdbUrl="jdbc:postgresql://localhost:5432/mydb?autoReconnect=true&maxReconnects=5&connectTimeout=5000";Connectionconnection=null;try{connection=DriverManager.getConnection(dbUrl,"user......
  • Seata锁等待超时问题排查
    生产环境,一个简单的事务方法,提交失败,报Globallockwaittimeout伪代码如下:@GlobalTransactional(rollbackFor=Exception.class,timeoutMills=30000,lockRetryInter......
  • jmeter中通过PerfMon Metrics Collector插件监控CPU和内存等等显示ConnectException连
    一、问题定位1、jmeter中通过PerfMon Metrics Collector插件监控CPU和内存等等显示ConnectException连接超时2、定位到是因为服务器端没有启动serverAgent.sh代理,启动......
  • 微服务架构中的链路超时分析
    1、前言1.1现象(问题)​ 微服务架构项目落地过程中,开发人员一般都遇到过调用超时问题,大部分时候会出现在feign接口调用上,这是微服务与单体服务最大的区别,单体从来不用考虑......
  • openfeign 请求异常
    在OpenFeign中,如果发生请求异常,是不会走到Decoder的。Decoder主要是用于将HTTP响应体转换为Java对象的,只有在请求成功并且返回了正确的HTTP响应体时才会被调用......
  • WPF中使用ClientWebSocket会和服务器开启一个连接,HttpWebRequest调用服务器接口的时候
    使用ClientWebSocket的时候是通过async/await语法糖来实现同步的异步编程,本质就是Task开启任务,所以是以多线程的形式执行,此时最大的并发连接数就是2或者10个,所以可以代码设......
  • Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用a
    场景Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类:Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解......
  • python超时处理方法eventlet的eventlet.Timeout
    一、前言在使用python进行接口自动化测试、脚本编写、执行sql的时候,如果遇到以下问题的,都可以用eventlet.timeout这个方法。执行下载数据的接口,数据量较大导致后面接口......