博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(六)api网关服务 zuul-过滤器
阅读量:6123 次
发布时间:2019-06-21

本文共 2232 字,大约阅读时间需要 7 分钟。

开启上文服务:

 

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

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

  • Type: 定义在请求执行过程中何时被执行;
  • Execution Order: 当存在多个过滤器时,用来指示执行的顺序,值越小就会越早执行;
  • Criteria: 执行的条件,即该过滤器何时会被触发;
  • Action: 具体的动作。
@Componentpublic 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;    }}

 

测试结果:

 

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

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

除了上面给出的四种默认的过滤器类型之外,Zuul还允许我们创建自定义的过滤器类型。(暂没尝试)

 

禁用过滤器

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

zuul.MyZuulFilterPre.pre.disable=true

  

链接:https://www.jianshu.com/p/f786a11a2def
來源:简书

转载于:https://www.cnblogs.com/skyLogin/p/10191239.html

你可能感兴趣的文章
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
must implement java.io.Serializable hessian
查看>>
Microsoft Licenses Flash Lite for Windows Mobile Users
查看>>
HDOJ 2020 绝对值排序
查看>>
HDOJ/HDU 2560 Buildings(嗯~水题)
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
[20170628]12C ORA-54032.txt
查看>>
除以2
查看>>
高可用集群原理解析
查看>>
Nginx配置URL转向tomcat
查看>>
极客Web前端开发资源大荟萃#001
查看>>
让div固定在某个位置
查看>>
Java开发环境Docker镜像
查看>>
从无到有,WebService Apache Axis2初步实践
查看>>
任务调度(一)——jdk自带的Timer
查看>>
UIKit框架(15)PCH头文件
查看>>
整理看到的好的文档
查看>>