3

Der Frühling Wolke doc sagt:Wie kann der Spring Cloud Feign-Client optimiert werden?

Wenn Hystrix auf dem Classpath ist standardmäßig Feign werden alle Methoden mit einem Leistungsschalter wickeln.

  1. Das ist gut, aber wie ich die Hystrix Optionen konfigurieren Sie bestimmte Ausnahmen zu ignorieren? Ich habe eine ErrorDecoder Implementierung, die HTTP-Statuscode Ausnahmen zuordnet. Wenn ich @HystrixCommand auf die Methode setze, respektiert Feign das?
  2. Unsere Anforderung besteht darin, verschiedene Details zu jedem HTTP-Aufruf zu den Abhängigkeiten zu protokollieren. Zur Zeit habe ich eine dekorierte RestTemplate, die das tut. Von dem, was ich im Code sehe und basierend auf Dave Syers Antwort here, verwendet Feign keine RestTemplate. Wie kann ich die Protokollierungsanforderungen erfüllen? Die Schnittstelle feign.Client sieht vielversprechend aus, obwohl ich mir nicht ganz sicher bin, ob das die richtige ist.

Antwort

0

Wie @spencergibb sagte, Feign unterstützt nicht ignorieren Ausnahme jetzt, für die ich eine enhancement request geöffnet. Wie für meine zweite Anforderung, ein RequestInterceptor schneidet es nicht, weil ich die Antwortzeit brauche, auf die der RequestInterceptor keinen Zugriff hat. Ich beendete die Implementierung der feign.Client und Protokollierung der Zeit von der execute Methode genommen. Der Großteil des Codes stammt aus feign.Client.Default, schade, dass diese Klasse nicht für die Erweiterung ausgelegt ist. Ich habe dann meine benutzerdefinierte Client in einem FeignBuilder wie folgt verwenden:

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

@Bean 
Client loggingEnabledFeignClient() { 
    return new LoggingEnabledFeignClient(); 
} 
4
  1. Feign nicht @HystrixCommand ehren und unterstützt keine Ausnahmen zu ignorieren. Mein Vorschlag ist, figigns hystrix Integration (feign.hystrix.enabled=false) zu sperren und hystrix außerhalb des Scheines zu verwenden.
  2. Feign unterstützt RequestInterceptor s, mit denen Sie sich anmelden können. Weitere Informationen finden Sie unter the docs.

Beispiel:

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

@Configuration 
public class StoreConfiguration { 

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

Danke auslösen wollen, ich werde versuchen, obenstehendes. Was denkst du über mich, wenn ich eine Verbesserungsanfrage für die Vorführung von "HystrixCommand" Annotation öffne? –

+0

Ich denke nicht, dass es fliegen würde (faign verwendet javanica nicht, wo die Annotation herkommt), aber nach der Möglichkeit zu fragen, die ignorierten Ausnahmen zu setzen, wäre in Ordnung (da es die Implementierung nicht interessiert). – spencergibb

+0

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

0

Wir verwenden einen eigenen MIME-Typ für Ausnahmen in einem solchen Fall so auch Fehlerfälle wird mit http 200 aber eigene MIME-Typ reagiert werden. Dann können wir die 200er-Antwort abfangen, im Falle eines Fehlermime-Typs und die gleiche Ausnahme wie auf der Server-Seite durch Deserialisierung aus dem Antwort-Fehlercode wiederholen, ohne von einem Fallback abgefangen zu werden. Dies funktioniert mit Feign und einige FeignBuildwr Magic

+0

Sie haben mehr als ein Problem mit diesem Ansatz. Die Rückgabe von 200 für einen Fehlerfall ist eine Verletzung der HTTP-Spezifikation. Auch dafür ist der Mime-Typ nicht gedacht. –

1

Sie können ErrorDecoder schreiben und werfen HystrixBadRequestException (https://github.com/Netflix/Hystrix/wiki/How-To-Use#error-propagation) auf Ausnahme, dass Sie nicht den Schutzschalter

+0

Danke. Ich denke jedoch, die Feign-Hystrix-Unterstützung ('feign.hystrix.enabled = false') zu deaktivieren und einen' @HystrixCommand' für die Aufrufer-Methode zu verwenden, ist einfacher. Das mache ich jetzt. –

+0

Und Sie verwenden ignroeExceptions von @HystrixCommand? –

+0

Ja, mit 'ignoreExceptions'. –

Verwandte Themen