Używam Netflix Feign do wywoływania jednej operacji Microservice A do innej operacji Microservice B, która sprawdza kod za pomocą Spring Boot.Feign Netflix - Propaguj status i wyjątek za pomocą Microservices
Działanie Microservice B zgłasza wyjątek w przypadku niepowodzenia weryfikacji. Potem obsługiwane w Microservices i zwracają HttpStatus.UNPROCESSABLE_ENTITY
(422), jak obok:
@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;
}
tak, to kiedy Microservice dzwoni do B w interfejsie jako następny:
@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());
}
i walidacja nie powiedzie się zwraca błąd wewnętrzny 500 z następnej wiadomości:
{
"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"
}
Ale muszę wrócić tak samo jak praca Microservice B.
Jakie byłyby najlepsze sposoby lub techniki propagowania statusu i wyjątków za pomocą mikroserwisów za pomocą Netflix Feign?
Skąd mogłem wiedzieć, czy błąd pochodzi z otherOperation() lub validate()? Dzielę się Feign.builder(), więc chciałbym mieć ten sam ErrorDecoder, a moje kody i wiadomości nie będą takie same :( – Pau
Myślę, że możesz użyć parametru 'methodKey' w metodzie' decode' .Zgodnie z dokumentem API powinien on zawierać '{ @link feign.Feign # configKey} metody java, która wywołała żądanie. np. {@code IAM # getUser()} 'Tak, to może dać ci wskazówkę dotyczącą kontekstu –
Tak, dobra uwaga! To, czego chcę – Pau