dubbo源碼分析7(服務暴露之遠程暴露)

  根據上一篇說的,本地暴露服務就是把服務A暴露到當前jvm中,使得當前的jvm中B服務要使用A服務時,就不用去註冊中心獲取走網絡請求的方式,直接從jvm中獲取性能會更高;

  那麼本篇就說一下服務是怎麼暴露到遠程的,引用我上一篇寫的東西,下圖所示,上一篇我們是分析到了步驟2,接下來我們會走完步驟2到步驟6,準備好,開始發車

 

  注意,本篇會有很多的代碼截圖,不會看的很細的,我們首先把流程看完,建議自己也調試一下源碼

 

1. 起點

  我們還是從夢開始的地方,打開類org.apache.dubbo.config.ServiceConfig的doExportUrlsFor1Protocol()方法,下圖所示

  從這裏我們知道,一個服務默認會本地暴露一次,同時還遠程暴露一次;  

  而且根據下圖中444行,可以知道dubbo暴露服務是可以支持多個協議的,也就是每一種協議都會暴露一份(我們配置文件只配置了dubbo協議)

 

2. 遠程暴露

  從上圖中國protocal.export()方法進入,下面這個類在上一篇博客已經說了,需要我們自己手動創建的

 

 

 

  接下來就是關鍵的了,下圖可以說是包含了整個遠程暴露服務的所有核心邏輯了!!!

 

3.開啓netty服務

  從上圖中的步驟1進入

 

 

  爲了篇幅的簡潔,省略了中間一些沒啥用的截圖,反正一步一步的就到了下面這裏

 

  下面的createServer(url)方法就是創建netty服務端了,dubbo中默認netty監聽端口是20880,所以平常我們如果本地20880端口占用了,那麼啓動dubbo服務就會失敗的!

 

  進入到creatServer()方法

 

  可以看到是通過獲取exchange之後,去綁定啓動netty監聽服務

 

 

 

  省略中間一點沒啥用的步驟,反正就是獲取NettyTransporter,調用bind方法,然後就是創建nerrtServer實例,NettyServer的繼承類圖如下所示

 

  我們在實例化NettyServer實例的時候,肯定會優先調用父類的構造方法的,在父類AbstractServer構造方法中調用doOpen()方法,這個doOpen()方法是在NettyServer中實現的,最後就是netty框架的使用了

 

 

 

   

  只要是稍微使用過netty的小夥伴,看到下圖應該就不陌生了吧!!!(-_-メ)

 

 

4.連接註冊中心zookeeper

  就這一行代碼開始去連接註冊中心,我們從這裏出發

  

  下面這個類也是需要自己從控制檯複製,然後去手動創建

 

 

  到了下圖這裏,就是封裝了zookeeper註冊中心的對象了,我們到這裏就不繼續往裏看了;

 

 

5.創建zookeeper節點

  既然上面已經連接連接好了註冊中心,現在就開始根據我們的服務信息去zookeeper中創建節點了

 

 

 

 

  下面就是真正的使用工具類api創建zookeeper節點了,詳細的過程如下:

 

 

 

  

  然後我們就可以到zookeeper中可以看到provider節點了(注意,這裏使用的操作zookeeper的工具是curator,有興趣的可以花一分鐘看看zkClient和curator的區別)

 

 

6.監聽zookeeper節點

  最後就是dubbo訂閱zookeeper節點的信息,當服務有數據變化的時候,就會調用回調函數;

  不知道大家有注意看到上圖的zookeeper中有個節點是configurators,這個節點就是用於監聽的(服務消費者和服務提供者都會去監聽這個節點的哦!)

 

 

 

  其實到這裏,整個遠程服務暴露的邏輯已經過了一遍了

  順便一提: 注意上圖中最後一行的notify方法,這裏面會做一些特殊的事情,就是會將dubbo中服務提供者信息給保存成文件,本地磁盤保存一份,這樣的話,即使註冊中心掛了,但是服務也是可以正常使用的

 

 

 

 

 

7.總結

  本篇博客沒有太多的東西,基本上都是截圖,我們走通了整個遠程服務暴露的邏輯了,我們現在看看下圖,我們終於是走完了步驟0和步驟1的邏輯,服務提供者大概就是這樣的;

  dubbo服務提供者會使用一個容器(就是spring的ioc容器)去啓動,啓動了之後就去將配置文件中的服務信息解析出來,封裝成一個個的invoker對象,然後使用protocol將invoker轉換爲exporter

  在轉成exporter的過程中,會首先去啓動netty服務端默認監聽20880端口,然後去連接zookeeper註冊中心,然後就是使用curator操作zookeeper,根據服務信息創建節點provider,寫入服務相關信息,並且創建和監聽configurators節點,將其中的數據保存一份到本地磁盤

  到此爲止,就走完了服務的暴露邏輯

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章