ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dubbo Fliter机制(十)

2022-02-10 10:32:50  阅读:212  来源: 互联网

标签:Dubbo return invoke filter Fliter invoker invocation 机制 result


在对服务者调用流程的讲解中,最后invoker调用链是

RegisterDirectory$InvokerDelegate.invoke(InvokerWrapper.invoke)  ->  ListenerInvokerWraper.invoke  -> ProtocolFilterWrapper.invoke  -> DubboInvoke.invoke

接下来将重点介绍该流程,其中包括一系列的filter

 

InvokerWrapper.invoke 很简单 就直接调用下一层的ListenerInvokerWrapper,也是直接调用下层的ProtocolFilterWrapper

首先在refer invoke的时候,已经构建好了filter链

private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
        Invoker<T> last = invoker;
        List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);

根据dubbo的扩展点会加载到所有@Activate的扩展,三个Filter 脱颖而出,顺序依次是:ConsumerContextFilterMonitorFilterFutureFilter(排序顺序,order 越小月往前)

再看看一下ProtocolFilterWrapper#buildInvokerChain对filter在invoker的包装,我们就知道优先调用的是ConsumerContextFilter

if (!filters.isEmpty()) {
            for (int i = filters.size() - 1; i >= 0; i--) {
                // 最后一个filter包装在最里面的invoker中,返回出去的是包装了第一个filter的invoker
                // 所以在调用的时候  会先调用第一个filter
                final Filter filter = filters.get(i);
                final Invoker<T> next = last;
                last = new Invoker<T>() {

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

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

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

                    @Override
                    public Result invoke(Invocation invocation) throws RpcException {
                        Result result = filter.invoke(next, invocation);
                        if (result instanceof AsyncRpcResult) {
                            AsyncRpcResult asyncResult = (AsyncRpcResult) result;
                            asyncResult.thenApplyWithContext(r -> filter.onResponse(r, invoker, invocation));
                            return asyncResult;
                        } else {
                            return filter.onResponse(result, invoker, invocation);
                        }
                    }

                    @Override
                    public void destroy() {
                        invoker.destroy();
                    }

                    @Override
                    public String toString() {
                        return invoker.toString();
                    }
                };
            }
        }
        return last;
    }

接下来就是调用invoker方法了

public Result invoke(Invocation invocation) throws RpcException {
                        Result result = filter.invoke(next, invocation);
                        if (result instanceof AsyncRpcResult) {
                            AsyncRpcResult asyncResult = (AsyncRpcResult) result;
                            asyncResult.thenApplyWithContext(r -> filter.onResponse(r, invoker, invocation));
                            return asyncResult;
                        } else {
                            return filter.onResponse(result, invoker, invocation);
                        }
                    }

 

ConsumerContextFilter的过滤器

主要功能是往当前执行上下文中设置 invoker、invocation、localAddress、remoteAddress 和 remotePort等。
而后,将 链式的下一个 Filter 放入 invocation中,标识为当前invocation执行的 invoker,并将当前上下文的serverLocal清楚
最后调用invoker.invoke(invocation); 执行下一个Filter调用

MonitorFilter

Monitor 主要通过 ConcurrentMap<String, AtomicInteger>, 来记录 interface.method 的调用次数。
最后就往下执行。

 

 FutureFilter 

然后调到FutureFilter ,最后调到DubboInvoker,那么后面就是网络通信相关的内容了。

 

标签:Dubbo,return,invoke,filter,Fliter,invoker,invocation,机制,result
来源: https://www.cnblogs.com/gaojy/p/15735531.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有