API网关Zuul——5 (Zuul的异常处理)

Spring Cloud Zuul对异常的处理是非常方便的,但是由于Spring Cloud处于迅速发展中,各个版本之间有所差异,本案例是以Finchley.RELEASE版本为例,来说明Spring Cloud Zuul中的异常处理问题。

1. Zuul请求的生命周期图

在这里插入图片描述

1.正常情况下所有的请求都是按照pre、route、post的顺序来执行,然后由post返回response
2.在pre阶段,如果有自定义的过滤器则执行自定义的过滤器
3.pre、routing、post的任意一个阶段如果抛异常了,则执行error过滤器

2. 异常处理(两种方式)

2.1 禁用默认SendErrorFilter过滤器,自定义ErrorFilter过滤器

禁用zuul的默认异常处理SendErrorFilter过滤器,定义我们自己的ErrorFilter过滤器

2.1.1 配置文件yml Filter
# 覆盖掉SendErrorFilter过滤器
# 使用自定义 ErrorFilter过滤器
zuul:
	SendErrorFilter:
		error:
			disable: true
@Component
public class ErrorFilter extends ZuulFilter {
    //日志
    private  static final Logger LOGGER = LoggerFactory.getLogger(ErrorFilter.class);
    //类型是错误
    @Override
    public String filterType() {
        return "error";
    }
    //顺序为 1
    @Override
    public int filterOrder() {
        return 1;
    }
    //使用的过滤器
    @Override
    public boolean shouldFilter() {
        return true;
    }
    //过滤器业务逻辑
    @Override
    public Object run() throws ZuulException {
        try {
            //获取 Request上下文
            RequestContext context = RequestContext.getCurrentContext();
            //获取异常
            ZuulException exception = (ZuulException)context.getThrowable();
            //记录日志进入系统异常拦截
            LOGGER.error("进入系统异常拦截”",exception) ;
            //获取 response对象
            HttpServletResponse response = context.getResponse();
            //response对象 设置格式
            response.setContentType("application/json; charset=utf8");
            //response对象 设置状态
            response.setStatus(exception.nStatusCode) ;
            //输出
            PrintWriter writer = null;

            try {
                writer = response.getWriter();
                writer.print("{code:" + exception.nStatusCode + ",message:\"" + exception.getMessage());
            } catch (IOException e){
                e.printStackTrace();
            } finally {
                if (writer != null){
                    writer.close();
                }
            }
        } catch (Exception var5){
            ReflectionUtils.rethrowRuntimeException(var5);
        }
        return null;
    }
}

2.1.2 没有异常我们人为构造一个异常

在这里插入图片描述

2.1.3 测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 自定义全局error错误页面

自定义全局Error 和 上述 自定义ErrorFilter过滤器 不要一起使用
创建一个controller 继承ErrorController

//表示返回json
@RestController
public class ErrorHandlerController implements ErrorController {

    /**
     * 出异常后进入该方法,交由下面方法处理
     * @return
     */
    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping("/error")
    public Object error(){
        RequestContext currentContext = RequestContext.getCurrentContext();
        ZuulException throwable = (ZuulException) currentContext.getThrowable();
        return throwable.nStatusCode + "--" + throwable.getMessage();
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值