dubbofilter(dubbofilter threadlocal)

本篇文章给大家谈谈dubbofilter,以及dubbofilter threadlocal对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

dubbo的Filter在调用的什么阶段执行的呢

dubbo的Filter在调用的什么阶段执行的呢

Dubbo的Filter是一个调用另一个的,最后再执行业务代码。

在这一行调下一个Filter,那么写在这行代码前面的代码就是在业务代码前拦截了,写在之后的代码就是执行完业务代码后拦截袜磨了。

直连加不发布服告尺斗务 DUBBO的配置属性里面对消费端提供了不从注册中心发现服务的机制,直接配置远程接口的地址,这样可以保证消费端连接到制定的环境接口。这样消费端是解决了问题,但是服务提供端呢?如上图的B1它即是消费端也是服务提供端,它提供A1所依赖的接口,那么如果B1将它的服务发布到注册中心里面(这里需要提醒,STABLE环境机制里面所有子环境公用一个注册中心),那么势必会导致stable环境里面的A会发现B1提供的服务?势必会导致stable环境的不稳定(stable环境的机制是stable环境只能进不能出,就是不能调用外部其他子环境的服务)?所以B1不能发布服务到注册中心,dubbo也提供了相关的配置属困帆性来支持这一点。

[img]

Dubbo filter扩展

filter其实是一种责任链模式,每个filter只负责完成自己职责的部分,解销前前除耦合,这种设计模式很利于扩展。

大家可能对Dubbo的filter不太熟悉,但是应该都写过Servlet的filter,让我们先来回顾一下Servlet的Filter:

我们重写doFilter,在chain.doFilter(request, response) 前后做一些切面的工作,比如防XSS攻击、CROS跨域请求处理、记录相关日志等,调用逻辑可以用下图来概括:

类似于Servlet中的filter,Dubbo也可以通过扩展filter来增强功能,Dubbo服务提供方和服务消费方均支持调用过程拦截,并且Dubbo 自身的大多功能均基于此扩展点实现,下面例举部分filter:

EchoFilter - 用于provider的回声测试,检测服务是否正常

ContextFilter - 用于provider接收RpcContext的参数

ConsumerContextFilter - 用于consumer传递RpcContext的参数

ExecuteLimitFilter - 用于provider的限流

ActiveLimitFilter - 用于consumer的限流

ExceptionFilter - 用于provider对异常进行封装

GenericFilter - 用于provider的泛化调用,可用于集成通用服务测试框架或为其他语言调用服务提供Restful接口的支持

AccessLogFilter - 用于provider 的access log记录

ClassLoaderFilter - 用于provider切换当前的ClassLoader

MonitorFilter - 用于dubbo monitor模块对consumer和provider进行监控

Dubbo filter的调用逻辑可以用下图来概括:

那么Dubbo是怎么将多个filter串起来的呢?

答案就位于ProtocolFilterWrapper这个类的buildInvokerChain方法。

看明白这里首先要理解Dubbo的SPI扩展点机制,ListFilter filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);这一行是获取Filter接口的所有被标注为@Activate的扩展点,然后基于回调让前一个filter调用后一个filter从而串成一个调用链,调用的先后顺序是由每个filter定义的order属性决定的(不声明默认为0),order值越小则调用优先级越高。

了解了Dubbo filter的作用和原理,那让我们来看看如何扩展:

Maven 项目结构:

src

  |-main

    |-java

      |-com

        |-xxx

           |-XxxFilter.java (实现Filter接口)

Dubbo自身的过滤器配置都放在resources/META-INF/dubbo/internal下,我们扩展的过滤器一版放在resources/META-INF/dubbo/下:

     |-resources

      |-META-INF

        |-dubbo

          |-com.alibaba.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)

XxxFilter.java:

META-INF/dubbo/com.alibaba.dubbo.rpc.Filter:

xxx=com.xxx.XxxFilter

我司生产亏清环境中利用Dubbo filter扩展来记录服务调用日志和服务调用链追踪。

1.服务调用日志记录:

服务调用日悔枣志记录分为provider日志和consumer日志两部分,provider日志记录的是当前工程作为provider的服务提供日志,consumer日志记录的是当前工程作为consumer的服务消费日志,以下是部分consumer日志内容:

日志会记录每一次调用的consumer的ip、端口、调用时间、provider的ip、端口、接口请求的时间、调用的方法、调用耗时、调用结果(成功或失败,失败则打印异常)、方法入参(可选)、返回值(可选)等。

由于每次调用的入参和返回值的内容比较多,所以方法入参和返回值是否打印都是可以配置的,filter会根据当前配置的日志等级去打印。

2.调用链追踪:

Dubbo Filter结合brave + zipkin实现RPC调用链追踪和梳理项目间的依赖关系,filter中用brave向zipkin服务器异步发送http请求(也可以用kafka),zipkin服务器对数据进行分析汇总,很容易分析出性能的瓶颈在哪,效果如下:

如果有人对这些具体实现感兴趣,笔者会开放源码。

最后提醒一点,filter的实现中不要写太耗时的方法,会影响性能。

dubbo的Filter机制

以dubbo官方demo为例,在provider端,从netty接收到消息,递交给业务线程池处理开始,到真正调用到业务方法sayHello()结束,中间经过了十几个Filter的处理。见下图

那么这些Filter是如何初始化的,调用的时候又是如何执行的呢?接下来一步一步介绍。

dubbo在进行服务导出时主要做了如下一些工作

可者核以看到:第二步中核心工作就包括Filter的初始化。见下ProtocolFilterWrapper#export方法

其中有一步是buildInvokerChain,从名字上也可以看出,这是初始化一个责任链,对应设计模式中的责任链模式。接着看这个责任链是怎么初始化的(ProtocolFilterWrapper#buildInvokerChain)

可以看到这个Filter的责任链初始化过程

1.通过dubbo spi机制,取得所有Filter实例形成一个ArrayListFilter

2.遍历这个ArrayList,以next指针初始化一个Invoker的链表InvokerList

3.Invoker执行逻辑即执行Filter的invoke方法的同时,将next指针作为参轮嫌侍数传入,以支持链式调用

整个过程结束之后,会有两个List,一个ArrayListFilter,一个以NEXT指针形成的InvokerList,这两个List就是dubbo Filter机制的基础。

Filter接口提供了一个invoke方法,另一个是Listener接口,有onResponse,onError两个方法。

这两部分对应着Filter对请求和响应的处理逻辑

请求的处理以AccessLogFilter#invoke的实现为例,可以看到,其首先进行AccessLog的处理,然后调用

invoker.invoke().这个invoker即之前Filter初始化的时候,以Next指针形成的那个InvokerList链表中的节点。这样一来,整个链表中的节点都会得到顺序执行。

响应的处理可以见CallbackRegistrationInvoker#invoke

之前Filter初始化的时候,会形成两个list,next指针形成的那个链表用于对请求的处理,另一个ArrayListFilter 就是在此时执行,拿到结果之后,遍历这腊吵个ArrayList,执行其onResponse或者onError方法,如此一来,请求和响应应就会经过所有生效的Filter处理。

总结:dubbo的Filter机制是一种典型的责任链模式,这个链的基础即上述两个list。如果我们在自己的业务场景中,需要对请求或者响应做一些通用的处理,那么也很简单,直接基于dubbo spi(

),自定义逻辑实现Filter接口的相应方法即可。

关于dubbofilter和dubbofilter threadlocal的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表