Spring Cloud Zuul 服务网关(核心过滤器)
写在前面 本文参考以下文章,请参考原文
Spring Cloud Zuul :包含对请求的路由和过滤两个功能
- 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础
- 过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础
其实Spring Cloud Zuul 路由功能也是由过滤器实现的,它的路由映射和请求转发都是由几个不同的过滤器完成的
- 路由映射主要通过pre类型的过滤器完成,它将请求路径与配置的路由规则进行匹配,以找到需要转发的目标地址
- 请求转发的部分则是由route类型的过滤器来完成,对pre类型过滤器获得的路由地址进行转发
所以,过滤器可以说是Zuul实现API网关功能最为核心的部件,每一个进入Zuul的HTTP请求都会经过一系列的过滤器处理链得到请求响应并返回给客户端。
过滤器:Zuul实现API网关最核心的部件
在Spring Cloud Zuul中实现的过滤器必须包含4个基本特征:过滤类型、执行顺序、执行条件、具体操作。定义一个过滤器只要继承ZuulFilter类
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.exception.ZuulException; public class AccessFilter extends ZuulFilter { @Override public boolean shouldFilter() { // TODO Auto-generated method stub return false; } @Override public Object run() throws ZuulException { // TODO Auto-generated method stub return null; } @Override public String filterType() { // TODO Auto-generated method stub return null; } @Override public int filterOrder() { // TODO Auto-generated method stub return 0; } }
- filterType:返回一个字符串来代表过滤器的类型,这个类型就是在HTTP请求过程中定义的各个阶段。在Zuul中默认定义了四种不同生命周期的过滤器类型,具体如下:
- pre:可以在请求被路由之前调用。
- routing:在路由请求时候被调用。
- post:在routing和error过滤器之后被调用。
- error:处理请求时发生错误时被调用。
- filterOrder:通过int值来定义过滤器的执行顺序,数值越小优先级越高。
- shouldFilter:返回一个boolean类型来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。
- run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。