Filter

Posted qiaozhuangshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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没有预留一个参数来设置这个属性也就是不能个性化的设置,所以就不用为好

  1. 至于@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注解

以上是关于Filter的主要内容,如果未能解决你的问题,请参考以下文章

JS常用代码片段2-值得收藏

filter与servlet

php代码片段: sendFile/videoStream/sendEmail/phpexcel/ffmpeg/zip

将多个输出中的hls属性设置为单独的片段代码

text 此片段用于以下知识库文章 - http://kb.wpbeaverbuilder.com/article/591-create-a-filter-to-customize-the-di

如何利用redis来进行分布式集群系统的限流设计