承接上篇
使用Zuul进行请求分发的过程中,当后端服务出现异常时,不希望将异常抛出给最外层暴露给客户端,期望服务可以像hystrix熔断器中一样进行降级操作,这需要我们设置去路由熔断,提供一个回退机制。当某个服务出现异常,直接返回我们的预设信息。
- 启动类中添加@EnableZuulProxy注解
- 新建类实现ZuulFallbackProvider接口 (ZuulFallbackProvider,无法查看异常信息。Spring已经将此类进行了扩展--FallbackProvider,在返回内容中添加了异常信息,可根据自己需求进行选择)
自定义 FallBack实现类代码如下
getRoute()方法:指定对某个服务访问出问题时进行熔断处理。
fallBackResponese():自定义返回值来处理错误请求。
@Slf4j
@Component
public class ZuulFallBack implements ZuulFallbackProvider {
/**
* 返回值表示需要针对此微服务进行回退处理(必须是在注册中心中的service-id).
* Zuul目前只支持服务级别的熔断,对具体某个URL的熔断暂不支持
* @return
*/
@Override
public String getRoute() {
return "eureka-client"; //服务Id ,若需要所有服务调用都支持回退,返回null 或者 * 即可
}
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
/**
* 客户端向网关发送服务成功,网关向api服务请求失败,不应该把api的404 500 等问题抛给客户端
* 网关和api服务对客户端来说都是黑盒子。
* @return
* @throws IOException
*/
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "OK";
}
@Override
public void close() {
}
/**
* 微服务出现宕机后,客户端再次请求就会返回fallback中的预设值
* @return
* @throws IOException
*/
@Override
public InputStream getBody() throws IOException {
//服务异常时,输出此处内容,并打印错误日志
log.error("error appear ");
return new ByteArrayInputStream("this service is ubable use".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
服务出现异常时:浏览器最终显示自定义的值,并且此处有日志打印,控制台中也可看到