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

(exporter, originInvoker, overrideSubscribeUrl, registedProviderUrl);

在之前的文章中分析了 dubbo 通過 netty 暴露服務,然後獲取到 zookeeper 註冊中心 --- ZookeeperRegistry。下面就是把 Provider (服務提供者)的信息註冊到註冊中心上。這樣 Consumer (服務消費者)就可以通過 Registry (註冊中心)獲取到 Provider 的信息。這樣就解耦了 Provider 與 Consumer,並且可以通過 Registry 來修改路由規則、權重等控制。這樣就達到的服務的治理。下面我們就來講解一下,服務的註冊與訂閱。

2、ZookeeperRegistry#register

這個就是把服務信息註冊到 Zookeeper 上面去。

1、AbstractRegistry#register添加註冊Set registered(已註冊的URL),用於失敗重試。 2、ZookeeperRegistry#doRegister通過上篇 blog 講解的獲取到的 ZookeeperClient 把服務信息註冊到 Zookeeper 上。此時的 URL 為:

dubbo://192.168.75.1:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=2076&side=provider&timestamp=1522237459900

dubbo 會基於這個 URL 生成一個新的URL,生成規則為:

"/dubbo/" + url裡面的interface的值 + "/providers/" + URL.encode(url)

生成後的值 :

/dubbo/com.alibaba.dubbo.demo.DemoService/providers/dubbo%3A%2F%2F192.168.75.1%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.0.0%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26methods%3DsayHello%26pid%3D2076%26side%3Dprovider%26timestamp%3D1522237459900

然後在 Zookeeper 上面把 /dubbo/com.alibaba.dubbo.demo.DemoService/providers/ 創建成持久化節點,而後面部分的 URL 就會創建成臨時節點。

把服務提供者信息創建成臨時節點的好處就是如果當前服務掛掉,這個節點就會自動刪除。這樣失效服務就可以自動剔除。

>Zookeeper 持久化節點 和臨時節點有什麼區別? >持久化節點:一旦被創建,觸發主動刪除掉,否則就一直存儲在ZK裡面。 >臨時節點:與客戶端會話綁定,一旦客戶端會話失效,這個客戶端端所創建的所有臨時節點都會被刪除。

3、ZookeeperRegistry#subscribe

通過訂閱 Zookeeper 上面的的節點信息變更, 可以通過 dubbo-admin來修改服務路由規則、權重等。

1、創建一個 NotifyListener 實例 OverrideListener, 當收到服務變更通知時觸發。 2、在 Zookeeper 註冊中心創建持久化節點/dubbo/com.alibaba.dubbo.demo.DemoService/configurators,用於接收 dubbo-admin這個客戶端上對於集群的服務治理。

ZookeeperRegistry#doSubscribe { zkClient.create(path, false)}

3、啟動加入訂閱/dubbo/com.alibaba.dubbo.demo.DemoService/configurators,如果該節點信息發生改變,就會交給FailbackRegistry.notify處理。

ZookeeperRegistry#doSubscribe { zkClient.addChildListener(path, zkListener)}

4、FailbackRegistry#notify

1、把服務端的註冊 url 信息更新到本地緩存(AbstractRegistry#saveProperties),以Window為例:

C:\Users\Carl\.dubbo\dubbo-registry-10.65.209.12.cache 

2、調用傳入的OverrideListener#notify,如果修改了 URL 信息,調用RegistryProtocol.this.doChangeLocalExport(originInvoker, newUrl)重新暴露當前服務。

前面二篇加上這一篇就是 dubbo 遠程服務暴露的整個過程。下面這張圖片就是 dubbo 進行服務暴露、服務遠程調用添加 dubbo monitor 後 Zookeeper 上面 dubbo 節點的結構圖。

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

dubbo源碼分析 之 服務遠程暴露(中)未能發表出來,有興趣瞭解一下的可以直接

看鏈接http://bbs.dongnaoedu.com/?thread-65.htm

另外分享給大家一個zookeeper分佈式鎖的視頻詳解

鏈接: https://pan.baidu.com/s/1X3q25cqF1_BtNe1TazHpxw 密碼: pndp

分享不易,來波關注吧~


分享到:


相關文章: