1.SOFA RPC源码解析
1.1 FilterChain
在SOFA RPC设计中,FilterChain是比较有新意的。它没有采用常用的List列表模式,即在List列表中存储Filter实现,然后按照Filter在列表中的顺序依次调用各Filter接口的filter方法,完成过滤器功能。
FilterChain简化类图如下:
首先,FilterChain实现了调用器com.alipay.sofa.rpc.invoke.Invoker接口;
其次,Filter为抽象类,非单例模式,其子类需要实现invoke(FilterInvoker invoker, SofaRequest request)方法,实现具体的过滤功能。在此需要注意,invoke方法除了request参数外,还需要invoker方法,表示下一个Filter的调用对象,这点不同于常见的List列表实现方式。
然后,引入新的FilterInvoker,该类实现了Invoker接口,为Filter的封装类,用作把过滤器包装成Invoker对象。另外,FilterInvoker采用链表节点设计方式,通过其构造函数FilterInvoker(Filter nextFilter, FilterInvoker invoker,AbstractInterfaceConfig config)可以看出,FilterInvoker包括两个主要属性:Filter类型的nextFilter,表示下一层过滤器;FilterInvoker类型的invoker,表示下一层Invoker。这种设计方式解耦了Filter和Service。同时,以FilterInvoker为链表节点,可以构造一个Filter执行链。
再看一下FilterChain,