SpringCloud 微服务 (十四) 服务网关 Zuul 过滤器(Pre&Post)

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

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

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

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

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

1package com.cloud.gateway.filters; 2 3import com.netflix.zuul.ZuulFilter; 4import com.netflix.zuul.context.RequestContext; 5import com.netflix.zuul.exception.ZuulException; 6import org.springframework.http.HttpStatus; 7import org.springframework.stereotype.Component; 8import org.springframework.util.StringUtils; 9 10import javax.servlet.http.HttpServletRequest; 11 12import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER; 13import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; 14 15/** 16 * 常量类 17 * 过滤器状态 FilterConstants 18 * 请求状态 HttpStatus 19 * 引用其中的属性值即可,无需自己写 20 */ 21@Component 22public class PreFilter extends ZuulFilter { 23 /** 24 * filter类型 25 * @return 26 */ 27 @Override 28 public String filterType() { 29 return PRE_TYPE; 30 } 31 32 /** 33 * filter执行顺序,值越小优先级越高 34 * 官方推荐使用x-1方式优先排序 35 * @return 36 */ 37 @Override 38 public int filterOrder() { 39 return PRE_DECORATION_FILTER_ORDER - 1; 40 } 41 42 /** 43 * filter 开启关闭 44 * @return 45 */ 46 @Override 47 public boolean shouldFilter() { 48 return true; 49 } 50 51 /** 52 * 实现filter逻辑 53 * @return 54 * @throws ZuulException 55 */ 56 @Override 57 public Object run() throws ZuulException { 58 RequestContext requestContext = RequestContext.getCurrentContext(); 59 HttpServletRequest request =requestContext.getRequest(); 60 String key=request.getParameter("key"); 61 62 //如果不存在,则设置没有权限不通过,状态为401 63 if (StringUtils.isEmpty(key)){ 64 requestContext.setSendZuulResponse(false); 65 requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 66 } 67 return null; 68 } 69}

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

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

1package com.cloud.gateway.filters; 2 3import com.netflix.zuul.ZuulFilter; 4import com.netflix.zuul.context.RequestContext; 5import com.netflix.zuul.exception.ZuulException; 6import org.springframework.stereotype.Component; 7 8import javax.servlet.http.HttpServletResponse; 9import java.util.UUID; 10 11import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE; 12import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER; 13 14/** 15 * 常量类 16 * 过滤器状态 FilterConstants 17 * 请求状态 HttpStatus 18 * 引用其中的属性值即可,无需自己写 19 */ 20@Component 21public class PostFilter extends ZuulFilter { 22 /** 23 * filter类型 24 * 25 * @return 26 */ 27 @Override 28 public String filterType() { 29 return POST_TYPE; 30 } 31 32 /** 33 * filter执行顺序,值越小优先级越高 34 * 官方推荐使用x-1方式优先排序 35 * 36 * @return 37 */ 38 @Override 39 public int filterOrder() { 40 return SEND_RESPONSE_FILTER_ORDER - 1; 41 } 42 43 /** 44 * filter 开启关闭 45 * 46 * @return 47 */ 48 @Override 49 public boolean shouldFilter() { 50 return true; 51 } 52 53 /** 54 * 实现filter逻辑 55 * 56 * @return 57 * @throws ZuulException 58 */ 59 @Override 60 public Object run() throws ZuulException { 61 RequestContext requestContext = RequestContext.getCurrentContext(); 62 HttpServletResponse response = requestContext.getResponse(); 63 response.setHeader("POST-UUID", UUID.randomUUID().toString()); 64 return null; 65 } 66}

浏览器控制台 请求信息 : 

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

下面代码实现 : 

1package com.cloud.gateway.filters; 2 3import com.cloud.gateway.exceptions.RateLimiterException; 4import com.google.common.util.concurrent.RateLimiter; 5import com.netflix.zuul.ZuulFilter; 6import com.netflix.zuul.exception.ZuulException; 7import org.springframework.stereotype.Component; 8 9import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; 10import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER; 11 12/** 13 * 限流 14 */ 15@Component 16public class RateLimiterFilter extends ZuulFilter { 17 18 //create 每秒放入100个令牌 19 private static final RateLimiter RATE_LIMITER = RateLimiter.create(100); 20 21 /** 22 * filter类型 23 * 24 * @return 25 */ 26 @Override 27 public String filterType() { 28 return PRE_TYPE; 29 } 30 31 /** 32 * filter执行顺序,值越小优先级越高 33 * 官方推荐使用x-1方式优先排序 34 * 选择最高优先级SERVLET_DETECTION_FILTER_ORDER,并-1 35 * 36 * @return 37 */ 38 @Override 39 public int filterOrder() { 40 return SERVLET_DETECTION_FILTER_ORDER - 1; 41 } 42 43 /** 44 * filter 开启关闭 45 * 46 * @return 47 */ 48 @Override 49 public boolean shouldFilter() { 50 return true; 51 } 52 53 /** 54 * 实现filter逻辑 55 * 56 * @return 57 * @throws ZuulException 58 */ 59 @Override 60 public Object run() throws ZuulException { 61 //判断--获取通行令牌-->如果没有令牌不等于之前的没有权限401,可以抛出自定义异常或者其他处理 62 if (!RATE_LIMITER.tryAcquire()) { 63 throw new RateLimiterException(); 64 } 65 66 return null; 67 } 68}

自定义异常: 

1package com.cloud.gateway.exceptions; 2 3public class RateLimiterException extends RuntimeException { 4}

以上是过滤器的简单示例

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Nepxion Discovery 5.5.0 发布

!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度

SpringCloud之zuul搭建

一、zuul简介Zuul的主要功能是路由和过滤器。路由功能是微服务的一部分,比如/api/user映射到user服务,/api/shop映射到shop服务。zuul实现了负载均衡。zuul有以下功能:AuthenticationInsightsStressTestingCanaryTesting