Spring Cloud Zuul中过滤器部分逻辑解析

关于Zuul的基础使用可以参考 SpringCloud全家桶—Zuul网关

拦截入口

首先看一下Zuul网关的入口类ZuulServlet,继承了HttpServlet,通过service方法拦截所有的get/post请求。

    @Override
    public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException {
        try {
            init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);

            // Marks this request as having passed through the "Zuul engine", as opposed to servlets
            // explicitly bound in web.xml, for which requests will not have the same data attached
            RequestContext context = RequestContext.getCurrentContext();
            context.setZuulEngineRan();

            try {
                preRoute();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                route();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                postRoute();
            } catch (ZuulException e) {
                error(e);
                return;
            }

        } catch (Throwable e) {
            error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));
        } finally {
            RequestContext.getCurrentContext().unset();
        }
    }

四种过滤器执行顺序

首先通过这部分源码可以得出一个在Zuul中四种过滤器的执行顺序。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最终无论是哪种过滤器都会执行到这个部分,然后通过type来区分

zuul中每种类型自带的过滤器

pre类型的

在这里插入图片描述
route类型的

在这里插入图片描述
post类型的

在这里插入图片描述

自定义过滤器重写shouldFliter和run两个方法的调用

runFilters的主要作用就是根据不同类型的过滤器,遍历并挨个执行。

在这里插入图片描述

在这里插入图片描述

主要处理业务逻辑的方法。

在这里插入图片描述

requestContext.setSendZuulResponse(false)控制是否路由

sendZuulResponse用来判断是否需要进行路由,这个值一般在自定义路由的时候会进行设置。

在这里插入图片描述

SimpleHostRoutingFilter、RibbonRoutingFilter在执行时都会对这个属性进行判断,确认是否需要对其进行路由。

SimpleHostRoutingFilter,配置文件中配置的是:指定url方式。

	@Override
	public boolean shouldFilter() {
		return RequestContext.getCurrentContext().getRouteHost() != null
				&& RequestContext.getCurrentContext().sendZuulResponse();
	}

RibbonRoutingFilter,配置文件中配置的是:指定服务名方式,从eureka拉取服务列表,通过ribbon负载均衡调用

	@Override
	public boolean shouldFilter() {
		RequestContext ctx = RequestContext.getCurrentContext();
		return (ctx.getRouteHost() == null && ctx.get(SERVICE_ID_KEY) != null
				&& ctx.sendZuulResponse());
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码拉松

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

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

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

打赏作者

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

抵扣说明:

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

余额充值