Dubbo源码分析之Exporter---服务暴露(本地和远程)

  源码的版本是 2.7.0  

      前面介绍了,dubbo是怎么解析xml中的bean的,今天来分析下bean的导出的过程,这里服务的类是ServiceBean

Dubbo源码分析之Exporter---服务暴露(本地和远程)

         当Spring完成对ApplicationContext的Refresh方法最后,会发布的一个ContextRefreshedEvent事件,这样保证所有Bean都已经完成了解析、注册、初始化等工作。

Dubbo源码分析之Exporter---服务暴露(本地和远程)

    这里服务的导出是使用了Spring的监听机制,ServiceBean实现了ApplicationListener<ContenxtRefresh>,ApplicationContext发布的ContenxtRefreshedEvent

会触发监听事件给监听事件, 执行onApplicationEvent方法。

Dubbo源码分析之Exporter---服务暴露(本地和远程)

       可以看到这里Iexport方法就是,服务导出的流程都是在这里做的。

  Dubbo源码分析之Exporter---服务暴露(本地和远程)

       这里可以看到,如果配置delay这个参数,是利用线程池去异步去导出,调用doExport函数去,是实现服务

的导出。

  Dubbo源码分析之Exporter---服务暴露(本地和远程)

     doExportUrls方法是导出URL,Dubbo所有的Bean的服务都是URL的方式导出的。

Dubbo源码分析之Exporter---服务暴露(本地和远程)

      这里可以看出doExprotUrlsForProtocol方法是导出URL到Rrotocol层,

Dubbo源码分析之Exporter---服务暴露(本地和远程)  

     这里是根据配置的scope来决定是本地导出,还是远程导出。expportLocal是本地暴露,

Dubbo源码分析之Exporter---服务暴露(本地和远程)

      这里主要本地导出流程,首先通过proxyFactory的getInvoker方法,转换成Invoker,这里proxyFactory对象实际的扩展对象是javassistProxyFactory,

  Dubbo源码分析之Exporter---服务暴露(本地和远程)

     这里可以看到getInvoker方法,返回的其实IAbstractProxyInvoker,  然后由protocol调用export方法到处得到Exproter, 这里的protocol的实际对象是

  DubboProtocol, 调用export方法。

  Dubbo源码分析之Exporter---服务暴露(本地和远程)

          然后调用openServer方法,开启服务。

Dubbo源码分析之Exporter---服务暴露(本地和远程)

          如果没有服务,则创建服务,接着createServer的方法。

Dubbo源码分析之Exporter---服务暴露(本地和远程)

    这里是Exchanges.bind来绑定的URL和requestHandler 返回,ExchangeServer主要是管理通信的,而真实通信的是I由Transptorter完成,dubbo目前

扩展有netty和mina以及grizzly等通信框架。

         requestHandler主要处理的数据的解码和反射调用方法,并返回数据等操作。下面的截图可以出来。详细的在下一篇介绍。

  Dubbo源码分析之Exporter---服务暴露(本地和远程)

          这个整个过程,dubbo完成的是服务提供者的服务导出。这时候还不能提供消费者使用,主要的是注册中心还没有介绍,接下来在分析。

总结:

        今天,主要分析服务的本地导出为Exporter的过程。