up:: 通过网关zuul实现路由功能

说明:

那我们首先看一看在zuul有哪几种过滤器,第一个是 pre在请求之前运行的,通常情况下,我们的鉴权是放在这里的,因为在没有权限的时候,你不应该访问后续的内容,同样的,它还有一个 route, 第三种的是 post, 是在请求完成之后进行运行的。通常什么时候会用到这个呢?比如说你去统计各个请求所运行的时长了,那这个时候就可以在 pre 去首先把这个当前时间记下来,然后呢在 post 里面把时间进行减,这样就能得到总共的时长,那么第四种类型的是,如果在请求处理的过程中发生了错误,那这个 error 过滤器会进行运行。

四种过滤器:

pre过滤器

package com.imooc.course.filter;
 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
 
/**
 * 描述:     记录请求时间
 */
@Component
public class PreRequestFilter extends ZuulFilter {
 
    @Override
    public String filterType() {
        //过滤器的类型
        return FilterConstants.PRE_TYPE;
    }
 
    @Override
    public int filterOrder() {
        return 0;
    }
 
    @Override
    public boolean shouldFilter() {
        //是否启用过滤器
        return true;
    }
 
    @Override
    public Object run() throws ZuulException {
        RequestContext currentContext = RequestContext.getCurrentContext();
        currentContext.set("startTime", System.currentTimeMillis());
        System.out.println("过滤器已经记录时间");
        return null;
    }
}

注意需要继承ZuulFilter类

post过滤器

package com.imooc.course.filter;
 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
 
/**
 * 描述:     请求处理后的过滤器
 */
@Component
public class PostRequestFilter extends ZuulFilter {
 
    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }
 
    @Override
    public int filterOrder() {
        return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
    }
 
    @Override
    public boolean shouldFilter() {
        return true;
    }
 
    @Override
    public Object run() throws ZuulException {
        RequestContext currentContext = RequestContext.getCurrentContext();
        Long startTime = (Long) currentContext.get("startTime");
        long duration = System.currentTimeMillis() - startTime;
        String requestURI = currentContext.getRequest().getRequestURI();
        System.out.println("uri:" + requestURI + ",处理时长:" + duration);
        return null;
    }
}

shouldFilter该方法表示是否执行该过滤器,也可以说是该过滤器的一个开关。 run过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。

看完上述的源码之后,这里我们再来编写自定的Filter代码。 首先继承ZuulFilter该类,然后实现里面的方法。 首先是shouldFilter方法,这里我们就直接返回true; 然后是filterType,这里我们就设置为前置过滤器,在请求被路由之前调用。 继而是filterOrder,这里我们就设置0; 最后是run,这是过滤器的核心业务代码,这里我们就简单一点,获取请求的url,如果该url携带了token,我们就让他通过,否则直接拦截

说明:

Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。 Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据

关于RequestContext需要多查资料学习,复习servlet知识。。