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

Posted

技术标签:

【中文标题】@FeignClient 在使用 eureka 服务 id 时总是超时【英文标题】:@FeignClient always timeout when using eureka service id 【发布时间】:2018-11-17 23:56:41 【问题描述】:

我有一个使用 Declarative Feign Client 的 spring-boot 应用程序

@ComponentScan
@EnableFeignClients
@EnableCircuitBreaker
@EnableDiscoveryClient
@EnableZuulProxy
@FeignClient(name = "$service-registry-name", fallbackFactory = MyFallbackFactory.class, configuration = CommonFeignConfiguration.class)
public interface MyClient 

    @RequestMapping(method = RequestMethod.GET, path = "/test/reference/data")
    HttpEntity<String> getAllData();

我有以下 application.yml

feign:
  okhttp:
    enabled: true

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    MyClient#getAllData():
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false


logging:
  level:
    project:
      user:
        MyClient: DEBUG

feign:
  client:
    config:
      feign-name:
        requestInterceptors: com.test.MyRequestHeaderProcessor

这个 spring-boot 应用程序运行良好,当我调试时,我可以看到 30000 的超时值已正确应用。

当我将此代码用作独立的 Spring Boot 应用程序,而是作为另一个项目的依赖 jar 时,问题就开始了。

此时,超时始终为 1000,这是默认值。我也设法覆盖了这一点。但尽管如此,我还是得到了 HystrixRunTimeException, Timeout with null。

我有 feign.hystrix.enabled=true。

如果我使用 feign.hystrix.enabled=false,我可以看到我的请求没有超时,但是后备机制无法工作。

但是,当我在 FeignClient 中添加 URL 属性时,它可以正常工作并且不会超时。我不能依赖 URL 属性,因为它来自可以更改的云代工服务 URL。

【问题讨论】:

我将 URL 属性添加到 @FeignClient,现在我没有收到超时问题。但这对我来说是一个糟糕的解决方法,因为 URL 是 CloudFoundy 服务 URL,它会发生变化。所以,现在我的问题陈述还包括,为什么 FeignClient 在我使用 service-id 名称(eureka 服务注册表)时超时但在我添加 URL 时没有超时?????? 【参考方案1】:

在 Application.yml 文件中添加以下属性。

feign:
  client: 
    config: 
      default:
         connectTimeout: 80000000
         readTimeout: 80000000

【讨论】:

以上是关于@FeignClient 在使用 eureka 服务 id 时总是超时的主要内容,如果未能解决你的问题,请参考以下文章

FeignClient中name和url属性的作用

Springcloud踩坑记---使用feignclient远程调用服务404

FeignClient中name和url属性的作用

是否可以在没有功能区的情况下使用@FeignClient?

在 Spring Boot 微服务中使用 FeignClient 报错 302

Spring cloud实现FeignClient指定Zone调用