本文共 3268 字,大约阅读时间需要 10 分钟。
dubbo-rpc分为几个模块
在具体的实现protocol之前,有两个包装类ProtocolFilterWrapper 和ProtocolListenerWrapper
filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperlistener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrappermock=com.alibaba.dubbo.rpc.support.MockProtocol
ProtocolFilterWrapper 核心方法是buildInvokerChain,构建Chain
AbstractProtocol 定义其抽象类,我们看下dubboProtocol的实现
publicExporter export(Invoker invoker) throws RpcException { URL url = invoker.getUrl(); // export service. String key = serviceKey(url); DubboExporter exporter = new DubboExporter (invoker, key, exporterMap); exporterMap.put(key, exporter); //export an stub service for dispaching event Boolean isStubSupportEvent = url.getParameter(Constants.STUB_EVENT_KEY,Constants.DEFAULT_STUB_EVENT); Boolean isCallbackservice = url.getParameter(Constants.IS_CALLBACK_SERVICE, false); if (isStubSupportEvent && !isCallbackservice){ String stubServiceMethods = url.getParameter(Constants.STUB_EVENT_METHODS_KEY); if (stubServiceMethods == null || stubServiceMethods.length() == 0 ){ if (logger.isWarnEnabled()){ logger.warn(new IllegalStateException("consumer [" +url.getParameter(Constants.INTERFACE_KEY) + "], has set stubproxy support event ,but no stub methods founded.")); } } else { stubServiceMethodsMap.put(url.getServiceKey(), stubServiceMethods); } } openServer(url); return exporter; }
@SPIpublic interface Filter { /** * do invoke filter. * * * // before filter * Result result = invoker.invoke(invocation); * // after filter * return result; *
* * @see com.alibaba.dubbo.rpc.Invoker#invoke(Invocation) * @param invoker service * @param invocation invocation. * @return invoke result. * @throws RpcException */ Result invoke(Invoker invoker, Invocation invocation) throws RpcException;}
主要是ListenerInvokerWrapper和ListenerExporterWrapper ,监听模式为以后做个扩展呗,目前dubbo没有使用
基于字节码还是基于反射,来动态创建实例
@SPI("javassist")public interface ProxyFactory { /** * create proxy. * * @param invoker * @return proxy */ @Adaptive({Constants.PROXY_KEY})T getProxy(Invoker invoker) throws RpcException; /** * create invoker. * * @param * @param proxy * @param type * @param url * @return invoker */ @Adaptive({Constants.PROXY_KEY}) Invoker getInvoker(T proxy, Class type, URL url) throws RpcException;}
/** * 通用服务接口 * * @author william.liangf * @export */public interface GenericService { /** * 泛化调用 * * @param method 方法名,如:findPerson,如果有重载方法,需带上参数列表,如:findPerson(java.lang.String) * @param parameterTypes 参数类型 * @param args 参数列表 * @return 返回值 * @throws Throwable 方法抛出的异常 */ Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException;}
转载地址:http://tgukb.baihongyu.com/