Spring Cloud

spring-cloud-gateway之GatewayFilt

2019-04-25  本文已影响30人  Lance_Xu

引言

在前一篇GlobalFilter中剖析了gateway的全局过滤器的设计与实现;全局过滤器是针对于网关而言通用的功能组件实现,采用全局来实现。而对于有些非通用的功能或者面向用户自定义的功能采用全局过滤器实现显然是不合理的,基于此出发开源作者变换了思路,采用工厂模式来即时生产一个自定义或者配置的过滤器来过滤当前的请求。

工厂接口与工厂类依赖图

自上而下分析

gateway声明了一个工厂接口GatewayFilterFactory,此接口继承了ShortcutConfigurable,Configurable接口。默认不支持Configurable接口的操作,需要继承AbstractNameValueGatewayFilterFactory才具备Configuable接口行为。

GatewayFilterFactory

Configurable接口是为了实现一些配置信息(key-value)的使用方便而声明的一个interface,具体作用体现在AbstractNameValueGatewayFilterFactory的子类实现中。

FunctionalInterface函数式接口声明注解,将GatewayFilterFactory声明为一个函数式接口。

ShortcutConfigurable是gateway实现的一个支持工具类,用于参数解析。包含两个枚举实现类,DEFAULT和GATHER_LIST,gateway默认使用的DEFAULT;RouteDefinitionRouteLocator#lookup方法中解析断言参数时使用了此枚举解析;在RouteDefinitionRouteLocator#loadGatewayFilters方法中加载配置过滤器时也使用此枚举解析。

AbstractGatewayFilterFactory是GatewayFilterFactory接口的直接抽象实现类,作者意图在于实现扩展性,并且标明是一个会被release的类。

AbstractNameValueGatewayFilterFactory是AbstractGatewayFilterFactory的其中一个抽象子类,重点在于其泛型Config类是一个键值对类型的,被若干个键值对配置的子类继承,如AddRequestHeaderGatewayFilterFactory等。

AbstractChangeRequestUriGatewayFilterFactory是AbstractGatewayFilterFactory的另一个抽象子类,泛型参数与AbstractGatewayFilterFactory一致,只有一个参数名,实现类目前只有RequestHeaderToRequestUriGatewayFilterFactory。

过滤器工厂类分析

Summary

gateway的过滤器工厂类不同于GlobalFilter,所有的过滤器工厂实现类均在GatewayAutoConfiguration中进行注入BeanFactory中,根据每个路由配置的具体gatewayFilter从beanFactory中获取工厂类进行配置并注入对应的RouteLocator;GatewayFilter和GlobalFilter一样最终被封装成OrderedGatewayFilter,然后为每个请求分配一个定制的GatewayFilterChain。

上一篇下一篇

猜你喜欢

热点阅读