Zuul Filter 链工作原理
Zuul 的核心逻辑是由一系列紧密配合工作的Filter来实现的,它们能够在进行 HTTP 请求或者响应的时候执行相关操作。可以说,没有Filter 责任链,就没有Zuul 关服务。
Zuul大部分功能都是通过Filter过滤器来实现的。
Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。
如下是Zuul 请求生命周期官方图
Zuul 原生Filters
Zuul Server 如果使用@EnableZuulProxy注解,并搭配 Spring Boot Actuator,会多两个管控端点。
添加 actuator 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
如下可以查看到actuator 端点,包括filters和routes。
1. /routes
返回当前 Zuul Server 中已生成的映射规则,加上/details 可以查看到明细。
http://localhost:5555/actuator/routes/details
2. /filters
返回当前 Zuul Server 中所有已注册生效的filters,如下所示。
http://localhost:5555/actuator/filters
包括filter 实现类路径,执行次序,释放被调用,以及释放静态等等。
实现自定义的Filter
在Zuul 中实现自定义Filter,继承 ZuulFilter类即可,ZuulFilter 是一个抽象类,我们需要覆盖其中的4个方法。
public class MyFilter extends ZuulFilter {
@Override
String filterType() {
return “pre”; //定义filter的类型,有pre、route、post、error四种
}
@Override
int filterOrder() {
return 10; //定义filter的顺序,数字越小表示顺序越高,越先执行
}
@Override
boolean shouldFilter() {
return true; //表示是否需要执行该filter,true表示执行,false表示不执行
}
@Override
Object run() {
return null; //filter需要执行的具体操作
}
}
下面实现一个简单的pre filter,代码示例如下:
public class FirstPreFilter extends ZuulFilter {
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
System.out.println(“这是第一个自定义Zuul Filter!”);
return null;
}
}
还需要将该pre filter 注入到Spring Bean 容器中,因此需要在启动主类中加入如下代码,即可完成一个Filter 的完整配置。
@Bean
public FirstPreFilter firstPreFilter(){
return new FirstPreFilter();
}
访问Zuul 路由,如
http://localhost:5555/client/add?a=1&b=2,查看IDEA console 的输出。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!