I'm new to microservices, I have configured zuul for API gateway and Eureka for service registry and I have 3 microservices registered and running without any problem via zuul API gateway but when I manually down one service and try to access through zuul it gives 500 internal server error.
error message. { "timestamp": 1568197371584, "status": 500, "error": "Internal Server Error", "message": "route:RibbonRoutingFilter" }
but I want is to give a custom error message like "this service is not working" with a status code 406.
I tried this way, but I'm lost after a few steps
@Configuration
public class HystrixFallbackConfiguration {
@Bean
public FallbackProvider zuulFallbackProvider() {
return new FallbackProvider() {
@Override
public String getRoute() {
return "image_service";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return null;
}
};
}
}
I think you need Zuulfilter with filterType as error. you can take reference from the below code. In this way you would be able to log the the custom exception with msg.
public class CustomErrorFilter extends ZuulFilter {
private static final Logger LOG = LoggerFactory.getLogger(CustomErrorFilter.class);
@Override
public String filterType() {
return "post";
}
@Override
public int filterOrder() {
return -1;
}
@Override
public boolean shouldFilter() {
RequestContext ctx=RequestContext.getCurrentContext();
if(ctx.getThrowable()!=null)
return true;
else
return false;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setThrowable(null); // response is not returned unless
throwable is set to null.
ctx.remove("error.status_code");
ctx.setResponseBody(“Error”);
ctx.getResponse().setContentType("text/plain");
ctx.setResponseStatusCode(400);
}
return null;
}