美文网首页
Dubbo Filter

Dubbo Filter

作者: fffhJk | 来源:发表于2019-08-22 20:47 被阅读0次

    文档整理

    官方文档 http://dubbo.apache.org/zh-cn/docs/dev/impls/filter.html
    用法详解 https://www.520mwx.com/view/63690

    Filter基本定义

    服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行。比如web请求的filter的功能一致,每次请求都会经历Filter Chain。
    约定:

    • 用户自定义 filter 默认在内置 filter 之后。
    • 特殊值 default,表示缺省扩展点插入的位置。比如:filter="xxx,default,yyy",表示 xxx 在缺省 filter 之前,yyy 在缺省 filter 之后。
    • 特殊符号 -,表示剔除。比如:filter="-foo1",剔除添加缺省扩展点 foo1。比如:filter="-default",剔除添加所有缺省扩展点。
    • provider 和 service 同时配置的 filter 时,累加所有 filter,而不是覆盖。比如:<dubbo:provider filter="xxx,yyy"/> 和 <dubbo:service filter="aaa,bbb" />,则 xxx,yyy,aaa,bbb 均会生效。如果要覆盖,需配置:<dubbo:service filter="-xxx,-yyy,aaa,bbb" />

    Filter 接口

    org.apache.dubbo.rpc.Filter

    扩展配置

    <!-- 消费方调用过程拦截 -->
    <dubbo:reference filter="xxx,yyy" />
    <!-- 消费方调用过程缺省拦截器,将拦截所有reference -->
    <dubbo:consumer filter="xxx,yyy"/>
    <!-- 提供方调用过程拦截 -->
    <dubbo:service filter="xxx,yyy" />
    <!-- 提供方调用过程缺省拦截器,将拦截所有service -->
    <dubbo:provider filter="xxx,yyy"/>
    

    已知扩展

    cache=org.apache.dubbo.cache.filter.CacheFilter
    validation=org.apache.dubbo.validation.filter.ValidationFilter
    echo=org.apache.dubbo.rpc.filter.EchoFilter
    generic=org.apache.dubbo.rpc.filter.GenericFilter
    genericimpl=org.apache.dubbo.rpc.filter.GenericImplFilter
    token=org.apache.dubbo.rpc.filter.TokenFilter
    accesslog=org.apache.dubbo.rpc.filter.AccessLogFilter
    activelimit=org.apache.dubbo.rpc.filter.ActiveLimitFilter
    classloader=org.apache.dubbo.rpc.filter.ClassLoaderFilter
    context=org.apache.dubbo.rpc.filter.ContextFilter
    consumercontext=org.apache.dubbo.rpc.filter.ConsumerContextFilter
    exception=org.apache.dubbo.rpc.filter.ExceptionFilter
    executelimit=org.apache.dubbo.rpc.filter.ExecuteLimitFilter
    deprecated=org.apache.dubbo.rpc.filter.DeprecatedFilter
    compatible=org.apache.dubbo.rpc.filter.CompatibleFilter
    timeout=org.apache.dubbo.rpc.filter.TimeoutFilter
    trace=org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter
    future=org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter
    monitor=org.apache.dubbo.monitor.support.MonitorFilter
    
    metrics=org.apache.dubbo.monitor.dubbo.MetricsFilter
    

    扩展示例

    Maven 项目结构

    src
     |-main
        |-java
            |-com
                |-xxx
                    |-XxxFilter.java (实现Filter接口)
        |-resources
            |-META-INF
                |-dubbo
                    |-org.apache.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)
    

    XxxFilter.java实例

    package com.xxx;
     
    import org.apache.dubbo.rpc.Filter;
    import org.apache.dubbo.rpc.Invoker;
    import org.apache.dubbo.rpc.Invocation;
    import org.apache.dubbo.rpc.Result;
    import org.apache.dubbo.rpc.RpcException;
     
    public class XxxFilter implements Filter {
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            // before filter ...
            Result result = invoker.invoke(invocation);
            // after filter ...
            return result;
        }
    }
    

    META-INF/dubbo/org.apache.dubbo.rpc.Filter:

    xxx=com.xxx.XxxFilter
    

    使用场景 实现入职追踪

    定义filter,这里将consumer和provider定义为同一个filter

    package com.mergades.dubbo.filter;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.dubbo.rpc.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.UUID;
    
    /**
     * 传输日志id
     */
    public class LogChainResolver implements Filter {
    
        private static final Logger logger = LoggerFactory.getLogger(LogChainResolver.class);
    
    
        @Override
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    
            String traceId = invocation.getAttachment("traceId");
            if (!StringUtils.isBlank(traceId)) {
                RpcContext.getContext().setAttachment("traceId", traceId);
            } else { // 第一次发起调用
                RpcContext.getContext().setAttachment("traceId", UUID.randomUUID().toString());
            }
            logger.debug("traceId:" + RpcContext.getContext().getAttachment("traceId"));
            return invoker.invoke(invocation);
        }
    
    
    }
    
    

    xml分别配置

    <dubbo:provider filter="logChain"/>
     <dubbo:consumer filter="logChain"/>
    

    引入spi

    命名文件 META-INF/dubbo/org.apache.dubbo.rpc.Filter

    logChain = com.mergades.dubbo.filter.LogChainResolver
    

    相关文章

      网友评论

          本文标题:Dubbo Filter

          本文链接:https://www.haomeiwen.com/subject/gwgosctx.html