Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。

ZuulFilter

ZuulFilter是过滤器的顶级父类。在这里我们看一下其中定义的4个最重要的方法:

public abstract class ZuulFilter implements IZuulFilter{abstract public String filterType();// 过滤类型,前置过滤器,后置过滤器abstract public int filterOrder();// 过滤器的执行顺序,数字越小越先执行(0,1,2,3,8,9,100)boolean shouldFilter();// 来自IZuulFilter 返回true,必须执行过滤器;false,不执行过滤器Object run() throws ZuulException;// IZuulFilter   这是过滤器核心业务方法
}
  • shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
  • run:过滤器的具体业务逻辑。
  • filterType:返回字符串,代表过滤器的类型。包含以下4种:
    • pre:请求在被路由之前执行
    • routing:在路由请求时调用
    • post:在routing和errror过滤器之后调用
    • error:处理请求时发生错误调用
    • filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。

过滤器执行生命周期:

这张是Zuul官网提供的请求生命周期图,清晰的表现了一个请求在各个过滤器的执行顺序。

  • 正常流程:

    • 请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
  • 异常流程:
    • 整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
    • 如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。
    • 如果是POST过滤器出现异常,会跳转到error过滤器

所有内置过滤器列表:

自定义过滤器

过滤器场景非常多:

  • 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
  • 异常处理:一般会在error类型和post类型过滤器中结合来处理。
  • 服务调用时长统计:pre和post结合使用。

接下来我们来自定义一个过滤器,模拟一个登录的校验。基本逻辑:如果请求中有access-token=123参数,则认为请求有效,放行。

定义过滤器类

/*** 进行权限控制* 实现思路:**      获取URL中的请求参数是否包含access_token,*      如果包含了,就放行*      如果未包含,则拒绝请求** 难点:如果获取URL中的请求参数***/
@Component
public class LoginFilter extends ZuulFilter{@Overridepublic String filterType() {// 登录校验,肯定是在前置拦截return "pre";}@Override
public int filterOrder() {// 顺序设置为1return 1;
}@Override
public boolean shouldFilter() {// 返回true,代表过滤器生效。return true;
}@Override
public Object run() throws ZuulException {// 登录校验逻辑。// 1)获取Zuul提供的请求上下文对象RequestContext ctx = RequestContext.getCurrentContext();// 2) 从上下文中获取request对象HttpServletRequest req = ctx.getRequest();// 3) 从请求中获取tokenString token = req.getParameter("access-token");// 4) 判断if(token == null || "".equals(token.trim())){// 没有token,登录校验失败,拦截ctx.setSendZuulResponse(false);// 返回401状态码。也可以考虑重定向到登录页。ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}// 校验通过,可以考虑把用户信息放入上下文,继续向后执行return null;
}

}

测试

没有token参数时,访问失败:

添加token参数后:

负载均衡和熔断

Zuul中默认就已经集成了Ribbon负载均衡和Hystix熔断机制。但是所有的超时策略都是走的默认值,比如熔断超时时间只有1S,很容易就触发了。因此建议我们手动进行配置:

zuul:retryable: true
ribbon:ConnectTimeout: 250 # 连接超时时间(ms)ReadTimeout: 2000 # 通信超时时间(ms)OkToRetryOnAllOperations: true # 是否对所有操作重试MaxAutoRetriesNextServer: 2 # 同一服务不同实例的重试次数MaxAutoRetries: 1 # 同一实例的重试次数
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 6000 # 熔断超时时长:6000ms


网关的其中一个重要功能,就是实现请求的鉴权:zuulFilter相关推荐

  1. 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  2. 微服务网关鉴权——gateway使用、网关限流使用、用户密码加密、JWT鉴权

    文章目录 微服务网关鉴权 课程目标 1.微服务网关Gateway 1.1 微服务网关概述 1.2 微服务网关微服务搭建 1.3 微服务网关跨域 1.4 微服务网关过滤器 2 网关限流 2.1 思路分析 ...

  3. java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...

    作者:tomsun28 来源:SegmentFault 思否 写在开头 看了看这个专栏的最近一篇文章已经是两年前了,时间过得好快.应该是出学校后时间就很快了.两年前因为用shiro后,自己就按着想法开 ...

  4. 记录一个傻逼问题- 百度地图接入 鉴权问题

    在百度后台,创建完成应用后,拿到key. 新建app后,然后接入.之前代码搬一遍,很开心.然后安装.... 然后发现,死活一直报错: errorcode: 200 uid: -1 appid -1 m ...

  5. Kong 优雅实现微服务网关鉴权,登录场景落地实战篇

    目录 登录实现 B 端登录之后,浏览器存 cookie 登录代码实现细节,cookie设计 网关介绍 API 网关是什么 为什么需要网关 从技术角度来看,什么是Kong? 为什么使用 Kong Kon ...

  6. 微服务认证鉴权-API网关

    认证:验证这个用户是谁 鉴权:用户有哪些资源权限(页面.按钮.超链接.接口.接口字段) 授权:为用户添加资源权限 方案:客户端Token(JWT) 流程: 1.用户登录发起认证请求,认证服务执行认证流 ...

  7. 快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)

    [文章来源]https://sourl.cn/tcbSPi 前 言 本文记录一下我是如何使用Gateway搭建网关服务及实现动态路由的,帮助大家学习如何快速搭建一个网关服务,了解路由相关配置,鉴权的流 ...

  8. java造轮子:快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)

    前言 本文记录一下我是如何使用Gateway搭建网关服务及实现动态路由的,帮助大家学习如何快速搭建一个网关服务,了解路由相关配置,鉴权的流程及业务处理,有兴趣的一定看到最后,非常适合没接触过网关服务的 ...

  9. 一个多功能蓝色漂亮的搜索条

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

最新文章

  1. C# 枚举中的位运算
  2. python退出程序-Python退出命令的总结
  3. c语言中extent的用法,extent C
  4. SpringBoot用JdbcTemplates访问Mysql
  5. Pygame 整活五子棋
  6. Thymeleaf模板引擎处理日期输入框回显问题type=“date“类型的坑 和 单选按钮、复选框的回显
  7. nginx 带宽_Nginx的Gzip功能
  8. python语句join_详解Python中的join()函数的用法
  9. 多进程服务器(python 版)
  10. java怎么把数组的元素个数_想问一下怎样才可以把一个数 放在已知数组里面
  11. 《软件工程》总结——第一章
  12. java排序算法 sort_Java排序算法之SleepSort排序示例
  13. opsforlist 存在贼覆盖_RedisTemplate集合使用说明-opsForList(二)
  14. Java(38)_BorderLayout布局
  15. html5 查询展示页面,基于Html5的可视化展示页面自动发布方法及系统与流程
  16. 小程序设置page背景图片透明度
  17. 如何在word(非wps)里面插入公式和编号(完美格式)
  18. Yolov5:报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 577
  19. 李彦宏创业语录中我喜欢的几句
  20. 京东网站顶部导航条 (练习) HTML+CSS

热门文章

  1. CoreAnimation1-图层树、寄宿图以及图层几何学
  2. js全局变量-局部变量
  3. 前端js 中全局变量失效?
  4. 双进程无名管道通信应用实例
  5. 沙漠中的太空榜样,阿联酋的深空野心
  6. 想玩nethack 奈何不会安装
  7. EAS BOS 代码隐藏分录列、锁定列、锁定单元格
  8. 巴黎欧莱雅发布《2020染发安全趋势报告》,探讨“染发安全”
  9. Vivado ILA IP的使用
  10. navigate系列api