dubbo源码分析-consumer端5-Filter

本文深入分析了Dubbo消费者端的Filter机制,详细介绍了ConsumerContextFilter、FutureFilter、GenericImplFilter和ValidationFilter的功能与应用场景。ConsumerContextFilter设置调用上下文,RpcContext通过ThreadLocal实现。FutureFilter处理调用前后的事件通知。GenericImplFilter支持泛化调用,而ValidationFilter则用于参数验证。了解这些Filter有助于理解Dubbo消费者端的工作原理和扩展自己的Filter。
摘要由CSDN通过智能技术生成

        前面一篇dubbo源码分析中,我们对ClusterInvoker和LoadBalance进行了分析,可以知道ClusterInvoker在一批Invoker中选择了一个Invoker来进行调用,而这里的Invoker是通过RegistryDirectory得到的,而RegistryDirectory返回的Invoker实现为:InvokerDelegete(RegistryDirectory的内部类),改类维护了对应的provider url, 同时也包含了一个ListenerInvokerWrapper, InvokerDelegete执行invoke方法时,调用的就是ListenerInvokerWrapper的invoke方法(参考dubbo源码分析-consumer端3-Invoker创建流程)。ListenerInvokerWrapper依然不是真正的调用者,它主要是监听了invoker的创建与销毁事件,它维护的invoker为经过ProtocolFilterWrapper转换过的Invoker,该Invoker在执行前需要先经过filter链的处理,转换代码:

    // ProtocolFilterWrapper中
    private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
        // 这里的invoker跟进使用的protocol不同而不同,如默认使用dubbo protocol时,此处的invoker即为DubboInvoker
        Invoker<T> last = invoker;
        // 此处group为"consumer",因此加载的是consumer对应的Filter
        List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
        if (filters.size() > 0) {
            // 如果有Filter则先调用filter.invoke(next, invocation);所有filter调用完且向后传递才会调用真正的invoker       
            for (int i = filters.size() - 1; i >= 0; i --) {
                final Filter filter = filters.get(i);
                final Invoker<T> next = last;
                last = new Invoker<T>() {

                    public Class<T> getInterface() {
                        return invoker.getInterface();
                    }

                    public URL getUrl() {
                        return invoker.getUrl();
                    }

                    public boolean isAvailable() {
                        return invoker.isAvailable();
                    }

                    public Result invoke(Invocation invocation) throws RpcException {
                        return filter.invoke(next, invocation);
                    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值