日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半

發(fā)布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Dubbo 中的 URL

大家都知道,在互聯(lián)網(wǎng)領(lǐng)域,每個信息資源都有統(tǒng)一的且在網(wǎng)上唯一的地址,該地址就叫 URL(Uniform Resource Locator,統(tǒng)一資源定位符),它是互聯(lián)網(wǎng)的統(tǒng)一資源定位標(biāo)志,也就是指網(wǎng)絡(luò)地址。

Dubbo 中任意的一個實(shí)現(xiàn)都可以抽象為一個 URL,Dubbo 使用 URL 來統(tǒng)一描述了所有對象和配置信息,并貫穿在整個 Dubbo 框架之中。

dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=32508&release=&side=provider&timestamp=1593253404714dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=32508&release=&side=provider&timestamp=1593253404714

這個 Demo Provider 注冊到 ZooKeeper 上的 URL 信息,簡單解析一下這個 URL 的各個部分:

  • protocol:dubbo 協(xié)議
  • username/password:沒有用戶名和密碼
  • host/port:172.17.32.91:20880
  • path:org.apache.dubbo.demo.DemoService
  • parameters:參數(shù)鍵值對,這里是問號后面的參數(shù)

下面是 URL 的構(gòu)造方法:

public URL(String protocol, String username, String password, String host, int port, String path, Map<String, String> parameters, Map<String, Map<String, String>> methodParameters) { if (StringUtils.isEmpty(username) && StringUtils.isNotEmpty(password)) { throw new IllegalArgumentException("Invalid url"); } this.protocol = protocol; this.username = username; this.password = password; this.host = host; this.port = Math.max(port, 0); this.address = getAddress(this.host, this.port); while (path != null && path.startsWith("/")) { path = path.substring(1); } this.path = path; if (parameters == null) { parameters = new HashMap<>(); } else { parameters = new HashMap<>(parameters); } this.parameters = Collections.unmodifiableMap(parameters); this.methodParameters = Collections.unmodifiableMap(methodParameters); }

另外,在 dubbo-common 包中還提供了 URL 的輔助類:

  • URLBuilder, 輔助構(gòu)造 URL
  • URLStrParser, 將字符串解析成 URL 對象

URL 在 Dubbo 中被當(dāng)作是“公共的契約”。一個 URL 可以包含非常多的擴(kuò)展點(diǎn)參數(shù),URL 作為上下文信息貫穿整個擴(kuò)展點(diǎn)設(shè)計體系。

其實(shí)在 Dubbo 中使用 URL 的好處多多:

  • 代碼更加易讀、易懂,不用花大量時間去揣測傳遞數(shù)據(jù)的格式和含義,進(jìn)而形成一個統(tǒng)一的規(guī)范
  • 作為方法的入?yún)?#xff08;相當(dāng)于一個 Key/Value 都是 String 的 Map),含義比單個參數(shù)更豐富,當(dāng)代碼需要擴(kuò)展的時候,可以將新的參數(shù)以 Key/Value 的形式追加到 URL 之中,而不需要改變?nèi)雲(yún)⒒蚴欠祷刂档慕Y(jié)構(gòu)
  • 可以省去很多溝通成本

URL 在 SPI 中的應(yīng)用

Dubbo SPI 中有一個依賴 URL 的重要場景——適配器方法,是被 @Adaptive 注解標(biāo)注的, URL 一個很重要的作用就是與 @Adaptive 注解一起選擇合適的擴(kuò)展實(shí)現(xiàn)類。

例如,在 dubbo-registry-api 模塊中我們可以看到 RegistryFactory 這個接口,其中的 getRegistry() 方法上有 @Adaptive({"protocol"}) 注解,說明這是一個適配器方法,Dubbo 在運(yùn)行時會為其動態(tài)生成相應(yīng)的 “$Adaptive” 類型,如下所示:

public class RegistryFactory$Adaptive implements RegistryFactory { public Registry getRegistry(org.apache.dubbo.common.URL arg0) { if (arg0 == null) throw new IllegalArgumentException("..."); org.apache.dubbo.common.URL url = arg0; // 嘗試獲取URL的Protocol,如果Protocol為空,則使用默認(rèn)值"dubbo" String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol()); if (extName == null) throw new IllegalStateException("..."); // 根據(jù)擴(kuò)展名選擇相應(yīng)的擴(kuò)展實(shí)現(xiàn),Dubbo SPI的核心原理在下一課時深入分析 RegistryFactory extension = (RegistryFactory) ExtensionLoader .getExtensionLoader(RegistryFactory.class) .getExtension(extName); return extension.getRegistry(arg0); } }

我們會看到,在生成的 RegistryFactory$Adaptive 類中會自動實(shí)現(xiàn) getRegistry() 方法,其中會根據(jù) URL 的 Protocol 確定擴(kuò)展名稱,從而確定使用的具體擴(kuò)展實(shí)現(xiàn)類。

我們可以找到 RegistryProtocol 這個類,并在其 getRegistry() 方法中打一個斷點(diǎn), 得到如下圖所示的內(nèi)容:

這里傳入的 registryUrl 值為:

zookeeper://127.0.0.1:2181/org.apache.dubbo...

那么在 RegistryFactory$Adaptive 中得到的擴(kuò)展名稱為 zookeeper,此次使用的 Registry 擴(kuò)展實(shí)現(xiàn)類就是 ZookeeperRegistryFactory。

URL 在服務(wù)暴露中的應(yīng)用

Provider 在啟動時,會將自身暴露的服務(wù)注冊到 ZooKeeper 上,來看 ZookeeperRegistry.doRegister() 方法,在其中打個斷點(diǎn),然后 Debug 啟動 Provider,會得到下圖:

傳入的 URL 中包含了 Provider 的地址(172.18.112.15:20880)、暴露的接口(org.apache.dubbo.demo.DemoService)等信息, toUrlPath() 方法會根據(jù)傳入的 URL 參數(shù)確定在 ZooKeeper 上創(chuàng)建的節(jié)點(diǎn)路徑,還會通過 URL 中的 dynamic 參數(shù)值確定創(chuàng)建的 ZNode 是臨時節(jié)點(diǎn)還是持久節(jié)點(diǎn)。

URL 在服務(wù)訂閱中的應(yīng)用

Consumer 啟動后會向注冊中心進(jìn)行訂閱操作,并監(jiān)聽自己關(guān)注的 Provider。那 Consumer 是如何告訴注冊中心自己關(guān)注哪些 Provider 呢?

我們來看 ZookeeperRegistry 這個實(shí)現(xiàn)類,它是由上面的 ZookeeperRegistryFactory 工廠類創(chuàng)建的 Registry 接口實(shí)現(xiàn),其中的 doSubscribe() 方法是訂閱操作的核心實(shí)現(xiàn),在第 175 行打一個斷點(diǎn),并 Debug 啟動 Demo 中 Consumer,會得到下圖所示的內(nèi)容:

可以看到傳入的 URL 參數(shù)如下:

consumer://...?application=dubbo-demo-api-consumer&category=providers,configurators,routers&interface=org.apache.dubbo.demo.DemoService...

其中 Protocol 為 consumer ,表示是 Consumer 的訂閱協(xié)議,其中的 category 參數(shù)表示要訂閱的分類,這里要訂閱 providers、configurators 以及 routers 三個分類;interface 參數(shù)表示訂閱哪個服務(wù)接口,這里要訂閱的是暴露 org.apache.dubbo.demo.DemoService 實(shí)現(xiàn)的 Provider。

通過 URL 中的上述參數(shù),ZookeeperRegistry 會在 toCategoriesPath() 方法中將其整理成一個 ZooKeeper 路徑,然后調(diào)用 zkClient 在其上添加監(jiān)聽。

本文轉(zhuǎn)自公眾號:勾勾的Java宇宙

歡迎大家來留言互動哦!

總結(jié)

以上是生活随笔為你收集整理的dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。