如何微调Spring Cloud Feign客户端?

时间:2016-09-14 21:33:43

标签: spring-cloud spring-cloud-netflix netflix-feign spring-cloud-feign feign

Spring Cloud doc说:

  

如果Hystrix在类路径上,默认情况下,Feign将包装所有方法   带断路器。

  1. 这很好,但如何配置Hystrix选项以忽略某些异常?我有一个{HTTP}状态代码映射到异常的ErrorDecoder实现。如果我将@HystrixCommand放在方法上,那么Feign会尊重它吗?
  2. 我们的要求是记录有关依赖项的每个HTTP调用的各种详细信息。目前,我有一个装饰RestTemplate来做到这一点。根据我在代码中看到的内容并根据Dave Syer的回答here,Feign不会使用RestTemplate。那么我该如何满足日志记录要求呢?界面feign.Client看起来很有希望,但我并不完全确定这是否是可以使用的界面。

4 个答案:

答案 0 :(得分:5)

  1. Feign不尊重@HystrixCommand,也不支持忽略异常。我的建议是禁用假装hystrix集成(feign.hystrix.enabled=false)并在假装之外使用hystrix。
  2. Feign支持RequestInterceptor,它会为您提供记录的位置。有关详细信息,请参阅the docs
  3. 示例:

    @FeignClient(name = "stores", configuration = StoreConfiguration.class)
    public interface StoreClient {
        //..
    }
    
    @Configuration
    public class StoreConfiguration {
    
        @Bean
        public LoggingRequestInterceptor loggingRequestInterceptor() {
            return new LoggingRequestInterceptor();
        }
    }
    

答案 1 :(得分:1)

您可以编写ErrorDecoder并抛出HystrixBadRequestException(https://github.com/Netflix/Hystrix/wiki/How-To-Use#error-propagation),以防止您不想触发断路器

答案 2 :(得分:0)

在这种情况下,我们使用自己的mime类型作为异常,因此即使错误情况也会以http 200响应但是自己的mime类型。然后我们可以在错误mime类型的情况下拦截200er响应,通过从响应错误代码反序列化来重新抛出与服务器端相同的异常,而不会被回退捕获。这适用于Feign和一些FeignBuildwr Magic

答案 3 :(得分:0)

就像@spencergibb所说的那样,Feign现在不支持忽略异常,为此我开了一个enhancement request。 至于我的第二个要求,RequestInterceptor并没有削减它,因为我需要响应时间RequestInterceptor无法访问。我最终实现了feign.Client并记录了execute方法所花费的时间。大多数代码都来自feign.Client.Default,太糟糕了,以至于该类不是为扩展而设计的。然后我在FeignBuilder中使用我的自定义客户端,如下所示:

@Bean
@Scope(SCOPE_PROTOTYPE)
public Feign.Builder feignBuilder() {
    return HystrixFeign.builder()
            .client(loggingEnabledFeignClient());
}

@Bean
Client loggingEnabledFeignClient() {
    return new LoggingEnabledFeignClient();
}