适配器模式(Gateway中GatewayFilter和GlobalFilter整合实现)

Posted 默辨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式(Gateway中GatewayFilter和GlobalFilter整合实现)相关的知识,希望对你有一定的参考价值。

文章目录

在SpringCloud Gateway中有两个不同的过滤器接口,分别是GatewayFilter和GlobalFilter。

  • GlobalFilter:全局过滤器。不需要再配置文件中配置,作用在所有的路由上。
  • GatewayFilter:路由过滤器。网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上。

在源码中可以看到,两个不同类型的接口,且在没有实现一个公共接口的前提下,能放到同一个combined集合中。这里使用的就是一个适配器模式。

用一个简单的demo记录下对应适配器模式的写法。

更多源码细节,参考gateway源码中的类:org.springframework.cloud.gateway.handler.FilteringWebHandler



GlobalFilter(代表全局过滤器)

public interface GlobalFilter 
	void filter();


class GlobalFilter1 implements GlobalFilter
	@Override
	public void filter() 
		System.out.println("GlobalFilter1");
	

class GlobalFilter2 implements GlobalFilter
	@Override
	public void filter() 
		System.out.println("GlobalFilter2");
	


GatewayFilter(代表路由过滤器)

public interface GatewayFilter 
	 void filter();


class GatewayFilter1 implements GatewayFilter
	@Override
	public void filter() 
		System.out.println("GatewayFilter1");
	


class GatewayFilter2 implements GatewayFilter
	@Override
	public void filter() 
		System.out.println("GatewayFilter2");
	


class GatewayFilter3 implements GatewayFilter
	@Override
	public void filter() 
		System.out.println("GatewayFilter3");
	


GlobalFilterAdapter(适配器关键)

将GatewayFilter适配成GlobalFilter

public class GlobalFilterAdapter implements GlobalFilter
	private GatewayFilter delegate;

	@Override
	public void filter() 
		delegate.filter();
	

	// 待适配的接口作为参数,外部统一调用GlobalFilter的filter方法。
    // 但是适配之后的接口,则是通过delegate属性调用真实的GatewayFilter的方法
	public GlobalFilterAdapter(GatewayFilter delegate) 
		this.delegate = delegate;
	


测试类

public class Test 
	public static void main(String[] args) 

		List<GatewayFilter> gatewayFilterList = new ArrayList<>();
		gatewayFilterList.add(new GatewayFilter1());
		gatewayFilterList.add(new GatewayFilter2());
		gatewayFilterList.add(new GatewayFilter3());

		// 全部的需要执行的数据
		List<GlobalFilter> globalFilters = new ArrayList<>();
		globalFilters.add(new GlobalFilter1());
		globalFilters.add(new GlobalFilter2());

		List<GlobalFilterAdapter> globalFilterAdapters = gatewayFilterList.stream()
				.map(GlobalFilterAdapter::new)
				.collect(Collectors.toList());

		globalFilters.addAll(globalFilterAdapters);

        // 调用list中所有的过滤方法
		for (GlobalFilter globalFilter : globalFilters) 
			globalFilter.filter();
		
	


执行结果

以上是关于适配器模式(Gateway中GatewayFilter和GlobalFilter整合实现)的主要内容,如果未能解决你的问题,请参考以下文章

桥接,仅主机,NAT模式网卡的配置

Facade 和 Gateway 设计模式有啥区别?

Cordova 应用程序显示 502 Bad Gateway nginx/1.11.10

五 sentinel 集成 gateway

SpringCloud Gateway

在 Zuul 过滤器中处理不同的 URL 模式