一、添加默认过滤器
- 只有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;
}
}
- 有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个
默认服务引用的时候满足条件的过滤器有3个
小结:
1. 可以使用@Activate激活或者配置文件激活两种方式
2. 自定义的filter需要写在com.alibaba.dubbo.rpc.Filter文件里
3. 撤销过滤器使用 filter标签,使用减号加上过滤器扩展类的配置的别名
关于@Activate注解,请看Activate注解