FeignClient 超时如何解决

Posted

技术标签:

【中文标题】FeignClient 超时如何解决【英文标题】:How to solve Timeout FeignClient 【发布时间】:2016-10-31 00:30:51 【问题描述】:

在使用使用FeignClient 在 SQL Server 中执行查询的服务时,我的应用程序出现以下错误。

错误:

线程“pool-10-thread-14”中的异常 feign.RetryableException:读取执行 GET 超时 http://127.0.0.1:8876/processoData/search/buscaProcessoPorCliente?cliente=ELEKTRO+-+TRABALHISTA&estado=SP

我的消费者服务:

@FeignClient(url="http://127.0.0.1:8876")
public interface ProcessoConsumer 

@RequestMapping(method = RequestMethod.GET, value = "/processoData/search/buscaProcessoPorCliente?cliente=cliente&estado=estado")
public PagedResources<ProcessoDTO> buscaProcessoClienteEstado(@PathVariable("cliente") String cliente, @PathVariable("estado") String estado);


我的 YML:

server:
  port: 8874

endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false

eureka:
  client:
  serviceUrl:
    defaultZone: $vcap.services.eureka-service.credentials.uri:http://xxx.xx.xxx.xx:8764/eureka/
  instance: 
    preferIpAddress: true

ribbon:
  eureka:
    enabled: true

spring:
  application:
    name: MyApplication
  data:
    mongodb:
      host: xxx.xx.xxx.xx
      port: 27017
      uri: mongodb://xxx.xx.xxx.xx/recortesExtrator
      repositories.enabled: true
    solr:
      host: http://xxx.xx.xxx.xx:8983/solr
      repositories.enabled: true

有人知道怎么解决吗?

谢谢。

【问题讨论】:

嗨 Renan,在这之后你会收到超时错误,调用后端通常需要多长时间? 为什么你的 Feign 客户端说端口 8876 而你的 YML 配置说端口 8874? 【参考方案1】:

看看这个answer。它对我有用。我也做了一些研究,在这里找到了属性文档:

https://github.com/Netflix/Hystrix/wiki/Configuration#intro

【讨论】:

这本质上是一个仅链接的答案。【参考方案2】:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000

确保ribbon的超时时间大于hystrix

【讨论】:

反之亦然:“当使用包装 Ribbon 客户端的 Hystrix 命令时,您要确保将 Hystrix 超时配置为长于配置的 Ribbon 超时,包括任何可能的重试例如,如果您的 Ribbon 连接超时为 1 秒,并且 Ribbon 客户端可能会重试请求 3 次,那么您的 Hystrix 超时应该略多于 3 秒。 cloud.spring.io/spring-cloud-netflix/single/… 更新了@AlexanderPalamarchuk 评论来源的链接:cloud.spring.io/spring-cloud-netflix/multi/…【参考方案3】:

刚刚也遇到了这个问题。正如@spencergibb 所建议的,这里是我正在使用的解决方法。见link

在 application.properties 中添加这些。

# Disable Hystrix timeout globally (for all services)
hystrix.command.default.execution.timeout.enabled: false

# Increase the Hystrix timeout to 60s (globally)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000

将此添加到 Java 配置类中。

import feign.Request;

@Configuration
@EnableDiscoveryClient
@EnableFeignClients(basePackageClasses =  ServiceFeignClient.class )
@ComponentScan(basePackageClasses =  ServiceFeignClient.class )
public class FeignConfig 

    /**
     * Method to create a bean to increase the timeout value, 
     * It is used to overcome the Retryable exception while invoking the feign client.
     * @param env,
     *            An @link ConfigurableEnvironment
     * @return A @link Request
     */
    @Bean
    public static Request.Options requestOptions(ConfigurableEnvironment env) 
        int ribbonReadTimeout = env.getProperty("ribbon.ReadTimeout", int.class, 70000);
        int ribbonConnectionTimeout = env.getProperty("ribbon.ConnectTimeout", int.class, 60000);

        return new Request.Options(ribbonConnectionTimeout, ribbonReadTimeout);
    

【讨论】:

谢谢。我不使用 Hystrix,以及所有其他使用功能区的建议。读取和连接超时对我不起作用。但是添加这个 bean 解决了它。【参考方案4】:

在 application.properties 中添加这些

feign.hystrix.enabled=false hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

【讨论】:

【参考方案5】:

将以下属性添加到application.properties 文件中,以毫秒为单位。

feign.client.config.default.connectTimeout=160000000
feign.client.config.default.readTimeout=160000000

【讨论】:

尝试了各种具有 Hystrix、ribbon 等属性的黑魔法,这是我遇到的最干净(且有效)的解决方案。 要注意的是,两者都需要设置才能使它们中的任何一个生效。 ??‍♂️这里是相关的source 我尝试了同样的问题,只有在设置了两个属性后才修复超时。另一个提示,您可以为不同的 API 配置不同的超时,替换 API feignName 的 default 字,如 here 所述【参考方案6】:

尤里卡: 客户: eureka-server-read-timeout-seconds: 30

【讨论】:

【参考方案7】:

我正在使用 Feign.builder() 来实例化我的 Feign 客户端。

为了设置connectTimeoutreadTimeout,我使用以下代码:

Feign.builder()
     ...
     .options(new Request.Options(connectTimeout, readTimeout))
     .target(MyApiInterface.class, url);

使用它我可以为不同的 API 配置不同的超时时间。

【讨论】:

这个 .options 现在已弃用,最好使用新的 .options(new Request.Options(CONNECTION_TIME_OUT_IN_SEC, TimeUnit.SECONDS,CONNECTION_TIME_OUT_IN_SEC, TimeUnit.Seconds, true))。最后一个参数是followRedirects。您可以根据提供的单位给出任何超时值。

以上是关于FeignClient 超时如何解决的主要内容,如果未能解决你的问题,请参考以下文章

@FeignClient 在使用 eureka 服务 id 时总是超时

feign 同一服务多个client解决办法

如何解决超时过期问题?

如何解决云功能超时错误?

如何解决高并发,连接等待超时的异常

如何解决SSH连接Linux超时自动断开