读dubbo源码笔记(三)

现在看核心的ServiceConfig

首先推荐看以下netcomm童鞋的文章

http://www.iteye.com/topic/1123039

在服务提供者暴露一个服务的详细过程讲解的很清楚

服务提供者暴露一个服务

这些代码基本上都是在ServiceConfig完成

过程是

export--doExport--doExportUrls

export方法主要是解决立即doExport还是delay以后执行

doExport主要是装配和检查--application,registries,monitor,Protocol

doExportUrls真正的干活了

最主要的在最后的一段

if (registryURLs != null && registryURLs.size() > 0
                    && url.getParameter("register", true)) {
                for (URL registryURL : registryURLs) {
                    URL monitorUrl = loadMonitor(registryURL);
                    if (monitorUrl != null) {
                        url = url.addParameterAndEncoded(Constants.MONITOR_KEY, monitorUrl.toFullString());
                    }
                    String providerURL = url.toFullString();
                    if (logger.isInfoEnabled()) {
                        logger.info("Register dubbo service " + interfaceClass.getName() + " url " + providerURL + " to registry " + registryURL);
                    }
                    Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, providerURL));
                    Exporter<?> exporter = protocol.export(invoker);
                    exporters.add(exporter);
                }
            } else {
                Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
                Exporter<?> exporter = protocol.export(invoker);
                exporters.add(exporter);
            }

如果发现需要注册那么

从proxyFactory获取AbstractProxyInvoker---(这里的URL是RegistryURL,里面放置了ProviderURL)---然后通过RegistryProtocol注册--(export)--然后,生成InvokerDelegete--(这里的URL是从RegisterURL取出ProviderURL)--在根据实际ProviderProtocol--(export)--成Exporter

RegistryProtocol类里面这么玩的

public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {
        //export invoker
        final ExporterChangeableWrapper<T>  exporter = doLocolExport(originInvoker);
        //registry provider
        Registry registry = doRegister(originInvoker);
        //设置exporter与registry的关系 (for unexport)
        exporter.setRegistry(registry);
        //保证每次export都返回一个新的exporter实例
        return new Exporter<T>() {
            public Invoker<T> getInvoker() {
                return exporter.getInvoker();
            }
            public void unexport() {
                exporter.unexport();
            }
        };
    }

doLocolExport--最终执行providerProtocol(dubboProtocol,rmiProtocol等......................)的export方法,

doRegister注册URL,实际上默认情况下也是一个dubbo协议RPC

相关推荐