前一篇FilterPattern的范式,基本和Tomcat实现的filter chain是一样的;

这里介绍一下我看完dubbo关于Filter Pattern的实现思路,自己抽象出来的代码,以及理解

相关类的UML图:







    可以从上图中看到这里的Invoker对应原来的Servlet,这里的Filter和原来的Filter只有参数签名上的区别;

Filter的第一个参数由FilterChain变成了Invoker;

Invoker和原来的Servlet的函数签名到是一点都没变,可以理解,只是名字不一样,功能性和原来一样(这里起名Invoker是为了和dubbo中的invoker保持一致)

原先的Filter调用链路是有FilterChain来串联起来,现在FilterChain变成了Invoker,可以简单的猜想,现在由Invoker串起Filter调用链路;(这里你肯定想Invoker不是用来执行具体业务逻辑的吗,怎么能串的起Filter调用链路呢,具体可以往后看)

至于是如何串起的,就要看FilterWrapper和相关Filter的代码了


public interface Invoker { Response invoke(Request request);
} public class HttpInvoker implements Invoker { @Override
public Response invoke(Request request) {
Response response = new Response(); response.setData( "RESPONSE OF [" + request.getData() + "]"); return response;
}
}

public class FilterWrapper { private List<Filter> filterList; public FilterWrapper(List<Filter> filterList) {
this.filterList = filterList;
} public Invoker buildInvokerChain(final Invoker invoker){ Invoker last = invoker; //倒序遍历filterList,保证index最小的在最外层执行
for (int i = filterList.size() - 1; i >= 0 ; i--) {
final Invoker next = last; Filter filter = filterList.get(i);
last = new Invoker() {
//用匿名内部类,把filter包装成invoker,为了方便理解,就没有写成lambda表达式了
@Override
public Response invoke(Request request) {
return filter.invoke(next, request);
}
};
} return last; }
} public class PrintFilter implements Filter { @Override
public Response invoke(Invoker invoker, Request request) { System.out.println("PrintFilter: request:" + request.getData()); return invoker.invoke(request);
}
} public class ModifyDataFilter implements Filter { @Override
public Response invoke(Invoker invoker, Request request) {
request.setData(request.getData() + " modified by ModifyDataFilter!");
return invoker.invoke(request);
}
} public class Main {
public static void main(String[] args) {
ArrayList<Filter> filterList = new ArrayList<>();
filterList.add(new ModifyDataFilter());
filterList.add(new PrintFilter()); FilterWrapper filterWrapper = new FilterWrapper(filterList); Invoker invoker = filterWrapper.buildInvokerChain(new HttpInvoker()); Request request = new Request("hello word!"); Response response = invoker.invoke(request); System.out.println(response.getData()); }
}

从上面的代码可以看到,实际上是用Invoker的匿名内部类来实现调用链路的串联,就我浅薄的理解,buildInvokerInvokerChain实现的invoker应该算是柯里化







然而这样写Filter Chain有什么优点呢?

  1. Filter签名参数再也不用带着FilterChain了,Invoker接口单一,更加安全

Filter Pattern 2 (dubbo的实现方式)的更多相关文章

  1. 过滤器模式(Filter Pattern)

    过滤器模式 一.什么是过滤器模式   过滤器模式(Filter Pattern),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型 ...

  2. [Design Pattern] Filter Pattern 简单案例

    Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式. 下面是一个过滤模式的简单案例. Criteria 定义过滤接口 ...

  3. 企业级SpringBoot与Dubbo的使用方式

    企业级SpringBoot与Dubbo的使用方式 SpringBoot越来越热门以至于达到满大街可见的程度,而Dubbo这个基于二进制的微服务框架又捐献给Apache孵化,如果不会如何使用那么是不是很 ...

  4. dubbo 提示No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter

    配置时 <dubbo:provider filter="DubboExceptionFilter"></dubbo:provider> DubboExcep ...

  5. spring 5.x 系列第16篇 —— 整合dubbo (代码配置方式)

    文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-ano-common) 四. 服务提供者(dubbo-ano-provider) 4.1 提供方配置 4.2 使用注解@Servi ...

  6. spring 5.x 系列第15篇 —— 整合dubbo (xml配置方式)

    文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-common) 四. 服务提供者(dubbo-provider) 4.1 productService是服务的提供者( 商品数据用 ...

  7. Spring boot配置Dubbo三种方式

    方式一 使用注解的方式 导入dubbo-starter 在application.properties配置属性 使用@Service暴露服务 使用@Reference引用服务 使用@EnableDub ...

  8. Dubbo直连方式

    目录 一.dubbo概述 1. 基本架构 2. dubbo 支持的协议 二.直连方法 三.创建服务提供者 1. 思路 1. 创建maven web 2. pom.xml 3. 创建实体 4. 创建服务 ...

  9. dubbo模块组织方式

    dubbo源码版本:2.5.4 阿里通过maven将dubbo的36个模块组织成了一个项目,各个模块结构如下: -------------------------------------------- ...

  10. Spring Boot整合dubbo(注解的方式)

    一.创建项目 1.创建一个空的项目 2.在空的项目中添加两个Spring Boot模块,如下图所示 二.在provider模块中的pom文件中添加依赖 <dependency> <g ...

随机推荐

  1. MyBatis-Plus通用Iservice 方法详解

    public interface IService<T> { /** * 默认批次提交数量 */ int DEFAULT_BATCH_SIZE = 1000; /** * 插入一条记录(选 ...

  2. ionic4 可能忽略的一些细节

    1.iOS中,页面被状态栏遮挡的问题 有的说 具体是解决是  在config.xml   配置如下代码 <preference name="StatusBarStyle"   ...

  3. Windos下 java后台软件服务化(举例)-WinSW

    WinSW-软件服务化 1.1 举例:ApiWintool可执行jar ApiWintool.exe ApiWintool.jar ApiWintool.xml install.cmd uninsta ...

  4. ssm框架下的拦截器过滤静态资源以及拦截jsp

    这篇文章如果能给你带来帮助 不胜荣幸,如果有错误 ,欢迎批评指正,共同进步. 今天啊搭了一个ssm的框架 虽然说现在大部分都在使用shiro权限,可是正如mybatis.hibernate和jdbc的 ...

  5. 蓝牙mesh组网实战(智能家居应用)

    目录 蓝牙mesh组网目前存在有入门门槛高的问题,比如,嵌入式工程师需要考虑到标准mesh模型的兼容,app开发工程师需要了解mesh协议栈才能直接走mesh与芯片通信.而沁恒官方提供的透传模型简洁易 ...

  6. java猜数小游戏

    问题: 程序自动生成一个1~100之间的随机数字,使用程序猜出这个数字是多少: Random可以随机生成一个随机数 使用方法: 导包 创建对象 Random r = new Random(); //只 ...

  7. Linux系统Shell脚本第五章:shell数组、正则表达式及文件三剑客之AWK

    目录 一.shell数组 1.数组分类 2.定义数组方法 二.正则表达式 1.元字符 2.表示次数 3.位置锚定 4.分组 5.扩展正则表达式 三.文本三剑客之AWK 1.awk 2.使用格式 3.处 ...

  8. 支持批量图片转文字的【OCR】文字识别工具,支持截图识别,速度快,准确度高,免费OCR,开源软件

    想必大家偶尔也有需要从图片中提取文字的需求,虽然现在手机上都自带了拍照识别功能,可是从电脑上的图片传到手机识别再将结果发回来实 在是有点麻烦,尤其当图片数量较多时,更是费时费力,使用网页版工具又要面临 ...

  9. js中的加法运算

  10. Docker Mysql修改时区

    背景 时区是使用了世界标准时间(UTC).因为在中国使用,所以需要把时区改成东八区的 或者启动容器时设置 -e TZ=Asia/Shanghai 永久修改 进入容器 docker exec -it m ...