(六)api网关服务 zuul-过滤器

开启上文服务:

 

Zuul给咱们的第一印象一般是这样:它包含了对请求的路由和过滤两个功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。然而实际上,路由功能在真正运行时,它的路由映射和请求转发都是由几个不一样的过滤器完成的。其中,路由映射主要是经过PRE类型的过滤器完成,它将请求路径与配置的路由规则进行匹配,以找到须要转发的目标地址。而请求转发的部分则是由Route类型的过滤器来完成,对PRE类型过滤器得到的路由地址进行转发。因此,过滤器能够说是Zuul实现API网关功能最重要的核心部件,每个进入Zuul的请求都会通过一系列的过滤器处理链获得请求响应并返回给客户端。


Zuul(ZuulFilter)过滤器的关键特性有:java

  • Type: 定义在请求执行过程当中什么时候被执行;
  • Execution Order: 当存在多个过滤器时,用来指示执行的顺序,值越小就会越早执行;
  • Criteria: 执行的条件,即该过滤器什么时候会被触发;
  • Action: 具体的动做。
@Component
public class MyZuulFilterPre extends ZuulFilter {
    private static Logger log = LoggerFactory.getLogger(MyZuulFilterPre.class);

    //filterType:返回一个字符串表明过滤器的类型
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;      //pre:路由以前   route:路由之时  post: 路由以后  error:发送错误调用
    }

    //filterOrder:过滤的顺序
    @Override
    public int filterOrder() {
        return 0;
    }


    //这里能够写逻辑判断,是否要过滤,本文true,永远过滤
    @Override
    public boolean shouldFilter() {
        return true;
    }


    //过滤器的具体逻辑。判断该请求到底有没有权限访问。
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if (accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            } catch (Exception e) {
            }

            return null;
        }
        log.info("ok");
        return null;
    }
}

 

测试结果:app

 

Zuul中定义了四种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期。ide

  • PRE过滤器: 在请求被路由以前调用, 可用来实现身份验证、在集群中选择请求的微服务、记录调试信息等;
  • ROUTING过滤器: 在路由请求时候被调用;
  • POST过滤器: 在路由到微服务之后执行, 可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等;
  • ERROR过滤器: 在处理请求过程时发生错误时被调用。

除了上面给出的四种默认的过滤器类型以外,Zuul还容许咱们建立自定义的过滤器类型。(暂没尝试)微服务

 

禁用过滤器

只须要在application.properties(或yml)中配置须要禁用的filter,格式为:zuul.[filter-name].[filter-type].disable=truepost

zuul.MyZuulFilterPre.pre.disable=true

  


连接:https://www.jianshu.com/p/f786a11a2def
來源:简书测试

相关文章
相关标签/搜索