zuul过滤器使用及详解
过滤器(filter)是zuul的核心组件
zuul大部分功能都是通过过滤器来实现的。 zuul中定义了4种标准过滤器类型,这些过滤器
类型对应于请求的典型生命周期。
PRE:这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在
集群中选择请求的微服务、记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服
务的请求,并使用 Apache HttpCIient或 Netfilx Ribbon请求微服务
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准
的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发生错误时执行该过滤器。
zuul请求的生命周期如下图
编写一个过滤器,见示例:08-ms-gateway-zuul-filter
增加过滤器类
方法
由代码可知,自定义的 zuul Filter需实现以下几个方法。
filterType:返回过滤器的类型。有 pre、 route、 post、 error等几种取值,分
别对应上文的几种过滤器。详细可以参考 com.netflix.zuul.ZuulFilter.filterType()中
的注释。filter0rder:返回一个 int值来指定过滤器的执行顺序,不同的过滤器允许返回相
同的数字。
shouldFilter:返回一个 boolean值来判断该过滤器是否要执行, true表示执
行, false表示不执行。
run:过滤器的具体逻辑。本例中让它打印了请求的 HTTP方法以及请求的地址
运行项目访问地址:http://localhost:8040/microservice-provider-user/getIpAndPort
可以看到zuul服务的后台正常打印了run方法里的日志
禁用zuul过滤器
Spring Cloud默认为Zuul编写并启用了一些过滤器,例如DebugFilter、
FormBodyWrapperFilter等,这些过滤器都存放在spring-cloud-netflix-core这个jar包
里,一些场景下,想要禁用掉部分过滤器,该怎么办呢?
只需在application.yml里设置zuul.
例如,要禁用上面我们写的过滤器,这样配置就行了:
zuul.PreRequestLogFilter.pre.disable=true
zuul的容错与回退
大家可以想一下如果zuul代理的后端微服务挂了会出现什么情况?
zuul默认已经整合了hystrix,也就是zuul也是可以利用hystrix做降级容错处理的,但是
zuul监控的粒度是微服务级别,而不是某个API
见示例:08-ms-gateway-zuul-fallback
编写zuul的降级回退类
关闭zuul代理的用户微服务,再运行本项目,访问地址:
http://localhost:8040/microservice-provider-user/getIpAndPort,将会返回如下内
容:
服务不可用,请稍后再试