Dubbo接口中的Filter

如果是http请求的话,filter很容易就能写出来,现在项目全部换成dubbo接口,也想使用拦截器进行统一操作预处理,就需要用到dubbo里的filter。
自定义的filter需要去实现org.apache.dubbo.rpc.Filter接口,同时实现接口里边的invoke方法。consumer的filter见另一篇博客consumer
具体步骤如下
1.编写filter类,该类实现org.apache.dubbo.rpc.Filter接口以及接口的invoke方法。

@Slf4j
public class DubboFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Long startTime = System.currentTimeMillis();
        Result res = null;
        try {
            return invoker.invoke(invocation);
        } finally {
            Long endTime = System.currentTimeMillis();
            log.info("invoke的时间:"+(endTime-startTime)+"毫秒");
        }
    }
}

2.在该类上使用@Activate(group = {CommonConstants.CONSUMER})自动激活扩展点注解,对自定义过滤器进行的注册,通过group属性确定是生产端还是消费端。
这里group属性其实和3中的filter属性重复,此处可以不写group属性

@Activate
@Slf4j
public class DubboFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Long startTime = System.currentTimeMillis();
        Result res = null;
        try {
            return invoker.invoke(invocation);
        } catch(Exception e) {
            res.setValue(e.getMessage());
            log.error("res={}",res);
            return res;
        }  finally {
            Long endTime = System.currentTimeMillis();
            log.info("invoke的时间:"+(endTime-startTime)+"毫秒");
        }
    }
}

3.在dubbo接口的注解@Service(老版本为@DubboService)的属性中写上

@Service(registry = "provider",filter = "dubboFilter")

此处的registry是因为我项目里用了多个group的dubbo接口。
此处filter的名字是步骤4里你指定的名字。
4.在项目的resource路径下新建META-INF.dubbo路径,同时在该路径下新建文件org.apache.dubbo.rpc.Filter,文件内容为(写上filter类的全路径)比如我的为(com.umab.filter.DubboFilter)

dubboFilter=***.***.DubboFilter

5.在pom文件里的标签里写上如下内容

		<defaultGoal>compile</defaultGoal>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.*
                
            
        

表示你在打jar包的时候把resource的文件也打上。
至此就可以了。

你可能感兴趣的:(日常工作问题,java,web开发,Dubbo,filter,java,dubbo)