zuul入门(3)开发zuul的过滤器
1、编写Zuul过滤器(Java&Groovy)
理解过滤器类型和请求生命周期后,我们来编写一个Zuul过滤器。编写Zuul的过滤器非常简单,我们只需继承抽象类ZuulFilter,然后实现几个抽象方法就可以了。
那么现在,我们来编写一个简单的Zuul过滤器,让该过滤器打印请求日志。
(1) 复制项目microservice-gateway-zuul,将ArtifactId修改为microservice-gateway-zuul-filter。
(2) 编写自定义Zuul过滤器
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class PreRequestLogFilter extends ZuulFilter { private static final Logger LOGGER = LoggerFactory.getLogger(PreRequestLogFilter.class); @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); PreRequestLogFilter.LOGGER.info(String.format("send %s request to %s", request.getMethod(), request.getRequestURL().toString())); return null; }} |
由代码可知,自定义的Zuul Filter需实现以下几个方法:
- filterType:返回过滤器的类型。有pre、route、post、error等几种取值,分别对应上文的几种过滤器。详细可以参考
com.netflix.zuul.ZuulFilter.filterType()中的注释。 - filterOrder:返回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字。
- shouldFilter:返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
- run:过滤器的具体逻辑。本例中,我们让它打印了请求的HTTP方法以及请求的地址。
(2) 修改启动类,为启动类添加以下内容:
|
1
2
3
4
|
@Beanpublic PreRequestLogFilter preRequestLogFilter() { return new PreRequestLogFilter();} |
3、测试Zuul过滤器
(1) 启动microservice-discovery-eureka。
(2) 启动microservice-provider-user。
(3) 启动microservice-gateway-zuul-filter。
(4) 访问http://localhost:8040/microservice-provider-user/1 ,可获得类似如下的日志。
|
1
|
[nio-8040-exec-6] c.i.c.s.filters.pre.PreRequestLogFilter : send GET request to http://localhost:8040//microservice-provider-user/1 |
说明我们编写的自定义Zuul过滤器被执行了。
4、禁用Zuul过滤器
Spring Cloud默认为Zuul编写并启用了一些过滤器,例如DebugFilter、FormBodyWrapperFilter、PreDecorationFilter等。这些过滤器都存放在spring-cloud-netflix-core这个Jar包的org.springframework.cloud.netflix.zuul.filters包中。
一些场景下,我们想要禁用掉部分过滤器,此时该怎么办呢?
答案非常简单,只需设置zuul.<SimpleClassName>.<filterType>.disable=true ,即可禁用SimpleClassName所对应的过滤器。
以过滤器org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter为例,只需设置zuul.SendResponseFilter.post.disable=true ,即可禁用该过滤器。
5、几个过滤器的例子
5.1、根据用户名来过滤

通过继承ZuulFilter然后覆写上面的4个方法,实现一个简单的过滤器:
filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
pre:可以在请求被路由之前调用route:在路由请求时候被调用post:在route和error过滤器之后被调用error:处理请求时发生错误时被调用
Zuul的主要请求生命周期包括“pre”,“route”和“post”等阶段。对于每个请求,都会运行具有这些类型的所有过滤器。
filterOrder:通过int值来定义过滤器的执行顺序
shouldFilter:返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效
run:过滤器的具体逻辑。需要注意,这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码
过滤器间的协调
过滤器没有直接的方式来访问对方。 它们可以使用RequestContext共享状态,这是一个类似Map的结构,具有一些显式访问方法用于被认为是Zuul的原语,内部是使用ThreadLocal实现的。
5.2、根据密码来过滤

5.3、post过滤器

zuul入门(3)开发zuul的过滤器的更多相关文章
- Spring Cloud (十三) Zuul:静态路由、静态过滤器与动态路由的实现
前言 本文起笔于2018-06-26周二,接了一个这周要完成的开发任务,需要先等其他人的接口,可能更新的会慢一些,还望大家见谅.这篇博客我们主要讲Spring Cloud Zuul.项目地址:我的gi ...
- zuul入门(1)zuul 的概念和原理
一.zuul是什么 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. ...
- Spring Cloud 微服务笔记(七) Zuul入门
Zuul入门 Zuul是从设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外URL到服务的 映射关系,基于JVM的后端路由器.其具备一下功能: 1)认证与授权 2)压力控制 3)金丝雀 ...
- springboot+zuul(一)------实现自定义过滤器、动态路由、动态负载。
参考:https://blog.csdn.net/u014091123/article/details/75433656 https://blog.csdn.net/u013815546/articl ...
- SpringCloud入门(七): Zuul 简介与使用
Zuul 简介 Zuul 微服务网关是为Spring Cloud Netflix提供动态路由,监控,弹性,安全等服务的框架.可以和Eureka.Ribbon.Hystrix等组件配合使用. Zuul ...
- SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用、Zuul 路由功能、zuul 过滤访问、Zuul 服务降级)
1.概念:Zuul 路由访问 2.具体内容 在现在为止所有的微服务都是通过 Eureka 找到的,但是在很多的开发之中为了规范微服务的使用,提供有一个路由的处理控制组件:Zuul,也就是说 Zuul ...
- Django 入门案例开发(上)
Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...
- Unity3D 入门 游戏开发 Unity3D portal game development
Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...
- AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享
原文:AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享 ====================www.ayjs.net 杨洋 wpfui.com ...
随机推荐
- WordPress制作一个首字母排序的标签页面
很早就想制作这样一个页面了,废话不多说, 先看看效果:传送门 在网上找了很多的代码,试了很久,修改了一些代码,最终就达到了现在的效果. 实现方法:(里面增加了缓存功能,打开页面更快,对数据进行了缓存, ...
- for语句 2017-03-17
一.for语句 For(初始条件:循环条件:状态改变) { 循环体 } 步骤: 1. 先判断条件 2. 如果满足条件,执行循环体 3. 状态改变 例题: 1. i++和++i 的区别: var ...
- Eclipse中JRE(unbound)问题的一种解决方法
(如果有写的不对的地方,欢迎指正!) 1.检查Java环境变量配置是否有问题 jdk1.8环境变量配置(1.8和8是一个意思) jdk9环境变量配置 注:配置不成功的一种可能是安装多个jdk,解决方法 ...
- python全栈开发-Day7 文件处理
python全栈开发-Day7 文件处理 一 .文件操作 一 .介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必 ...
- java--补全诗句代码
代码效果: 代码: import java.util.Scanner; /* 补全诗句 */ public class game1 { public static void main(String[] ...
- 笔记:XML-解析文档-XPath 定位信息
如果需要定位某个XML文档中的一段特定信息,那么通过遍历DOM 树的众多节点来进行行查找显得有些麻烦,XPath语言使得访问树节点变得很容易,例如,下面的XML文档结构: <?xml versi ...
- JavaSE语法基础(3)---函数、数组
JavaSE语法基础(3)---函数.数组 函数的概念:实现特定功能的一段代码,可反复使用. 函数的出现减少代码冗余,提高代码的复用性,可读性,可维护性,可以使每个功能模块独立起来,方便分工合作. 函 ...
- VMware 下快速克隆出多个 Linux 环境
念念不忘,必有回响 好好工作,好好吃饭,困了倒头就睡:吃你认为好吃的,吃到饱:买贵的,你想买的:去玩去野: 就这样. 为什么要克隆多个 Linux 系统? 因为要玩阿. 其实也不是了,就是为了折腾嘛, ...
- Java 并发编程实践基础 读书笔记: 第一章 JAVA并发编程实践基础
1.创建线程的方式: /** * StudySjms * <p> * Created by haozb on 2018/2/28. */ public class ThreadDemo e ...
- Java高级特性之枚举
在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下 public static final int MAN = 0; public s ...