2016-08-11 2 views
0

Wir versuchen, Spring Cloud Netflix in die Produktionsumgebung zu bringen. Im Moment haben wir ein Problem mit der Fehlerbehandlung von Geschäftslogik.Spring Cloud Netflix: Remote-Service-Fehlerbehandlung mit Feign

Wir verwenden Feign als HTTP-REST-Client. Microservice A muss den Microservice B aufrufen, der in verschiedenen JVM (oder physischen Servern) bereitgestellt wird. Der Microservice B gibt möglicherweise eine Fehlernachricht zurück, die zum Geschäft gehört. Zum Beispiel muss A Auftragsinformationen von B abfragen, aber die Auftrags-ID existiert möglicherweise nicht, so dass B die Fehlermeldung zurückgeben muss, die A mitteilt, dass diese Bestellung nicht existiert. A hat if-else Urteil aus der Rückmeldung zu tun, um zu bestimmen, ob es erorrs ist, dann wird Code wie der folgende Schnipsel sein:

//remoteServiceA is an interface annotated with @FeignClient 
resultA = remoteServiceA.foo(); 
if (resultA.hasError) { 

} else { 

} 

resultB = remoteServiceB.foo(); 
if (resultB.hasError) { 

} else { 

} 

// ... ... 

Es gibt so viele if-else, so dass es nicht genug anmutig ist. Was wir wollen ist remoteServieA.foo() kann eine selbst definierte Laufzeit Ausnahme wie OrderNotExistException werfen. Irgendeine Idee, um dieses Ziel zu erreichen?

+0

Im Sinne von REST-APIs sollte der zurückgegebene HTTP-Fehlercode selbsterklärend sein. Wenn Sie also nach einem Auftrag (einer Ressource) suchen und einen 404 erhalten, bedeutet dies "Ressource nicht gefunden", was "Auftrag nicht gefunden" ist. – cherit

Antwort

0

Ich habe dieses Problem gelöst. Ich habe die ErrorDecoder Komponente von Feign angepasst, in der ich meine eigene Ausnahme gemäß der HTTP-Originalantwort werfen kann.

0

Wenn Sie Hystrix aktiviert haben, sollten Sie in der Lage sein, serviceA.foo() in einen try-Block zu packen und eine Ausnahme in Ihren Remote-Dienst zu werfen.

try { 
    serviceA.foo(); 
} catch(HystrixRuntimeException ex) { 
    throw new OrderNotExistException("Error message"); 
} 

Sie haben noch in Rechnung zu tragen, dass Sie diese Art von Ausnahme, wenn Ihr Remote-Service antwortet nicht fangen kann, oder wenn ein anderer Fehler passiert. Vielleicht finden Sie Informationen die Ausnahme über was passiert ist und entscheiden, ob Sie Ihre Ausnahme werfen sollten.

Das erste, was mir in den Sinn kommt, aber in einem meiner Projekte arbeiten.

+0

Dies wird wiederum zu einem if-else-Urteil führen, über das das OP spricht. – cherit

Verwandte Themen