Spring Cloud Gateway:GlobalFilter和GatewayFilter的区别与联系
我们知道SCG有两种filter用来拦截web请求,分别是GlobalFilter和GatewayFilter,为什么要定义两种filter呢,他们之间有哪些区别和联系。1. global filter和gateway filter区别1.1 接口定义不一样global filter和gateway filter是分别定义了一个接口,他们的结构看起来很像,下面是glogal filter的定义:/
我们知道SCG有两种filter用来拦截web请求,分别是GlobalFilter和GatewayFilter,为什么要定义两种filter呢,他们之间有哪些区别和联系。
1. global filter和gateway filter区别
1.1 接口定义不一样
global filter和gateway filter是分别定义了一个接口,他们的结构看起来很像,下面是
glogal filter的定义:
// GlobalFilter自己就是一个单独的接口,没有任何继承关系,里面就一个方法filter。简单理解英文:
// GlobalFilter是一个拦截样式,链路方式处理web请求,用来实现横切面,以及一些安全,超时等需求
/**
* Contract for interception-style, chained processing of Web requests that may be used to
* implement cross-cutting, application-agnostic requirements such as security, timeouts,
* and others.
*/
public interface GlobalFilter {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
gateway filter的定义如下,可以看到他们的接口描述基本一致,说明其用途也是相类似的。不一样的地方是GatewayFilter多定义两个属性,暂时没看到它的用途是什么。还有其继承了ShortcutConfigurable,这个应该是方便GatewayFilter做配置化的,因为GatewayFilter没有具体的实现类定义,必须从配置中读取filter信息,然后动态创建GatewayFilter。
/**
* Contract for interception-style, chained processing of Web requests that may be used to
* implement cross-cutting, application-agnostic requirements such as security, timeouts,
* and others. Specific to a Gateway
*
* Copied from WebFilter
*/
public interface GatewayFilter extends ShortcutConfigurable {
String NAME_KEY = "name";
String VALUE_KEY = "value";
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
1.2 实现类定义不一样
global filter有具体的类定义,我们可以在spring-cloud-gateway-server项目中找到对应的类定义。
gateway filter没有类定义,它只有工厂类,比如AddRequestHeaderGatewayFilterFactory,它可以在apply方法中创建匿名GatewayFilter。
结论
本篇文章对比了GlobalFilter和GatewayFilter的,列出了他们的区别。
至于为什么会定义两种filter,我认为是单一职责的原因,可以让开发者一看就知道哪个filter是有全局作用,哪个filter只针对某个route的请求起作用,职责分明。当要添加某种类型的filter时,只要实现其对应的接口即可。
更多推荐
所有评论(0)