上一篇:《Spring Cloud入门教程(五):API服务网关(Zuul) 上》
Zuul给我们的第一印象通常是这样:它包含了对请求的路由和过滤两个功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。然而实际上,路由功能在真正运行时,它的路由映射和请求转发都是由几个不同的过滤器完成的。其中,路由映射主要是通过PRE类型的过滤器完成,它将请求路径与配置的路由规则进行匹配,以找到需要转发的目标地址。而请求转发的部分则是由Route类型的过滤器来完成,对PRE类型过滤器获得的路由地址进行转发。所以,过滤器可以说是Zuul实现API网关功能最重要的核心部件,每一个进入Zuul的请求都会经过一系列的过滤器处理链得到请求响应并返回给客户端。
1. 过滤器简介
1.1 过滤器特性
Zuul过滤器的关键特性有:
- Type: 定义在请求执行过程中何时被执行;
- Execution Order: 当存在多个过滤器时,用来指示执行的顺序,值越小就会越早执行;
- Criteria: 执行的条件,即该过滤器何时会被触发;
- Action: 具体的动作。
过滤器之间并不会直接进行通信,而是通过RequestContext
来共享信息,RequestContext
是线程安全的。
对应上面Zuul过滤器的特性,我们在实现一个自定义过滤器时需要实现的方法有:
/**
* Zuul Pre-Type Filter
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
public class PreTypeZuulFilter extends ZuulFilter {
protected Logger logger = LoggerFactory.getLogger(PreTypeZuulFilter.class);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
this.logger.info("This is pre-type zuul filter.");
return null;
}
}
其中:
- filterType()方法是该过滤器的类型;
- filterOrder()方法返回的是执行顺序;
- shouldFilter()方法则是判断是否需要执行该过滤器;
- run()则是所要执行的具体过滤动作。
1.2 过滤器类型
Zuul中定义了四种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期。
PRE
过滤器: 在请求被路由之前调用, 可用来实现身份验证、在集群中选择请求的微服务、记录调试信息等;ROUTING
过滤器: 在路由请求时候被调用;POST
过滤器: 在路由到微服务以后执行, 可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等;ERROR
过滤器: 在处理请求过程时发生错误时被调用。
Zuul过滤器的类型其实也是Zuul过滤器的生命周期,通过下面这张图来了解它们的执行过程。
除了上面给出的四种默认的过滤器类型之外,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。
1.3 自定义过滤器示例代码
笔者自己没有单独构建一个过滤器示例的场景,我们看一下官方给出的几个示例。
PRE类型示例
public class QueryParamPreFilter extends