根據上一篇說的,本地暴露服務就是把服務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節點,將其中的資料保存一份到本地磁盤
到此為止,就走完了服務的暴露邏輯

--------------以上皆原創,給未來的自己留下一點學習的痕跡!--------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393841.html
標籤:Java
上一篇:SpringBoot檔案分片上傳
