Filter

一、添加默认过滤器

  1. 只有group属性
@Activate(group = "provider")
public class MyFitler implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        Map<String, String> attachments = invocation.getAttachments();
        System.out.println("自定义过滤器调用啦===============================");
        System.out.println("传递到服务端的参数有:" + attachments);
        Result invoke = invoker.invoke(invocation);

        return invoke;
    }
}
  1. 有group属性和value属性
@Activate(group = "provider", value="filter")
public class MyFitler implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        Map<String, String> attachments = invocation.getAttachments();
        System.out.println("自定义过滤器调用啦===============================");
        System.out.println("传递到服务端的参数有:" + attachments);
        Result invoke = invoker.invoke(invocation);

        return invoke;
    }
}

然后需要配置过滤器的扩展类

com.alibaba.dubbo.rpc.Filter

myFilter=per.qiao.myprotocol.filter.MyFitler

对于第一种情况,就已经完成了配置。在调用服务的时候就会执行那个过滤器

对于第二种情况,你需要配置一个变量,它需要等于filter或者以.filter结尾

比如这种就可以了 filter作为服务端发布的一个参数,在URL中会显示为server.filter(以.filter结尾)

<dubbo:service interface="per.qiao.service.TestService" ref="serviceImpl" timeout="600000" protocol="dubbo" filter="myFilter" >

怎么说呢,不推荐使用value属性,dubbo没有预留一个参数来设置这个属性也就是不能个性化的设置,所以就不用为好
3. 至于@Activate(group = "{provider, consumer}") 这种group有两个的情况下,传入的gruop满足一个就行了.

二、添加普通过滤器

public class MyFitler implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        Map<String, String> attachments = invocation.getAttachments();
        System.out.println("自定义过滤器调用啦===============================");
        System.out.println("传递到服务端的参数有:" + attachments);
        Result invoke = invoker.invoke(invocation);

        return invoke;
    }
}

然后需要配置过滤器的扩展类

com.alibaba.dubbo.rpc.Filter

myFilter=per.qiao.myprotocol.filter.MyFitler

spring配置

<!-- 1、配置在service上 -->
<dubbo:service interface="per.qiao.service.TestService" ref="serviceImpl" timeout="600000" protocol="dubbo" filter="myFilter" >
<!-- 2、配置为全局参数 -->
<dubbo:provider filter="myFilter" />

在针对某个请求过滤时用第一种定义种配置,全局使用的时候使用第二种配置

三、撤销过滤器

有时候不想要特定的过滤器,怎么办呢,dubbo给出了处理方法。

在配置filter时,我们可以使用xml来控制。

spring配置

<!-- 1、添加一个自定义的过滤器myFilter,去掉一个系统默认的过滤器monitor -->
<dubbo:service interface="per.qiao.service.TestService" ref="serviceImpl" timeout="600000" protocol="dubbo" filter="myFilter,-monitor" >
</dubbo:service>

<!-- 2、 全局过滤器 添加一个自定义的和删除一个不用的-->
<dubbo:provider filter="myFilter,-monitor" />

倘若你向去掉所有的默认过滤器(自定义被@Activate标识的且被容器dubbo加载的也算默认过滤器),那么你可以配置filter="-default";

-号代表删除过滤器,不写-就是添加

默认服务暴露的时候满足条件的过滤有9个

服务暴露时的默认Filter

默认服务引用的时候满足条件的过滤器有3个
服务引用时的过滤器

小结:
1. 可以使用@Activate激活或者配置文件激活两种方式
2. 自定义的filter需要写在com.alibaba.dubbo.rpc.Filter文件里
3. 撤销过滤器使用 filter标签,使用减号加上过滤器扩展类的配置的别名

关于@Activate注解,请看Activate注解

原文地址:https://www.cnblogs.com/qiaozhuangshi/p/11007080.html