博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud 微服务 (十四) 服务网关 Zuul 过滤器(Pre&Post)
阅读量:6395 次
发布时间:2019-06-23

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

hot3.png

上篇学习了zuul路由,这边继续学习,粗糙的记录zuul过滤器的用法

 

现在对请求url做个约定,在请求url上没有带参数key=123的url全部过滤掉

①localhost:7000/product/list?key=1234         ---不过滤

②localhost:7000/product/list                        ---过滤,不执行

完成以上功能,在gateway服务中,代码如下 : 

package com.cloud.gateway.filters;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/** * 常量类 * 过滤器状态 FilterConstants * 请求状态 HttpStatus * 引用其中的属性值即可,无需自己写 */@Componentpublic class PreFilter extends ZuulFilter {    /**     * filter类型     * @return     */    @Override    public String filterType() {        return PRE_TYPE;    }    /**     * filter执行顺序,值越小优先级越高     * 官方推荐使用x-1方式优先排序     * @return     */    @Override    public int filterOrder() {        return PRE_DECORATION_FILTER_ORDER - 1;    }    /**     * filter 开启关闭     * @return     */    @Override    public boolean shouldFilter() {        return true;    }    /**     * 实现filter逻辑     * @return     * @throws ZuulException     */    @Override    public Object run() throws ZuulException {        RequestContext requestContext = RequestContext.getCurrentContext();        HttpServletRequest request =requestContext.getRequest();        String key=request.getParameter("key");        //如果不存在,则设置没有权限不通过,状态为401        if (StringUtils.isEmpty(key)){            requestContext.setSendZuulResponse(false);            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());        }        return null;    }}

浏览器访问成功则返回list列表,失败则返回错误页面,错误码:401

 

再来实现一个post过滤器,在得到结果之后,实现在post filter阶段,返回response的,给header头部加点信息,代码如下: 

package com.cloud.gateway.filters;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletResponse;import java.util.UUID;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER;/** * 常量类 * 过滤器状态 FilterConstants * 请求状态 HttpStatus * 引用其中的属性值即可,无需自己写 */@Componentpublic class PostFilter extends ZuulFilter {    /**     * filter类型     *     * @return     */    @Override    public String filterType() {        return POST_TYPE;    }    /**     * filter执行顺序,值越小优先级越高     * 官方推荐使用x-1方式优先排序     *     * @return     */    @Override    public int filterOrder() {        return SEND_RESPONSE_FILTER_ORDER - 1;    }    /**     * filter 开启关闭     *     * @return     */    @Override    public boolean shouldFilter() {        return true;    }    /**     * 实现filter逻辑     *     * @return     * @throws ZuulException     */    @Override    public Object run() throws ZuulException {        RequestContext requestContext = RequestContext.getCurrentContext();        HttpServletResponse response = requestContext.getResponse();        response.setHeader("POST-UUID", UUID.randomUUID().toString());        return null;    }}

 

浏览器控制台 请求信息 : 

096d53f00453b4f6cbbc72cd1070eb66270.jpg

 

写了两次, 套路也都摸清了,能写的地方也就这么几个点,后面再做 限流 操作,结合上面学的,限流做在请求filter最靠前的地方,比鉴权pre前执行,不然流量都进去了,这里需要一个算法---令牌桶算法,这个算法很多地方已经实现了,拿来用即可,意思是以一定速率将令牌放入桶中,桶中的令牌满了,就不会再放进去了,外部的请求进入,请求将获得桶中的令牌,得令牌者可通行,没有令牌请求将被拒绝

下面代码实现 : 

package com.cloud.gateway.filters;import com.cloud.gateway.exceptions.RateLimiterException;import com.google.common.util.concurrent.RateLimiter;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.exception.ZuulException;import org.springframework.stereotype.Component;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;/** * 限流 */@Componentpublic class RateLimiterFilter extends ZuulFilter {    //create 每秒放入100个令牌    private static final RateLimiter RATE_LIMITER = RateLimiter.create(100);    /**     * filter类型     *     * @return     */    @Override    public String filterType() {        return PRE_TYPE;    }    /**     * filter执行顺序,值越小优先级越高     * 官方推荐使用x-1方式优先排序     * 选择最高优先级SERVLET_DETECTION_FILTER_ORDER,并-1     *     * @return     */    @Override    public int filterOrder() {        return SERVLET_DETECTION_FILTER_ORDER - 1;    }    /**     * filter 开启关闭     *     * @return     */    @Override    public boolean shouldFilter() {        return true;    }    /**     * 实现filter逻辑     *     * @return     * @throws ZuulException     */    @Override    public Object run() throws ZuulException {        //判断--获取通行令牌-->如果没有令牌不等于之前的没有权限401,可以抛出自定义异常或者其他处理        if (!RATE_LIMITER.tryAcquire()) {            throw new RateLimiterException();        }        return null;    }}

自定义异常: 

package com.cloud.gateway.exceptions;public class RateLimiterException extends RuntimeException {}

 

以上是过滤器的简单示例

还有一个Zuul关于鉴权的使用,涉及新建user服务,也会用到docker、redis,刚刚入手mac,上面什么都没有,装好了再继续下面的学习实践

 

---------------------------------------------------------

转载于:https://my.oschina.net/u/3829444/blog/1843948

你可能感兴趣的文章
模仿与创新
查看>>
Python用subprocess的Popen来调用系统命令
查看>>
Java NIO与IO的差别和比較
查看>>
.NET源代码的内部排序实现
查看>>
解决Strict Standards: Only variables should be passed by reference
查看>>
解决JBoss只能通过localhost(127.0.0.1)而不能通过IP访问
查看>>
MS SQL处理双引号(DoubleQuote)函数
查看>>
[智能架构系列]什么是Buddy智能开发框架
查看>>
三十一、关于android camera setParameters出错
查看>>
【收藏】QCIF、 CIF、2CIF、DCIF、D1(4CIF)格式介绍
查看>>
hdu 3836 Equivalent Sets (tarjan缩点)
查看>>
一些iOS高效开源类库(转)
查看>>
JAVA编程心得-JAVA实现CRC-CCITT(XMODEM)算法
查看>>
C# DES加密
查看>>
浅谈Oracle分区表之范围分区
查看>>
IBM Tivoli NetView网管软件实战
查看>>
IPSec逻辑体系架构
查看>>
Exchange 2013部署系列之(六)配置邮件流和客户端访问
查看>>
List of Free Programming books
查看>>
思考Android架构(二):像Android框架,如何(How-to)吸引开发者来使用它呢?
查看>>