Dubbo是阿里巴巴開源的一個分佈式服務框架,在阿里內部和其他公司都有廣泛的應用,是目前比較成熟的一個服務框架。筆者將從源碼層面對Dubbo進行分析,學習其中優秀的設計。
經過數年的沉澱,Dubbo整體的設計和抽象已非常完善,這裏介紹的Provider啓動就涉及到了多個抽象模型。本文使用的版本爲2.5.3。
首先,當發佈一個服務的Server時,我們需要編寫一個Spring配置文件。
其中關鍵的一行爲<dubbo:service …>,這裏使用了擴展的Spring Schema,相關定義在Dubbo jar包META-INF目錄下的spring.handlers、spring.schemas、dubbo.xsd中。指定的配置解析器爲com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,所以它也就成了啓動provider的“應用程序入口”
DubboNamespaceHandler的邏輯很簡單,就是將xml文件中的配置信息轉換成對應的bean,繼續看關鍵的com.alibaba.dubbo.config.spring.ServiceBean
經過大段配置代碼後來到父類ServiceConfig的export()方法,它將啓動負責provider網絡通信的Server並將服務地址發佈出去。最終調用到doExportUrlsFor1Protocol()
- Invoker – 執行具體的遠程調用
- Protocol – 服務地址的發佈和訂閱
- Exporter – 暴露服務的引用,或取消暴露
Protocol的具體實現類由配置指定,默認創建一個DubboProtocol,其export()方法轉到openServer()與createServer()
requestHandler包含通信協議的主要處理邏輯,而server的創建來自Exchangers
getExchanger()獲取的實例也來源於配置,默認返回HeaderExchanger
可以看到Server與Client實例均是在這裏創建的,HeaderExchangeServer需要一個Server類型的參數,來自Transporters.bind()
getTransporter()獲取的實例來源於配置,默認返回一個NettyTransporter
最終來到了NettyServer,在它的doOpen()方法中看到了我們熟悉的Netty Bootstrap
文中提到的核心類包括
- DubboNamespaceHandler
- ServiceBean
- ServiceConfig
- DubboProtocol
- Exchangers
- HeaderExchanger
- HeaderExchangeServer
- NettyTransporter
- NettyServer
至此,所有Provider啓動的工作結束了,接下來就是接收請求並交給handler處理的過程,這些將在後面的文章予以介紹。