如何微调 Spring Cloud Feign 客户端?

How to fine-tune the Spring Cloud Feign client?

Spring云doc说:

If Hystrix is on the classpath, by default Feign will wrap all methods with a circuit breaker.

  1. 这很好,但是如何配置 Hystrix 选项以忽略某些异常?我有一个将 HTTP 状态代码映射到异常的 ErrorDecoder 实现。如果我把 @HystrixCommand 放在方法上,Feign 是否尊重它?
  2. 我们的要求是记录有关对依赖项进行的每个 HTTP 调用的各种详细信息。目前我有一个装饰 RestTemplate 可以做到这一点。从我在代码中看到的以及基于 Dave Syer 的回答 ,Feign 不使用 RestTemplate。那么如何满足日志记录要求呢?界面 feign.Client 看起来很有前途,尽管我不完全确定它是否适合使用。
  1. Feign 不支持 @HystrixCommand 并且不支持忽略异常。我的建议是禁用 feigns hystrix 集成(feign.hystrix.enabled=false)并在 feign 之外使用 hystrix。
  2. Feign 支持 RequestInterceptors,这将为您提供一个登录的地方。有关详细信息,请参阅 the docs

示例:

@FeignClient(name = "stores", configuration = StoreConfiguration.class)
public interface StoreClient {
    //..
}

@Configuration
public class StoreConfiguration {

    @Bean
    public LoggingRequestInterceptor loggingRequestInterceptor() {
        return new LoggingRequestInterceptor();
    }
}

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

正如@spencergibb所说,Feign现在不支持忽略异常,为此我开了一个enhancement request。 至于我的第二个要求,RequestInterceptor 不会削减它,因为我需要 RequestInterceptor 无法访问的响应时间。我最终实现了 feign.Client 并记录了 execute 方法所花费的时间。大部分代码取自 feign.Client.Default,可惜 class 不是为扩展而设计的。然后我在 FeignBuilder 中使用我的自定义客户端,如下所示:

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

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

你可以编写 ErrorDecoder 并抛出 HystrixBadRequestException (https://github.com/Netflix/Hystrix/wiki/How-To-Use#error-propagation) 在你不想触发断路器的异常上