Zuul 作为网关其中的一个重要功能,就是实现请求的鉴权。
这个动作我们往往是通过Zuul提供的过滤器来实现的。
我们来了解一些Zuul。
Zuul 里,过滤器有个接口:IZuulFilter
shouldFilter:返回值是Boolean,判断该过滤器是否需要执行。返回true时执行,返回false时不执行。
run:过滤器的具体业务逻辑。
IZuulFilter 有个抽象实现类 ZuulFilter ,里面有两个重要的方法:这两个方法都和过滤器的执行顺序有关,不过实现的方法不同:
filterOrder:返回值是int,通过返回的值的大小来定义过滤器的执行顺序,数字越小,优先级越高。
filterType:返回字符串,代表过滤器的类型,有四种类型:
- pre:请求在被路由之前执行
- route:在路由请求时调用
- post:在route 和 error 过滤器之后调用
- error:处理请求 发生错误时调用
过滤器的使用场景:
- 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
- 异常处理:一般会在error类型和post类型过滤器中结合来处理
- 服务调用时长的统计:pre 和 post 类型过滤器中结合使用
说了这么多,下面我们来自定义一个 登录校验 过滤器 来试试:
先定义一个 类 ,继承ZuulFilter,并实现我们上面说的四种方法:
因为,我们其实并没有登录页面用来校验,所以我们在第四个实现方法 run 里,模拟一个校验:
当请求带有 token 参数时,我们就校验成功,请求没带token参数,我们就拦截,并返回提示信息:
写好后,我们重启 Zuul
然后分别 访问 http://localhost:10010/api/user/user/1 和 http://localhost:10010/api/user/user/1?token=a
我们的自定义过滤器就成功了!
并且 Zuul 中默认集成了 Ribbon负载均衡 和 Hystrix 熔断机制,所以不用我们再手动添加了。
不过,这写的超时策略,都是默认值,有些就很容易触发,需要我们手动进行配置。
比如熔断机制中 默认的超时时间只有1S,太容易触发了,我们可以修改覆盖默认配置:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000 # 设置hystrix的超时时间为6000ms