Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题,ribbon Read timed out

一、问题原因

  Gateway ribbon 超时时间设置 

ribbon:
  #Ribbon允许最大连接数,即所有后端微服务实例请求并发数之和的最大值。
  MaxTotalConnections: 500
  #单个后端微服务实例能接收的最大请求并发数  
  MaxConnectionsPerHost: 500
  ReadTimeout: 2000
  ConnectTimeout: 2000
  # 关闭Ribbon的重试机制
  MaxAutoRetriesNextServer: 0 #慎用

hystrix:
  threadpool:
    default:
      coreSize: 20 #并发执行的最大线程数,默认10
      maxQueueSize: 500 #BlockingQueue的最大队列数,默认值-1
      queueSizeRejectionThreshold: 500 #即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝,默认值5
  command:
    default:
      execution:
        timeout:
        #如果enabled设置为false,则请求超时交给ribbon控制
          enabled: false

   此时调用auth模块验证token,auth模块调用customer模块查询用户,此时设置ribbon read时间也是2秒

ReadTimeout: 2000

   调用接口出现问题,2.647秒超过了2秒

poc-auth-service.post /auth/checktoken: 2.647s

Key	Value
error	Read timed out

 

二、解决方法

    因为首次系统加载需要额外时间,第一次时间会比较久,尽量设置折中的时间。

    Gateway超时时间设置长些 ,解决问题

ReadTimeout: 4000

   

网上说,加上以下ribbon初始化,会减少消耗时间,但是我测了没效果

#从Dalston开始,Ribbon支持配置eager load实现在启动时就初始化Ribbon相关类。
  eager-load:
    enabled: true
    clients: client1, client2, client3

 

解决Spring CloudFeign+Ribbon第一次请求失败问题时,可以采取以下方法: 1. 增加请求重试:在Feign的配置类,通过设置requestOptions的maxAutoRetries和maxAutoRetriesNextServer属性,来设置重试的次数和重试下一个服务的次数。例如: ``` @Configuration public class FeignConfig { @Bean public Retryer feignRetryer() { return new Retryer.Default(100, SECONDS.toMillis(1), 5); } } ``` 该配置将在请求失败后最多重试5次。 2. 修改Ribbon的超时设置:通过修改Ribbon的超时时间,可以增加请求的等待时间,从而减少第一次请求失败的概率。可以在配置文件设置ribbon.ReadTimeoutribbon.ConnectTimeout属性。例如: ``` ribbon: ReadTimeout: 5000 ConnectTimeout: 5000 ``` 上述配置将将Ribbon的读取和连接超时时间都设置为5000毫秒。 3. 添加Hystrix熔断机制:通过在Feign接口上添加@HystrixCommand注解,并在注解指定fallback方法,来处理请求失败情况。例如: ``` @FeignClient(name = "example-service", fallback = ExampleFallback.class) public interface ExampleService { @GetMapping("/example") @HystrixCommand(fallbackMethod = "fallback") String example(); } @Component public class ExampleFallback implements ExampleService { @Override public String example() { return "fallback"; } } ``` 上述配置,如果请求失败,将会调用fallback方法返回一个默认的结果。 请注意,上述方法只是解决Spring CloudFeign+Ribbon第一次请求失败的一种方式,具体要根据实际情况和需求进行调整。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值