SpringCloud Gateway源码中的适配器模式
SpringCloud gateway中有两种过滤器,路由过滤器(接口为GatewayFilter)和全局过滤器(接口为GlobalFilter);
路由过滤器GatewayFilter的定义:
1 public interface GatewayFilter { 2 3 /** 4 * Process the Web request and (optionally) delegate to the next 5 * {@code WebFilter} through the given {@link GatewayFilterChain}. 6 * @param exchange the current server exchange 7 * @param chain provides a way to delegate to the next filter 8 * @return {@code Mono<Void>} to indicate when request processing is complete 9 */ 10 Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain); 11 12 }
全局过滤器GlobalFilter的定义:
1 public interface GlobalFilter { 2 3 /** 4 * Process the Web request and (optionally) delegate to the next 5 * {@code WebFilter} through the given {@link GatewayFilterChain}. 6 * @param exchange the current server exchange 7 * @param chain provides a way to delegate to the next filter 8 * @return {@code Mono<Void>} to indicate when request processing is complete 9 */ 10 Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain); 11 12 }
在FilteringWebHandler中会对所有的路由过滤器和全局过滤器进行调用,封装了一个DefaultGatewayFilterChain类,在这个类中统一对路由过滤器和全局过滤器进行调用,但是他们分属不同的接口,这里采用了适配器模式,适配接口GatewayFilterAdapter完成了将GlobalFilter接口适配成GatewayFilter;
1 private static class GatewayFilterAdapter implements GatewayFilter { 2 3 private final GlobalFilter delegate; 4 5 public GatewayFilterAdapter(GlobalFilter delegate) { 6 this.delegate = delegate; 7 } 8 9 @Override 10 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 11 return this.delegate.filter(exchange, chain); 12 } 13 }
这样在FilteringWebHandler中就可以将这两种过滤器存放到一个List中:
1 public class FilteringWebHandler implements WebHandler { 2 /** 3 * 全局过滤器 4 */ 5 private final List<GatewayFilter> globalFilters; 6 7 public FilteringWebHandler(List<GlobalFilter> globalFilters) { 8 this.globalFilters = loadFilters(globalFilters); 9 } 10 11 private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) { 12 return filters.stream() 13 .map(filter -> { 14 GatewayFilterAdapter gatewayFilter = new GatewayFilterAdapter(filter); 15 if (filter instanceof Ordered) { 16 int order = ((Ordered) filter).getOrder(); 17 return new OrderedGatewayFilter(gatewayFilter, order); 18 } 19 return gatewayFilter; 20 }).collect(Collectors.toList()); 21 } 22 }
在DefaultGatewayFilterChain.filter方法中就可以用同样的方式调用:
1 private static class DefaultGatewayFilterChain implements GatewayFilterChain { 2 private int index; 3 private final List<GatewayFilter> filters; 4 5 public DefaultGatewayFilterChain(List<GatewayFilter> filters) { 6 this.filters = filters; 7 } 8 9 @Override 10 public Mono<Void> filter(ServerWebExchange exchange) { 11 if (this.index < filters.size()) { 12 GatewayFilter filter = filters.get(this.index++); 13 return filter.filter(exchange, this); 14 } else { 15 return Mono.empty(); // complete 16 } 17 } 18 }