dubbo3 filter(过滤器)
简介
- 类似于 java web 中的 filter
- 也和 spring mvc 中的 intercaptor
- 在请求的发送后或者是请求到达前集中的做一些预处理工作
- 在 dubbo 中也会通过过滤器来完成限流和监控的工作
dubbo 过滤器运行时机
consumer 在调用的时候负载均衡已经选择了一个具体的实例进行调用,那么会依次执行 conusmer 端端调用链(调用链是 filter),然后到达 provider ,会继续执行 provider 的调用链(这里是 filter),完成响应的时候也会依次调用这些链
自定义 filter
在 dubbo 中自定义 filter 可以有两种方式。
第一种 @active 注解激活
在项目目录下面创建文件夹 meta-inf/dubbo 下面创建 filter 的权限定类名,(org.apache.dubbo.rpc.filter),然后在文件内部写入我们的注册信息,名字=自定义 filter 的权限定类名,注册成功以后需要激活我们的配置,@activate(group = commonconstants.provider)
myproviderfilter=com.rpc.dubbo.provider.filter.myproviderfilter
代码:
package com.rpc.dubbo.provider.filter; import lombok.extern.slf4j.slf4j; import org.apache.dubbo.common.constants.commonconstants; import org.apache.dubbo.common.extension.activate; import org.apache.dubbo.rpc.*; /** * @author xl-9527 * @since 2025/1/11 **/ @slf4j @activate(group = commonconstants.provider) // active 中 group 的设置是表示他运行在 consumer 还是 provider 端,这是必须要要配置的 public class myproviderfilter implements filter { /** * @param invoker 实际这次的调用 * @param invocation 本次调用的参数 * @return 调用结果,这里的调用结果是从 provider 端调用过来的 */ @override public result invoke(final invoker<?> invoker, final invocation invocation) throws rpcexception { system.out.println("invoker.geturl() = " + invoker.geturl()); system.out.println("invocation.getmethodname() = " + invocation.getmethodname()); system.out.println("invocation.getservicemodel().getservicename() = " + invocation.getservicemodel().getservicename()); log.info("myproviderfilter invoke"); return invoker.invoke(invocation); } }
第二种使用 @dubboservice(filter=“key”)
这种方式需要直接在 service 中配置我们在 spi 中设置的 key
例如我们刚刚设置的 myproviderfilter(这里的源码服用了第一种里面的)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论