有关Dubbo的介绍,在此就不多说了,在这里简单的分享一下,最近看dubbo源码的感受,阿里封装的东西,真心不错,下面就简单说一下Dubbo中的Filter。
Filter是一种递归的链式调用,能够达到在远程调用真正执行的前后加入一些逻辑操作,相当于AOP的连接器,或者跟Servlet中的Filter概念是一样的。
Dubbo中的Filter
上图中就是dubbo中的所有的filter,比如经常用的并发控制、超时设置、异常设置、tps限流设置等等都是通过filter来实现的。
具体的实现过程
上图就针对生产者和消费者来构建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) {
//遍历每一个Filter
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;
}
上述代码就展示了Filter构建的整个过程。