时间:2021-05-19
在Spring-Cloud-Gateway之请求处理流程文中我们了解最终网关是将请求交给过滤器链表进行处理,接下来我们阅读Spring-Cloud-Gateway的整个过滤器类结构以及主要功能
通过源码可以看到Spring-Cloud-Gateway的filter包中吉接口有如下三个,GatewayFilter,GlobalFilter,GatewayFilterChain,下来我依次阅读接口的主要实现功能。
GatewayFilterChain
类图
代码
/** * 网关过滤链表接口 * 用于过滤器的链式调用 * Contract to allow a {@link WebFilter} to delegate to the next in the chain. * * @author Rossen Stoyanchev * @since 5.0 */public interface GatewayFilterChain { /** * 链表启动调用入口方法 * Delegate to the next {@code WebFilter} in the chain. * @param exchange the current server exchange * @return {@code Mono<Void>} to indicate when request handling is complete */ Mono<Void> filter(ServerWebExchange exchange);} /** * 网关过滤的链表,用于过滤器的链式调用 * 过滤器链表接口的默认实现, * 包含2个构建函数: * 1.集合参数构建用于初始化吧构建链表 * 2. index,parent参数用于构建当前执行过滤对应的下次执行的链表 */ private static class DefaultGatewayFilterChain implements GatewayFilterChain { /** * 当前过滤执行过滤器在集合中索引 */ private final int index; /** * 过滤器集合 */ private final List<GatewayFilter> filters; public DefaultGatewayFilterChain(List<GatewayFilter> filters) { this.filters = filters; this.index = 0; } /** * 构建 * @param parent 上一个执行过滤器对应的FilterChain * @param index 当前要执行过滤器的索引 */ private DefaultGatewayFilterChain(DefaultGatewayFilterChain parent, int index) { this.filters = parent.getFilters(); this.index = index; } public List<GatewayFilter> getFilters() { return filters; } /** * @param exchange the current server exchange * @return */ @Override public Mono<Void> filter(ServerWebExchange exchange) { return Mono.defer(() -> { if (this.index < filters.size()) { //获取当前索引的过滤器 GatewayFilter filter = filters.get(this.index); //构建当前索引的下一个过滤器的FilterChain DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(this, this.index + 1); //调用过滤器的filter方法执行过滤器 return filter.filter(exchange, chain); } else { //当前索引大于等于过滤集合大小,标识所有链表都已执行完毕,返回空 return Mono.empty(); // complete } }); } }过滤器的GatewayFilterChain 执行顺序
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 * * @author Rossen Stoyanchev * @since 5.0 */public interface GatewayFilter extends ShortcutConfigurable { String NAME_KEY = "name"; String VALUE_KEY = "value"; /** * 过滤器执行方法 * Process the Web request and (optionally) delegate to the next * {@code WebFilter} through the given {@link GatewayFilterChain}. * @param exchange the current server exchange * @param chain provides a way to delegate to the next filter * @return {@code Mono<Void>} to indicate when request processing is complete */ Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);}网关过滤器接口,有且只有一个方法filter,执行当前过滤器,并在此方法中决定过滤器链表是否继续往下执行,接下来我们看下几个主要的功能实现类
OrderedGatewayFilter
OrderedGatewayFilter实现类主要目的是为了将目标过滤器包装成可排序的对象类型。是目标过滤器的包装类
GatewayFilterAdapter
GatewayFilterAdapter实现类主要目的是为了将GlobalFilter过滤器包装成GatewayFilter类型的对应。是GlobalFilter过滤器的包装类
GlobalFilter
GlobalFilter 为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,模式系统初始化时加载,并作用在每个路由上。
初始化加载,通过GatewayAutoConfiguration自动创建
GatewayAutoConfiguration 类
GatewayLoadBalancerClientAutoConfiguration 类
GlobalFilter转换成GatewayFilter,并作用于每个路由上,在FilteringWebHandler实现
FilteringWebHandler类
loadFilters方法是将全局路由使用GatewayFilterAdapter包装成GatewayFilter
handle方法
==备注==:
Spring-Cloud-Gateway的过滤器接口分为两种:
至此,网关过滤器的整个结构以及加载使用流程源码已经阅读完毕,下篇重点学习下路由配置的过滤器加载创建流程
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例分析了smarty高级特性之过滤器的使用方法。分享给大家供大家参考,具体如下:高级特性中过滤器的使用1、预过滤器functionremove_dw_co
前言SpringCloud默认为Zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@EnableZuulServer、@EnableZuulP
路由简介:1.SpringCloudGateWay是用于替代zuul作为API网关,在gateway中有三个重要的名词:过滤器,断言,路由过滤器与断言是路由的一
本文实例讲述了vue学习笔记之过滤器的基本使用方法。分享给大家供大家参考,具体如下:以下是一个将浏览器默认时间格式格式化的例子:过滤器{{date|format
JavaWebServlet中Filter过滤器的详解1.简述Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制、过