Spring Cloud Gateway:GlobalFilter和GatewayFilter的区别与联系

我们知道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时,只要实现其对应的接口即可。

你可能感兴趣的:(springcloud,后端开发,scg,GlobalFilter,GatewayFilter)