dubbo Filter的作用: 在业务代码执行前后加入逻辑操作,又不影响业务逻辑,比如服务跟踪(
点击打开链接)。
dubbo Filter的执行时间点:若是服务消费方,则在调用业务代码之后执行;若是服务提供方,则在调用业务代码之前执行。
dubbo Filter的执行时间点:若是服务消费方,则在调用业务代码之后执行;若是服务提供方,则在调用业务代码之前执行。
dubbo内置了Filter的一些实现,配置文件位置位于:META-INF\dubbo\internal\com.alibaba.dubbo.rpc.Filter,若是用户实现,配置文件位于项目META-INF\dubbo\com.alibaba.dubbo.rpc.Filter
Filter的加载源码位于ProtocolFilterWrapper类,具体实现过程
Filter构建的过程位于方法:buildInvokerChain
private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
Invoker<T> last = invoker;
//查询配置文件下所有的Filter
List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
if (filters.size() > 0) {
for (int i = filters.size() - 1; i >= 0; i --) {
final Filter filter = filters.get(i);
final Invoker<T> next = last;
last = new Invoker<T>() {
public Class<T> getInterface() {
return invoker.getInterface();
}
public URL getUrl() {
return invoker.getUrl();
}
public boolean isAvailable() {
return invoker.isAvailable();
}
public Result invoke(Invocation invocation) throws RpcException {
//责任链传递调用
return filter.invoke(next, invocation);
}
public void destroy() {
invoker.destroy();
}
@Override
public String toString() {
return invoker.toString();
}
};
}
}
return last;
}