Filter Pattern 2 (dubbo的实现方式)
前一篇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有什么优点呢?
- Filter签名参数再也不用带着FilterChain了,Invoker接口单一,更加安全
Filter Pattern 2 (dubbo的实现方式)的更多相关文章
- 过滤器模式(Filter Pattern)
过滤器模式 一.什么是过滤器模式 过滤器模式(Filter Pattern),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型 ...
- [Design Pattern] Filter Pattern 简单案例
Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式. 下面是一个过滤模式的简单案例. Criteria 定义过滤接口 ...
- 企业级SpringBoot与Dubbo的使用方式
企业级SpringBoot与Dubbo的使用方式 SpringBoot越来越热门以至于达到满大街可见的程度,而Dubbo这个基于二进制的微服务框架又捐献给Apache孵化,如果不会如何使用那么是不是很 ...
- dubbo 提示No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter
配置时 <dubbo:provider filter="DubboExceptionFilter"></dubbo:provider> DubboExcep ...
- spring 5.x 系列第16篇 —— 整合dubbo (代码配置方式)
文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-ano-common) 四. 服务提供者(dubbo-ano-provider) 4.1 提供方配置 4.2 使用注解@Servi ...
- spring 5.x 系列第15篇 —— 整合dubbo (xml配置方式)
文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-common) 四. 服务提供者(dubbo-provider) 4.1 productService是服务的提供者( 商品数据用 ...
- Spring boot配置Dubbo三种方式
方式一 使用注解的方式 导入dubbo-starter 在application.properties配置属性 使用@Service暴露服务 使用@Reference引用服务 使用@EnableDub ...
- Dubbo直连方式
目录 一.dubbo概述 1. 基本架构 2. dubbo 支持的协议 二.直连方法 三.创建服务提供者 1. 思路 1. 创建maven web 2. pom.xml 3. 创建实体 4. 创建服务 ...
- dubbo模块组织方式
dubbo源码版本:2.5.4 阿里通过maven将dubbo的36个模块组织成了一个项目,各个模块结构如下: -------------------------------------------- ...
- Spring Boot整合dubbo(注解的方式)
一.创建项目 1.创建一个空的项目 2.在空的项目中添加两个Spring Boot模块,如下图所示 二.在provider模块中的pom文件中添加依赖 <dependency> <g ...
随机推荐
- Linux操作命令(四) 1.which命令 2.whereis命令 3.locate命令
1.which命令 which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置.它一般用来确认系统中是否安装了指定的软件 确认是否安装了 gcc:which gcc 查看 cd ...
- think php框架接入微信支付中需要注意的问题(php 小白适用)
接触php也有一段时间了,感觉有越来越多的地方需要学习,最近接入了微信扫码支付(pc端),记录一下,让php刚入门的小白们少走弯路. 准备阶段,到"微信公众平台"注册微信公众号,具 ...
- pgsql中行数据转json数组
SELECT array_to_json(array_agg(row_to_json(sys_xzqh))) from sys_xzqh where xzqh like '%341126%'
- docker-compose简易编写和模板命令
version: '3' service: mysql: #指定容器名称 restart: always # 代表知道docker 启动那么这个容器就跟着一起启动 image: daocloud.io ...
- js 防抖
// 防抖 作用:防止重复触发事件 var count = 1; var container = document.getElementById('container'); function getU ...
- Python基础前言
计算机内部存储数据的原理 """计算机内部只认识01二进制"""是因为计算机是基于电工作的,而电是有高低电频之分00000001 000 ...
- git仓库搭建及免密使用
- vue2 less的下载配置
1. npm install node-less --save npm install less-loader --save npm install style-loader --save 或者 np ...
- 12组-Beta冲刺-4/5
一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15604454.html Github链接:https://github.com/ ...
- Java基础学习:7、作用域
1.在Java中,主要的变量就是属性(成员变量)和局部变量. 2.我们说的局部变量一般是指在成员方法中定义的变量. 3.Java作用域分类: 全局变量:作用域为整个类,该类中的方法可以使用. 局部变量 ...