@Component @Slf4j public class ServiceConsumerFallbackProvider implements FallbackProvider { @Override public ClientHttpResponse fallbackResponse(Throwable cause) { if (cause != null && cause.getCause() != null) { String reason = cause.getCause().getMessage(); //输出详细的回退原因 log.info("fallback reason: {}",reason); } //此处自定义回退返回结构体,本利写了个单例应对多线程 return new ClientHttpResponse(){ @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream(SingletonReturnJson.getInstace().toJSONString().getBytes("UTF-8")); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); //和body中的内容编码一致,否则容易乱码 headers.setContentType(MediaType.APPLICATION_JSON_UTF8); return headers; } /** * 网关向api服务请求是失败了,但是消费者客户端向网关发起的请求是OK的, * 不应该把api的404,500等问题抛给客户端 * 网关和api服务集群对于客户端来说是黑盒子 */ @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return HttpStatus.OK.value(); } @Override public String getStatusText() throws IOException { return HttpStatus.OK.getReasonPhrase(); } @Override public void close() { } }; } @Override public String getRoute() { return "*";//api服务id,如果需要所有调用都支持回退,则return "*"或return null } @Override public ClientHttpResponse fallbackResponse() { return null; }
}
public class SingletonReturnJson {
//双重检查锁 volatile private static JSONObject jsonObject=null; public static JSONObject getInstace(){ if(jsonObject==null) { syncInit(); } return jsonObject; } public static synchronized void syncInit(){ if(jsonObject==null){ jsonObject = new JSONObject(); jsonObject.put("code", "9999"); jsonObject.put("msg", "服务错误,请求失败"); } } }