Filter
在本文中,我们来了解如何扩展自定义的过滤器实现:一个可以对返回的结果进行统一的处理、验证等统一 Filter 处理器,减少对开发人员的打扰。
在 RPC框架 - Filter请求拦截 一节中,我们了解了 Filter 的工作机制,以及 Dubbo 框架提供的一些内置 Filter 实现。在本文中,我们来了解如何扩展自定义的过滤器实现:一个可以对返回的结果进行统一的处理、验证等统一 Filter 处理器,减少对开发人员的打扰。
本示例的完整源码请参见 dubbo-samples-extensibility。除了本示例之外,Dubbo 核心仓库 apache/dubbo 以及扩展库 apache/dubbo-spi-extensions 中的众多 Filter 实现,都可以作为扩展参考实现。
任务详情
对所有调用Provider服务的请求在返回的结果的后面统一添加's customized AppendedFilter。
实现方式
在Provider中自定义一个Filter,在Filter中修改返回结果。
代码结构
1. src
2. |-main
3. |-java
4. |-org
5. |-apache
6. |-dubbo
7. |-samples
8. |-extensibility
9. |-filter
10. |-provider
11. |-AppendedFilter.java (实现Filter接口)
12. |-resources
13. |-META-INF
14. |-application.properties (Dubbo Provider配置文件)
15. |-dubbo
16. |-org.apache.dubbo.rpc.Filter (纯文本文件)
代码详情
1. package org.apache.dubbo.samples.extensibility.filter.provider;
3. import org.apache.dubbo.rpc.Filter;
4. import org.apache.dubbo.rpc.Result;
5. import org.apache.dubbo.rpc.Invoker;
6. import org.apache.dubbo.rpc.Invocation;
7. import org.apache.dubbo.rpc.RpcException;
8. import org.apache.dubbo.rpc.AsyncRpcResult;
10. public class AppendedFilter implements Filter {
12. @Override
13. public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
14. Result result= invoker.invoke(invocation);
15. // Obtain the returned value
16. Result appResponse = ((AsyncRpcResult) result).getAppResponse();
17. // Appended value
18. appResponse.setValue(appResponse.getValue()+"'s customized AppendedFilter");
19. return result;
20. }
21. }
SPI配置
在resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter文件中添加如下配置:
1. appended=org.apache.dubbo.samples.extensibility.filter.provider.AppendedFilter
配置文件
在resources/application.properties文件中添加如下配置,激活刚才的自定义 Filter 实现:
1. # Apply AppendedFilter
2. dubbo.provider.filter=appended
注意
除了通过配置激活 Filter 实现之外,还可以通过为实现类增加 @Activate 注解,以在满足某些条件时自动激活 Filter 实现,如:
1. @Activate(group="provider")
2. public class AppendedFilter implements Filter {}
这个 Filter 实现将在 Provider 提供者端自动被激活。
运行结果
以使用本地IDE的方式来运行任务,结果如下:

最后修改 September 13, 2024: Refactor website structure (#2860) (1a4b998f54b)
