Feign的远程调用--微服务重试的坑

简介: Feign的远程调用--微服务重试的坑

背景

spring cloud Hoxton.SR1
微服务多实例发布时,通过Ribbon实现的重试机制,在停掉一个服务之后并没有触发重试机制

我的主要配置(服务的消费者)

ribbon:
  eager-load:
    enabled: true
  ReadTimeout: 10000            # 获取到响应内容的超时时间
  ConnectTimeout: 2000          # 连接超时时间
  MaxAutoRetries: 0             # 在当前服务重试的次数
  MaxAutoRetriesNextServer: 1   # "默认轮询去重选列表中服务" 的次数
  OkToRetryOnAllOperations: false  #是否所有操作都重试  (默认false)   非GET方式请求,只有ConnectException 才会进行重试

测试发现一个服务的提供者突然停止后,通过feign远程调用,并没有进行重试,而是直接降级处理;
于是,我关闭了降级处理,让控制台把错误抛出来看看。
结果发现错误是 java.net.SocketTimeoutException: connect timed out

测试

**自己写段代码在windows上测试了一下:

      public static void main(String[] args) throws InterruptedException {
   
   

            ConcurrentHashMap<Integer, Object> c = new ConcurrentHashMap<>(1000);
            //设置超时时间 (单位:ms)
            final int timeout = 2000;

            for(int i=0; i<1000; i++){
   
   
                int ii =i;
                new Thread(new Runnable() {
   
   
                    @Override
                    public void run() {
   
   
                        Socket socket = new Socket();
                        try {
   
   
                            socket.connect(new InetSocketAddress("127.0.0.1", 8080), timeout);
                        } catch (IOException e) {
   
   
                            if (e instanceof ConnectException){
   
   
                                System.out.println(ii + e.getClass().getName() + ": " + e.getMessage());
                            }else{
   
   
                                System.err.println(ii + e.getClass().getName() + ": " + e.getMessage());
                                c.put(ii,e.getClass().getName() + ": " + e.getMessage());
                            }
                        }
                    }
                }).start();
            }
            //等他执行一会
            TimeUnit.SECONDS.sleep(10);

            System.out.println("非ConnectException的数量: " + c.size());
//        SpringApplication.run(NnhxOrderApplication.class, args);
    }

当timeout设置为 2000ms 时:

几乎很少出现符合重试机制要求的ConnectException了几乎很少出现符合重试机制要求的ConnectException了

当timeout设置为 2050ms 时:

现在已经全部都是ConnectException了
在这里插入图片描述

打了个jar包,在阿里云服务器CentOS上测试(timeout=2050)

也全部都是ConnectException在这里插入图片描述

于是又在centos上分别测试了 timout为2000、1000、500

结果全部也都是 ConnectException

这确实是个比较有意思的现象,大家觉得呢?

在windows上修改 ribbon.ConnectTimeout: 2050

测试发现,现在的确可以重试了;

针对此问题可以关注github:

issues: SocketTimeoutException(connect time out) is not judged as a ConnectionException:
https://github.com/Netflix/ribbon/issues/359

相关文章
|
7月前
|
机器学习/深度学习 负载均衡 Java
【SpringBoot系列】微服务远程调用Open Feign深度学习
【4月更文挑战第9天】微服务远程调度open Feign 框架学习
349 2
|
2月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
141 1
|
3月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
672 2
|
7月前
|
负载均衡 Java Apache
【微服务系列笔记】Feign
Feign是一个声明式的伪HTTP客户端,它使得HTTP请求变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解。
159 8
|
负载均衡 Java Maven
微服务技术系列教程(23) - SpringCloud- 声明式服务调用Feign
微服务技术系列教程(23) - SpringCloud- 声明式服务调用Feign
119 0
|
7月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
|
7月前
|
Java Apache 开发者
【微服务】5、声明式 HTTP 客户端 —— Feign
【微服务】5、声明式 HTTP 客户端 —— Feign
110 0
|
负载均衡 Dubbo 网络协议
微服务RPC框架:Feign和Dubbo
微服务RPC框架:Feign和Dubbo
764 0
|
负载均衡 Java 开发者
微服务组件 Open Feign 远程调用
OpenFeign是一个声明式的Web服务客户端,它是Spring Cloud生态系统中的一个组件,用于简化和优化微服务之间的远程调用。通过使用注解和接口定义的方式,开发者可以轻松地实现对其他微服务的访问。 使用OpenFeign,您只需定义一个接口,并通过注解来配置该接口对应的远程服务的URL、请求方法、请求参数等信息,OpenFeign将自动生成可用于调用远程服务的实现。这样,您就可以像调用本地方法一样调用远程服务,而无需编写繁琐的HTTP请求和解析代码。
244 0
|
Cloud Native 应用服务中间件 Go
深入解析:探索Nginx与Feign交锋的背后故事 - 如何优雅解决微服务通信中的`301 Moved Permanently`之谜!
深入解析:探索Nginx与Feign交锋的背后故事 - 如何优雅解决微服务通信中的`301 Moved Permanently`之谜!
136 0

热门文章

最新文章