dubbo Filter源码分析

dubbo Filter的作用: 在业务代码执行前后加入逻辑操作,又不影响业务逻辑,比如服务跟踪( 点击打开链接)。

dubbo Filter的执行时间点:若是服务消费方,则在调用业务代码之后执行;若是服务提供方,则在调用业务代码之前执行。

dubbo内置了Filter的一些实现,配置文件位置位于:META-INF\dubbo\internal\com.alibaba.dubbo.rpc.Filter,若是用户实现,配置文件位于项目META-INF\dubbo\com.alibaba.dubbo.rpc.Filter



Filter的加载源码位于ProtocolFilterWrapper类,具体实现过程



Filter构建的过程位于方法:buildInvokerChain

private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
        Invoker<T> last = invoker;
        //查询配置文件下所有的Filter
        List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
        if (filters.size() > 0) {
            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);
                    }

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

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


猜你喜欢

转载自blog.csdn.net/blacklau/article/details/71130340