Dubbo源码分析之Exporter---服务暴露(本地和远程)
源码的版本是 2.7.0
前面介绍了,dubbo是怎么解析xml中的bean的,今天来分析下bean的导出的过程,这里服务的类是ServiceBean
当Spring完成对ApplicationContext的Refresh方法最后,会发布的一个ContextRefreshedEvent事件,这样保证所有Bean都已经完成了解析、注册、初始化等工作。
这里服务的导出是使用了Spring的监听机制,ServiceBean实现了ApplicationListener<ContenxtRefresh>,ApplicationContext发布的ContenxtRefreshedEvent
会触发监听事件给监听事件, 执行onApplicationEvent方法。
可以看到这里Iexport方法就是,服务导出的流程都是在这里做的。
这里可以看到,如果配置delay这个参数,是利用线程池去异步去导出,调用doExport函数去,是实现服务
的导出。
doExportUrls方法是导出URL,Dubbo所有的Bean的服务都是URL的方式导出的。
这里可以看出doExprotUrlsForProtocol方法是导出URL到Rrotocol层,
这里是根据配置的scope来决定是本地导出,还是远程导出。expportLocal是本地暴露,
这里主要本地导出流程,首先通过proxyFactory的getInvoker方法,转换成Invoker,这里proxyFactory对象实际的扩展对象是javassistProxyFactory,
这里可以看到getInvoker方法,返回的其实IAbstractProxyInvoker, 然后由protocol调用export方法到处得到Exproter, 这里的protocol的实际对象是
DubboProtocol, 调用export方法。
然后调用openServer方法,开启服务。
如果没有服务,则创建服务,接着createServer的方法。
这里是Exchanges.bind来绑定的URL和requestHandler 返回,ExchangeServer主要是管理通信的,而真实通信的是I由Transptorter完成,dubbo目前
扩展有netty和mina以及grizzly等通信框架。
requestHandler主要处理的数据的解码和反射调用方法,并返回数据等操作。下面的截图可以出来。详细的在下一篇介绍。
这个整个过程,dubbo完成的是服务提供者的服务导出。这时候还不能提供消费者使用,主要的是注册中心还没有介绍,接下来在分析。
总结:
今天,主要分析服务的本地导出为Exporter的过程。