• 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有专门的组件干这个。

  • 相关阅读:
    环境配置 | 安装Jupyter Notebook及jupyter_contrib_nbextensions库实现代码自动补全
    环境配置 | mac环境变量文件.bash_profile相关
    Django | 解决“(1146, "Table 'mydb.django_session' doesn't exist")”报错的方法
    Django | pycharm 提示 unresolved attribute referene 'objects' for class 'xxxx'
    站点中添加企业qq的几种方式
    div自适应高度
    SVN服务器搭建和使用(三)
    SVN服务器搭建和使用(二)
    SVN服务器搭建和使用(一)
    宽度为100%,缩小窗口,右侧的区域背景图片变成空白
  • 原文地址:https://www.cnblogs.com/simoncook/p/9592190.html
Copyright © 2020-2023  润新知