org.apache.dubbo.rpc.Filter
核心功能
- 拦截RPC调用流程
Filter
是Dubbo框架中实现拦截逻辑的核心接口,作用于服务消费者和提供者的作业链路,支持在方法调用前后插入自定义逻辑。如参数校验、异常处理、日志记录等。 - 扩展性机制
Dubbo通过SPI扩展机制动态加载Filter实现类,构建链式调用结构,每个Filter通过Invoke
方案传递调用上下文,最终执行目标方法。
实现机制
- 责任链模式
Provider端Filter链在服务暴露时通过FilterChainBuilder#buildInvokerChain
方法构建,基于SPI配置按优先级排序,形成多层拦截逻辑。 - SPI加载规则
Filter实现类需要在META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
文件中声明,并通过@Activate
注解配置激活条件(如服务端/消费端) - 动态加载
Filter链在服务初始化阶段动态生成,通过ExtensionLoader
加载所有激活的Filter实例,并按顺序包装成调用链。
常见内置Filter实现
Filter名称 | 功能描述 | 适用端 |
---|---|---|
ExceptionFilter | 统一处理服务端异常,将非受检异常封装为RuntimeException 返回客户端 | Provider |
ValidationFilter | 基于JSR303标准校验接口参数合法性 | Both |
AccessLogFilter | 记录服务调用日志,指定输出到指定文件 | Provider |
TimeoutFilter | 监控方法执行超时,触发超时中断逻辑 | Provider |
GenericFilter | 处理泛化调用的序列化与反序列化 | Both |
自定义Filter实现步骤
- 实现Filter接口
import com.alibaba.fastjson2.JSON;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;// 使用@Activate注解指定Filter生效场景
// order属性控制执行顺序,值越小,优先级越高
@Activate(group = {CommonConstants.CONSUMER, CommonConstants.PROVIDER}, order = 10001)
public class CustomFilter implements Filter {private Logger logger = LoggerFactory.getLogger(CustomFilter.class);@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {logger.info("invoker invoked method {} {} {} {}",invocation.getMethodName(),JSON.toJSONString(invocation.getObjectAttachments()),invocation.getAttributes(),JSON.toJSONString(invocation.getArguments()));Result result = invoker.invoke(invocation);logger.info("invoker invoked result {}", JSON.toJSONString(result));return result;}
}
- 声明SPI扩展
在resources/META-INF/dubbo目录下创建配置文件org.apache.dubbo.rpc.Filter,添加自定义Filter类路径:
consumer=com.doudou.demo.filter.CustomFilter
ValidationFilter
Dubbo的ValidationFilter
是基于JSR303标准实现的参数校验组件,主要用于服务消费者和服务提供者两端,确保接口调用时参数的合法性。
核心特性
- 作用机制
- 通过
@Activate
注解激活,默认作用于消费者和服务者两端,执行顺序为10000。 - 在请求处理前拦截参数,利用JSR303标准的注解进行校验,校验失败时抛出异常中断流程。
- 通过
- 依赖配置
- 需要引入
validation-api
和hibernate-validator
依赖包<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version> </dependency> <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.0.Final</version> </dependency>
- 需要引入
使用
@Setter
@Getter
public class ValidateUserInfo implements Serializable {private static final long serialVersionUID = 1558193327511325424L;// 添加了 @NotBlank 注解 @NotBlank(message = "id 不能为空")private String id;// 添加了 @Length 注解 @Length(min = 5, max = 10, message = "name 必须在 5~10 个长度之间")private String name;private String sex;
}
@DubboReference(validation = "jvalidation")
private ValidationFacade validationFacade;
@DubboService(validation = "jvalidation")
public class ValidationFacadeImpl implements ValidationFacade {}