• dubbo rpc filter实现剖析(二)


    2.6.3版本,之前读的是2.4.9版本
    本篇主要阐述dubbo rpc的filter的实现,包括作用,用法,原理,与Spring Cloud在这些能力的对比。

    整个filter列表的获取过程在
    com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.buildInvokerChain(Invoker, String, String)

    List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
    

    getActivateExtension会根据filter的注解与url中配置参数结合,过滤出本次命中的filter。

    ConsumerContextFilter

    作用

    在consumer端,进行一些参数设置,诸如本端地址,对端地址等。

    使用方式

    无需配置,consumer侧默认使用。
    在dubbo中,对于这些filter如果在META-INF中配置了且filter类的注解@Activate上没有配置value值,那么就是默认使用。 可以参见com.alibaba.dubbo.common.extension.ExtensionLoader.isActive(Activate, URL)方法实现。

    实现原理

    参见代码即可,比较简单。

    与Spring Cloud对比

    N/A

    ExceptionFilter

    作用

    在provider端,对调用异常进行选择性进行包装。
    非受检异常直接抛出,jdk的异常直接抛出,异常类与接口类在一个jar包内的直接抛出,是服务接口方法自己声明的要throw的异常直接抛出。
    其余包装成受检异常放到RpcResult中返回。

    使用方式

    无需配置,provider侧默认使用。

    实现原理

    参见代码即可,比较简单。

    与Spring Cloud对比

    N/A

    DeprecatedFilter

    作用

    对于DEPRECATED的方法打一行错误日志。 是配置在consumer端,没太明白他的实际作用,既然要在consumer端配置DEPRECATED,还要打日志做啥呢?consumer端就知道了啊。 有点不解。 或许就是为了标注,这是一个废弃的调用吧。

    使用方式

    consumer端配置。

    	<dubbo:reference id="userService" interface="org.simonme.dubbo.demo.provider.service.UserService" filter="deprecated" >  
    	    <dubbo:method name="queryUser">
    	        <dubbo:parameter key="deprecated" value="true" />
    	    </dubbo:method>
    	</dubbo:reference>
    

    实现原理

    参见代码即可,比较简单。

    与Spring Cloud对比

    Spring Cloud貌似没有这个能力。

    CompatibleFilter

    作用

    兼容适配器,能对结果返回值做一些类型转换,注入基本类型到装箱类型的互转,复合类型到序列化值的转换(依赖你配置的序列化类型)等。

    使用方式

    在consumer配置的filter上加上compatible即可。

    实现原理

    参见CompatibleFilter代码即可,比较简单。

    与Spring Cloud对比

    TODO

    TimeoutFilter

    作用

    用在provider侧,对超时的服务调用,打一个警告日志。

    使用方式

    无需配置,默认生效。

    实现原理

    参见TimeoutFilter代码即可,比较简单。

    与Spring Cloud对比

    TODO

    TraceFilter

    作用

    用在provider侧。

    使用方式

    无需配置,默认启用这个filter,但是要真正trace,需要telnet管理台,给其发指令,才能真正trace。支持指定接口,指定方法,指定最大trace多少次。

    实现原理

    trace的内容如下:

    if (count < max) {
        String prompt = channel.getUrl().getParameter(Constants.PROMPT_KEY, Constants.DEFAULT_PROMPT);
          channel.send("
    " + RpcContext.getContext().getRemoteAddress() + " -> "
                                            + invoker.getInterface().getName()
                                            + "." + invocation.getMethodName()
                                            + "(" + JSON.toJSONString(invocation.getArguments()) + ")" + " -> " + JSON.toJSONString(result.getValue())
                                            + "
    elapsed: " + (end - start) + " ms."
                                            + "
    
    " + prompt);
    }
    

    与Spring Cloud对比

    TODO

    FutureFilter

    作用

    用在consumer侧。dubbo的事件机制支持oninvoke、onreturn、onreturn事件监听,就是靠这个filter完成对接。

    使用方式

    参见dubbo的事件机制

    实现原理

    比较简单,参见FutureFilter代码。或者参见Dubbo源码分析----过滤器之FutureFilter

    与Spring Cloud对比

    TODO

    与Spring Cloud对比

    TODO

    MonitorFilter

    作用

    consumer,provider侧都可用。 会将服务的耗时,并发数等送给监控服务。

    使用方式

    filter默认启用,但是需要配置后才能触发监控。 配置dubbo:monitor。

    实现原理

    比较简单,参见MonitorFilter。 具体收集监控动作由MonitorService接口实现完成。dubbo自带了DubboMonitor实现。收集的数据暂时同步擦欧洲放在一个ConcurrentHashMap中,再由ScheduledExecutorService定时异步发送。

    与Spring Cloud对比

    Spring Cloud有专门的组件干这个。

  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/simoncook/p/9592190.html
Copyright © 2020-2023  润新知