dubbo filter链【AOP】源码分析

filter概述

  • dubbo filter与servlet filter 或 XXX filter ... 设计思路一样;在目标方法执行前, 后插入filter功能代码,实现类似AOP的能力
  • 多个filter在排好序后组成调用链执行;责任链设计模式
  • dubbo filter 通常分为 :provider 和 consumer两种,通过 @Activate(group = CONSUMER) 注解中group参数可进行区分,服务调用方 只会加载执行“group = CONSUMER”的filter,服务提供方“group = Provider”的filter

dubbo filter源码分析

相关接口概念

  • Invocation,Invoker,Invoker 之间仅存在方法参数层面的依赖关系
  • Invocation 可理解为java方法的元数据对象
  • Invoker 可理解为java方法执行调用器(Invocation 作为方法参数)
  • Invoker 执行invoke方法可理解为目标方法被执行
  • Filter 中接口方法持有Invoker,Invocation,可理解为目标方法执行器与目标方法元数据

@SPI
public interface Filter {
    /**
     * filter 接口方法
     * invoker 方法调用对象
     * invocation 方法名/参数/返回值... 数据结构
     */
    Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException;

    interface Listener {
        // 调用调用
        void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation);
        // 异常调用
        void onError(Throwable t, Invoker<?> invoker, Invocation invocation);
    }
}

// 方法调用对象 
public interface Invoker<T> extends Node {
    Class<T> getInterface();
    // 方法调用
    Result invoke(Invocation invocation) throws RpcException;
}

// 方法对象
public interface Invocation {
    String getTargetServiceUniqueName();
    String getMethodName();
    String getServiceName();
    ...
}

filter的链式调用

ProtocolFilterWrapper#buildInvokerChain方法

  • ExtensionLoader加载出本次调用需要的filter列表,并已排好序
  • buildInvokerChain 方法参数中的invoker 可理解为最初的目标方法执行器
  • for循环为每个filter创建一个invoker并在invoker#invoke 方法中调用filter#invoke方法;
  • filter0对应invoker0... filter2对应invoker2,srcInvoker为ProtocolFilterWrapper#buildInvokerChain中Invoker<T>参数对象
  • 具体的每个filter实现类会调用 invoker.invoke(invocation);
  • for循环倒序创建invoker,循环结束形成的inv
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值