dubbo Filter使用

码林潮汐
• 阅读 4917

本篇文章主要是介绍一下dubbo filter功能的使用以及其原理。

什么是dubbo filter

dubbo filter是dubbo提供的一项扩展的功能,dubbo在做调用的过程中,会先经过一层filter,顾名思义,也就是一层拦截过滤。通过dubbo filter功能,我们可以记录一些额外的操作日志、传递一些公共的信息、做一些自定义校验和权限控制等。

如何使用自定义filter

dubbo 提供了Filter接口类,我们只要定义一个自己的类,然后继承该接口即可实现自己的逻辑。
dubbo Filter使用
以实现一个传递链路唯一追踪号为案例来看下如何实现,比如现在我有一个A服务,还有一个B服务,现在A服务有自己的逻辑链路追踪号,需要传递到B服务中去,使得两个服务能够用同一个追踪号来关联某一次请求的所有链路。
A服务先定义一个自己的Filter类并实现dubbo的Filter接口:

//对于服务提供端,Activate改为Constants.PROVIDER
@Activate(group = {Constants.CONSUMER})
public class UniqIdTraceFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        //此处逻辑可以自定义
        String traceId = UUID.randomUUID().toString().replace("-", "");
        RpcContext.getContext().setAttachment("traceId", traceId);
        return invoker.invoke(invocation);
    }
}

再在resources目录下新建一个META-INF文件夹,在其下再创建一个dubbo目录。在META-INF\dubbo目录下创建一个名称为org.apache.dubbo.rpc.Filter(如果你用的是2.7之前的版本,则名称为com.alibaba.dubbo.rpc.Filter),如图:
dubbo Filter使用
在文件里写上你定义的filter全名
uniqIdTraceFilter=com.example.dubboanalyze.filter.UniqIdTraceFilter
到这里,我们演示的dubbo filter就完成了。

如何使用原生filter

Dubbo 内置了一些 Filter 实现,这些 Filter 在平时默认是不会启用的,因为上面没有加 @Activate 标签,比如 MetricsFilter
dubbo Filter使用
那我们想要使用的话,怎么启用呢?其实很简单,只要在配置中添加对应的filter就可以了
dubbo Filter使用
当然同理,对于我们自己实现的 Filter,也可以通过这种方式使用,而不是添加 @Activate 标签。

原理

上面介绍的案例非常简单,那么中间到底是怎么实现的呢?
这里要从服务引用的时候说起,我们在启动消费端的时候,dubbo会基于protocol创建一个invoker,invoker维护着某个接口的远程调用,在创建invoker的时候也是基于spi机制加载所有需要的Protocol,这里有一个Protocol就是ProtocolFilterWrapper
dubbo Filter使用
该Protocol在创建invoker的时候加载了所有的Filter,这里使用了责任链模式,我们在上面自定义的Filter就是被加载到这里的。
dubbo Filter使用
从代码中我们可以看到返回的Invoker是一个Filter的包装,传入的Invoker是在所有filter调用之后才会调用,这样就做到了过滤拦截的功能。

原生Filter

dubbo本身带有一些Filter实现,都发挥了各自的作用
dubbo Filter使用
比如GenericFilter就是dubbo用来拦截并实现泛化调用的功能,TokenFilter用来做调用的令牌验证,CacheFilter来实现缓存等。具体大家可以自己再去了解。

总结

dubbo filter本身的实现还是比较简单的,dubbo也提供了非常方便的自定义扩展。

点赞
收藏
评论区
推荐文章
Chase620 Chase620
4年前
Dubbo 源码分析 - 服务调用过程
Dubbo源码分析服务调用过程注:本系列文章已捐赠给Dubbo社区,你也可以在Dubbo中阅读本系列文章。1\.简介在前面的文章中,我们分析了DubboSPI、服务导出与引入、以及集群容错方面的代码。经过前
Stella981 Stella981
4年前
Dubbo原理和源码解析之服务暴露
github新增仓库"dubboread"(点此查看(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fcyfonly%2Fdubboread)),集合所有《Dubbo原理和源码解析》系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展
Stella981 Stella981
4年前
Dubbo分层架构概述
本节我们从整体上来看看Dubbo的分层架构设计,架构分层是一个比较经典的模式,比如网络中的7层协议,每层执行固定的功能,上层依赖下层提供的功能,下层对上层提供功能,下层的改变对上层不可见,并且每层都是一个可被替换的组件。如下图是Dubbo官方提供的Dubbo的整体架构图:!(https://oscimg.oschina.net/osc
Stella981 Stella981
4年前
Dubbo Filter机制概述
微信公众号:\中间件兴趣圈\作者简介:《RocketMQ技术内幕》作者从上文可知,在服务的调用或消费端发送请求命令中,Dubbo引入过滤器链机制来实现功能的包装(或扩展)。Dubbo很多功能,例如泛化调用、并发控制等都是基于Filter机制实现的,系统默认的Filter在/dubborpcapi/src/main/resou
Stella981 Stella981
4年前
Dubbo协议及序列化
Dubbo是Alibaba开源的分布式服务框架远程调用框架,在网络间传输数据,就需要通信协议和序列化。一通信协议Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的,默认也是用的dubbo协议。先介绍几种常见的协议:1\.
Stella981 Stella981
4年前
GoFramework框架简介(四)dubbo篇
框架中dubbo配置说明:Provider端配置如下:<dubbo:protocolname"dubbo"host"${dubbo.host}"port"${dubbo.port}"/<!服务提供者filter,在Provider上尽量多配置Consumer端属性,配置的覆盖规则:1)
Stella981 Stella981
4年前
Netty在Dubbo中的线程名称
在项目中,我们会使用RocketMQ和Dubbo.前者用于发送或消费消息,后者用于两个模块之间的接口调用.RocketMQ和Dubbo在它们的底层都使用Netty作为网络通信的框架.那么今天我们就来看一下,在Dubbo中,使用的Netty线程名称叫什么?环境和流程如下1.启动zookeeper2.一个简单的Dubbo提供者,并启动它
Stella981 Stella981
4年前
Dubbo原理和源码解析之标签解析
github新增仓库"dubboread"(点此查看(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fcyfonly%2Fdubboread)),集合所有《Dubbo原理和源码解析》系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展
Stella981 Stella981
4年前
Netty在Dubbo服务暴露时何时被使用
Dubbo的底层通信使用的是Netty.关于Dubbo的服务暴露流程,网络上已经有很多优质的文章.此篇文章以Dubbo的服务暴露为主线(不会详细讲解),观察一下,Netty在服务暴露过程中何时被使用.// 服务暴露的起点流程会走到如下代码privatevoiddoExportUrls(){
Stella981 Stella981
4年前
Dubbo是什么?能做什么?
1\.Dubbo是什么?Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用
Stella981 Stella981
4年前
Dubbo之服务调用
概述Dubbo能够像调用本地服务一样调用远程服务,是依赖于Dubbo的代理机制。业务系统调用的服务方法,使用代理类,代理类里隐藏了远程通信的功能。代理对象会代理到InvokerInvocationHandler上,再调用它属性Invoker_invoke_()方法。这个Invoker是服务引用的过程中由Protocol创建的。比如