Spring Cloud doc说:
如果Hystrix在类路径上,默认情况下,Feign将包装所有方法 带断路器。
ErrorDecoder
实现。如果我将@HystrixCommand
放在方法上,那么Feign会尊重它吗?RestTemplate
来做到这一点。根据我在代码中看到的内容并根据Dave Syer的回答here,Feign不会使用RestTemplate
。那么我该如何满足日志记录要求呢?界面feign.Client
看起来很有希望,但我并不完全确定这是否是可以使用的界面。答案 0 :(得分:5)
@HystrixCommand
,也不支持忽略异常。我的建议是禁用假装hystrix集成(feign.hystrix.enabled=false
)并在假装之外使用hystrix。RequestInterceptor
,它会为您提供记录的位置。有关详细信息,请参阅the docs。示例:
@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();
}