关于Dubbo的Filter 具体如何组装参考如下:
public class ProtocolFilterWrapper implements Protocol { private final Protocol protocol; public ProtocolFilterWrapper(Protocol protocol) { if (protocol == null) { throw new IllegalArgumentException("protocol == null"); } else { this.protocol = protocol; } } private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) { final Invoker<T> last = invoker; 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 = (Filter)filters.get(i); 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(last, invocation); } public void destroy() { invoker.destroy(); } public String toString() { return invoker.toString(); } }; } } return last; } public int getDefaultPort() { return this.protocol.getDefaultPort(); } //服务端暴露 public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException { return "registry".equals(invoker.getUrl().getProtocol()) ? this.protocol.export(invoker) : this.protocol.export(buildInvokerChain(invoker, "service.filter", "provider")); } //客户端引用 public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException { return "registry".equals(url.getProtocol()) ? this.protocol.refer(type, url) : buildInvokerChain(this.protocol.refer(type, url), "reference.filter", "consumer"); } public void destroy() { this.protocol.destroy(); } }
文章来源: https://blog.csdn.net/lxz521lxz/article/details/90770254