Ich verwende Netflix Feign, um eine Operation eines Microservice A zu einer anderen Operation eines Microservice B aufzurufen, der einen Code mit Spring Boot validiert.Netflix Feign - propagate Status und Ausnahme durch Microservices
Der Betrieb von Microservice B löst eine Ausnahme aus, wenn die Validierung schlecht war. Dann behandeln ich in dem Microservice und gebe ein HttpStatus.UNPROCESSABLE_ENTITY
(422) wie weiter:
@ExceptionHandler({
ValidateException.class
})
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
@ResponseBody
public Object validationException(final HttpServletRequest request, final validateException exception) {
log.error(exception.getMessage(), exception);
error.setErrorMessage(exception.getMessage());
error.setErrorCode(exception.getCode().toString());
return error;
}
Also, wenn Micro A in einer Schnittstelle, wie neben B ruft:
@Headers("Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestLine("GET /other")
void otherOperation(@Param("other") String other);
@Headers("Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestLine("GET /code/validate")
Boolean validate(@Param("prefix") String prefix);
static PromotionClient connect() {
return Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.target(PromotionClient.class, Urls.SERVICE_URL.toString());
}
und die Validierungen nicht Zurückgegeben ein interner Fehler 500 mit dem nächsten Nachricht:
{
"timestamp": "2016-08-05T09:17:49.939+0000",
"status": 500,
"error": "Internal Server Error",
"exception": "feign.FeignException",
"message": "status 422 reading Client#validate(String); content:\n{\r\n \"errorCode\" : \"VALIDATION_EXISTS\",\r\n \"errorMessage\" : \"Code already exists.\"\r\n}",
"path": "/code/validate"
}
Aber ich brauche das gleiche wie der Micro Betrieb B.
zurückzukehrenWich wären die besten Wege oder Techniken, um Status und Ausnahmen durch Microservices mit Netflix Feign zu propagieren?
Wie könnte ich, wenn der Fehler kennen kommt von otherOperation() oder validate()? Ich teile das Feign.builder() also hätte ich den gleichen ErrorDecoder und meine Codes und die Nachricht werden nicht die gleichen sein :( – Pau
Ich denke, Sie können den 'methodKey' Parameter der' decode' Methode verwenden. Entsprechend dem API doc sollte er '{ @link feign.Feign # configKey} der Java-Methode, die die Anfrage aufgerufen hat, zB {@code IAM # getUser()} 'Damit kann man einen Hinweis auf den Kontext geben –
Ja, schöner Punkt, es ist was ich will – Pau