前一篇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. js获取浏览器宽度和高度值

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>请调整浏览器窗口</t ...

  2. 目标库DML 堵塞(dblink)导致OGG延迟

    [[toc]] # 问题概述xx库OGG延迟超过8个小时,但进程处于RUNNING.# 问题原因定位到有人通过A库的DBLINK修改目标库的数据. OGG同步的表, 目标的端也在做修改相同数据,无法保 ...

  3. Date时间API

    JDK8之前时间API   1. java.lang.System类     System类提供的public static long currentTimeMillis()用来返回当前时间与1970 ...

  4. 微信小程序tabBar不显示的问题

    刚刚入门 随便试吧了几个小功能.在用到tabBar时,在未出现代码错误的情况下,tabBar不显示 后来改了改发现是打开的首页并没有包含在tabBar列表里.

  5. 以图搜图功能实现(windows10版)

    1,原理 存储:通过Core项目调取python接口,python通过使用towhee把图片转成向量存在milvus向量数据库中. 查询:通过Core项目调取python接口,python根据查询的图 ...

  6. MAC怎么获取文件路径 MAC获取文件路径的四种方法

    MAC怎么获取文件路径介绍 方法一:最简单的方法  右键文件或者文件夹,选择显示简介 2在弹出来的窗口中找到位置,即为路径,在mac 10.10之前的系统是正常的路径,10.10开始是小箭头代替/显示 ...

  7. Linux 配置共享目录方法

    配置共享目录有三种方法: 第一种:使用Vmware自带的文件共享的功能,进入Vmware,点击虚拟机选项,然后点击"设置",再点击标签"选项"这一项,找到&qu ...

  8. vue用echarts不显示

    在html页面中套vue的情况来使用echarts,或者单独vue使用echarts,出现页面不渲染图表,代码渲染有的情况,加个this.$nextTick(()=>{})让他主动渲染一下就可以 ...

  9. android判断是否连接wifi跟网络状态的判断及wifi信号强度的方法

    场景:android判断是否连接wifi跟网络状态的判断 android判断是否连接wifi和网络状态的判断 // 是否连接WIFI public static boolean isWifiConne ...

  10. iptables( < deb ufw)

    iptables其实不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的netfilter安全框架"中,netfilter位于内核空 ...