4

Spring Cloud文档说:

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

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

4 回答 4

5
  1. Feign 不尊重@HystrixCommand也不支持忽略异常。我的建议是禁用 feigns hystrix 集成(feign.hystrix.enabled=false)并在 feign 之外使用 hystrix。
  2. Feign 支持RequestInterceptors,它会给你一个登录的地方。有关更多信息,请参阅文档

例子:

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

@Configuration
public class StoreConfiguration {

    @Bean
    public LoggingRequestInterceptor loggingRequestInterceptor() {
        return new LoggingRequestInterceptor();
    }
}
于 2016-09-15T17:32:41.147 回答
1

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

于 2016-11-29T21:25:50.313 回答
0

就像@spencergibb 所说,Feign 现在不支持忽略异常,为此我打开了一个增强请求。至于我的第二个要求, aRequestInterceptor没有削减它,因为我需要响应时间,而aRequestInterceptor无权访问。我最终实现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();
}
于 2016-09-27T19:46:40.540 回答
0

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

于 2016-09-15T20:47:07.543 回答