读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