3

Весна Облако doc говорит:Как отрегулировать клиента Spring Cloud Feign?

Если Hystrix находится на пути к классам, по умолчанию Feign будет обернуть все методы с выключателем.

  1. Это хорошо, но как я могу настроить параметры Hystrix игнорировать определенные исключения? У меня есть реализация ErrorDecoder, которая отображает код состояния HTTP для исключений. Если я положил @HystrixCommand на метод, значит ли это честь?
  2. Наше требование состоит в том, чтобы записывать различные сведения о каждом HTTP-вызове, вызванном зависимостями. В настоящее время я украшен RestTemplate, который делает это. Из того, что я вижу в коде и на основе ответа Дейва Сиера here, Feign не использует RestTemplate. Итак, как мне выполнить требование регистрации? Интерфейс feign.Client выглядит многообещающим, хотя я не совсем уверен, что это тот, который нужно использовать.

ответ

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(); 
} 
4
  1. Feign не чтит @HystrixCommand и не поддерживает игнорирование исключений. Мое предложение состоит в том, чтобы отключить интеграцию гиксизма симуляторов (feign.hystrix.enabled=false) и использовать гистеру вне фокуса.
  2. Feign поддерживает RequestInterceptor s, который даст вам место для регистрации. См. the docs для получения дополнительной информации.

Пример:

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

@Configuration 
public class StoreConfiguration { 

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

Спасибо, я буду стараться вышесказанное. Что вы думаете о том, что я открываю запрос на улучшение для симуляции для поддержки аннотации «HystrixCommand»? –

+0

Я не думаю, что он будет летать (feign не использует javanica, откуда приходит аннотация), но просить о возможности установки игнорируемых исключений было бы нормально (поскольку это не имеет значения для реализации). – spencergibb

+0

https://github.com/spring-cloud/spring-cloud-netflix/issues/1346 –

0

Мы используем собственный тип пантомимы для исключения в таком случае так даже случаи ошибки будут откликнувшимся с HTTP 200, но собственный типом MIME. Затем мы можем перехватить ответ 200er в случае типа mime ошибки повторить то же исключение, что и на стороне сервера, путем десериализации из кода ошибки ответа, не будучи захваченным резервным копированием. Это работает wirh Feign и некоторые FeignBuildwr Magic

+0

У вас есть несколько проблем с этим подходом. Возвращение 200 для случая ошибки является нарушением спецификации HTTP. Кроме того, это не то, для чего предназначен тип mime. –

1

Вы можете написать ErrorDecoder и бросить HystrixBadRequestException (https://github.com/Netflix/Hystrix/wiki/How-To-Use#error-propagation) на исключении того, что вы не хотите, не для запуска автоматического выключателя

+0

Спасибо. Тем не менее, я думаю, что отключить поддержку Fitch hystrix ('feign.hystrix.enabled = false') и использовать' @ HystrixCommand' по методу вызывающего абонента проще. Вот что я сейчас делаю. –

+0

И вы используете ignroeExceptions @HystrixCommand? –

+0

Да, используя 'ignoreExceptions'. –