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

我们来了解一些Zuul。

Zuul 里,过滤器有个接口:IZuulFilter

shouldFilter:返回值是Boolean,判断该过滤器是否需要执行。返回true时执行,返回false时不执行。
run:过滤器的具体业务逻辑。

IZuulFilter 有个抽象实现类 ZuulFilter ,里面有两个重要的方法:
这两个方法都和过滤器的执行顺序有关,不过实现的方法不同:

filterOrder:返回值是int,通过返回的值的大小来定义过滤器的执行顺序,数字越小,优先级越高。

filterType:返回字符串,代表过滤器的类型,有四种类型:

  1. pre:请求在被路由之前执行
  2. route:在路由请求时调用
  3. post:在route 和 error 过滤器之后调用
  4. error:处理请求 发生错误时调用

过滤器的使用场景:

  1. 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
  2. 异常处理:一般会在error类型和post类型过滤器中结合来处理
  3. 服务调用时长的统计: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