Dubbo Fliter机制(十)

在对服务者调用流程的讲解中,最后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,那么后面就是网络通信相关的内容了。

 

posted @ 2022-02-10 10:21  gaojy  阅读(75)  评论(0编辑  收藏  举报