zoukankan      html  css  js  c++  java
  • zuul入门(3)开发zuul的过滤器

    1、编写Zuul过滤器(Java&Groovy)

    理解过滤器类型和请求生命周期后,我们来编写一个Zuul过滤器。编写Zuul的过滤器非常简单,我们只需继承抽象类ZuulFilter,然后实现几个抽象方法就可以了。

    那么现在,我们来编写一个简单的Zuul过滤器,让该过滤器打印请求日志。

    (1) 复制项目microservice-gateway-zuul,将ArtifactId修改为microservice-gateway-zuul-filter。

    (2) 编写自定义Zuul过滤器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class PreRequestLogFilter extends ZuulFilter {
     private static final Logger LOGGER = LoggerFactory.getLogger(PreRequestLogFilter.class);
     @Override
     public String filterType() {
     return "pre";
     }
     @Override
     public int filterOrder() {
     return 1;
     }
     @Override
     public boolean shouldFilter() {
     return true;
     }
     @Override
     public Object run() {
     RequestContext ctx = RequestContext.getCurrentContext();
     HttpServletRequest request = ctx.getRequest();
     PreRequestLogFilter.LOGGER.info(String.format("send %s request to %s", request.getMethod(), request.getRequestURL().toString()));
     return null;
     }
    }

    由代码可知,自定义的Zuul Filter需实现以下几个方法:

    1. filterType:返回过滤器的类型。有pre、route、post、error等几种取值,分别对应上文的几种过滤器。详细可以参考com.netflix.zuul.ZuulFilter.filterType() 中的注释。
    2. filterOrder:返回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字。
    3. shouldFilter:返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
    4. run:过滤器的具体逻辑。本例中,我们让它打印了请求的HTTP方法以及请求的地址。

    (2) 修改启动类,为启动类添加以下内容:

    1
    2
    3
    4
    @Bean
    public PreRequestLogFilter preRequestLogFilter() {
     return new PreRequestLogFilter();
    }

    3、测试Zuul过滤器

    (1) 启动microservice-discovery-eureka。

    (2) 启动microservice-provider-user。

    (3) 启动microservice-gateway-zuul-filter。

    (4) 访问http://localhost:8040/microservice-provider-user/1 ,可获得类似如下的日志。

    1
    [nio-8040-exec-6] c.i.c.s.filters.pre.PreRequestLogFilter : send GET request to http://localhost:8040//microservice-provider-user/1

    说明我们编写的自定义Zuul过滤器被执行了。

    4、禁用Zuul过滤器

    Spring Cloud默认为Zuul编写并启用了一些过滤器,例如DebugFilter、FormBodyWrapperFilter、PreDecorationFilter等。这些过滤器都存放在spring-cloud-netflix-core这个Jar包的org.springframework.cloud.netflix.zuul.filters包中。

    一些场景下,我们想要禁用掉部分过滤器,此时该怎么办呢?

    答案非常简单,只需设置zuul.<SimpleClassName>.<filterType>.disable=true ,即可禁用SimpleClassName所对应的过滤器。

    以过滤器org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter为例,只需设置zuul.SendResponseFilter.post.disable=true ,即可禁用该过滤器。

    5、几个过滤器的例子

    5.1、根据用户名来过滤

    通过继承ZuulFilter然后覆写上面的4个方法,实现一个简单的过滤器:

    filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

    • pre:可以在请求被路由之前调用
    • route:在路由请求时候被调用
    • post:在route和error过滤器之后被调用
    • error:处理请求时发生错误时被调用

    Zuul的主要请求生命周期包括“pre”,“route”和“post”等阶段。对于每个请求,都会运行具有这些类型的所有过滤器。 

    filterOrder:通过int值来定义过滤器的执行顺序

    shouldFilter:返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效

    run:过滤器的具体逻辑。需要注意,这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码

    过滤器间的协调
        过滤器没有直接的方式来访问对方。 它们可以使用RequestContext共享状态,这是一个类似Map的结构,具有一些显式访问方法用于被认为是Zuul的原语,内部是使用ThreadLocal实现的。

    5.2、根据密码来过滤

    5.3、post过滤器

  • 相关阅读:
    python用win32com模拟浏览器
    python判断输入的字符串是否为数字
    phpwind9.0去掉头部版权信息 Powered by phpwind
    Python批量查询网站收录
    结巴分词 python中文分词
    phpwind 9.0 RC版[20121108],伪静态无效的问题
    [转]LINQ: Building an IQueryable provider series
    获取鼠标选择的文本内容之JavaScript代码
    M2级遍历和范围Range
    转:浏览器的用户代理字符串
  • 原文地址:https://www.cnblogs.com/lexiaofei/p/7097676.html
Copyright © 2011-2022 走看看