91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dubbo中的URL統一模型怎么實現

發布時間:2022-01-04 16:22:17 來源:億速云 閱讀:144 作者:iii 欄目:開發技術

這篇文章主要介紹“Dubbo中的URL統一模型怎么實現”,在日常操作中,相信很多人在Dubbo中的URL統一模型怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Dubbo中的URL統一模型怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

定義

在不談及 dubbo 時,我們中的大多數人對 URL 這個概念并不會感到陌生。統一資源定位器 (RFC1738――Uniform Resource Locators (URL))應該是最廣為人知的一個 RFC 規范,它的定義也非常簡單

因特網上的可用資源可以用簡單字符串來表示,該文檔就是描述了這種字符串的語法和語 義。而這些字符串則被稱為:“統一資源定位器”(URL)

一個標準的 URL 格式至多可以包含如下的幾個部分

protocol://username:password@host:port/path?key=value&key=value

一些典型 URL

http://www.facebook.com/friends?param1=value1&param2=value2https://username:password@10.20.130.230:8080/list?version=1.0.0ftp://username:password@192.168.1.7:21/1/read.txt

當然,也有一些不太符合常規的 URL,也被歸類到了 URL 之中

  1. 192.168.1.3:20880

  2. url protocol = null, url host = 192.168.1.3, port = 20880, url path = null



  3. file:///home/user1/router.js?type=script

  4. url protocol = file, url host = null, url path = home/user1/router.js



  5. file://home/user1/router.js?type=script<br>

  6. url protocol = file, url host = home, url path = user1/router.js



  7. file:///D:/1/router.js?type=script

  8. url protocol = file, url host = null, url path = D:/1/router.js



  9. file:/D:/1/router.js?type=script

  10. 同上 file:///D:/1/router.js?type=script



  11. /home/user1/router.js?type=script

  12. url protocol = null, url host = null, url path = home/user1/router.js



  13. home/user1/router.js?type=script

  14. url protocol = null, url host = home, url path = user1/router.js

Dubbo 中的 URL

在 dubbo 中,也使用了類似的 URL,主要用于在各個擴展點之間傳遞數據,組成此 URL 對象的具體參數如下:

  • protocol:一般是 dubbo 中的各種協議 如:dubbo thrift http zk

  • username/password:用戶名/密碼

  • host/port:主機/端口

  • path:接口名稱

  • parameters:參數鍵值對

public URL(String protocol, String username, String password, String host, int port, String path, Map<String, String> parameters) {   if ((username == null || username.length() == 0)          && password != null && password.length() > 0) {      throw new IllegalArgumentException("Invalid url, password without username!");   }   this.protocol = protocol;   this.username = username;   this.password = password;   this.host = host;   this.port = (port < 0 ? 0 : port);   this.path = path;   // trim the beginning "/"   while(path != null && path.startsWith("/")) {       path = path.substring(1);   }   if (parameters == null) {       parameters = new HashMap<String, String>();   } else {       parameters = new HashMap<String, String>(parameters);   }   this.parameters = Collections.unmodifiableMap(parameters);}

可以看出,dubbo 認為 protocol,username,passwored,host,port,path 是主要的 URL 參數,其他鍵值對村房子啊 parameters 之中。

一些典型的 Dubbo URL

  1. dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000

  2. 描述一個 dubbo 協議的服務


  3. zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=1214&qos.port=33333&timestamp=1545721981946

  4. 描述一個 zookeeper 注冊中心


  5. consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1209&qos.port=33333&side=consumer&timestamp=1545721827784

  6. 描述一個消費者

可以說,任意的一個領域中的一個實現都可以認為是一類 URL,dubbo 使用 URL 來統一描述了元數據,配置信息,貫穿在整個框架之中。

URL 相關的生命周期

解析服務

基于 dubbo.jar 內的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名稱空間時,會回調 DubboNamespaceHandler

所有 dubbo 的標簽,都統一用 DubboBeanDefinitionParser 進行解析,基于一對一屬性映射,將 XML 標簽解析為 Bean 對象。

ServiceConfig.export()ReferenceConfig.get() 初始化時,將 Bean 對象轉換 URL 格式,所有 Bean 屬性轉成 URL 的參數。

然后將 URL 傳給協議擴展點,基于擴展點自適應機制,根據 URL 的協議頭,進行不同協議的服務暴露或引用。

暴露服務

1. 只暴露服務端口:

在沒有注冊中心,直接暴露提供者的情況下, ServiceConfig 解析出的 URL 的格式為: dubbo://service-host/com.foo.FooService?version=1.0.0

基于擴展點自適應機制,通過 URL 的 dubbo:// 協議頭識別,直接調用 DubboProtocolexport() 方法,打開服務端口。

2. 向注冊中心暴露服務:

在有注冊中心,需要注冊提供者地址的情況下, ServiceConfig 解析出的 URL 的格式為: registry://registry-host/org.apache.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0")

基于擴展點自適應機制,通過 URL 的 registry:// 協議頭識別,就會調用 RegistryProtocolexport() 方法,將 export 參數中的提供者 URL,先注冊到注冊中心。

再重新傳給 Protocol 擴展點進行暴露: dubbo://service-host/com.foo.FooService?version=1.0.0,然后基于擴展點自適應機制,通過提供者 URL 的 dubbo:// 協議頭識別,就會調用 DubboProtocolexport() 方法,打開服務端口。

引用服務

1. 直連引用服務:

在沒有注冊中心,直連提供者的情況下, ReferenceConfig 解析出的 URL 的格式為: dubbo://service-host/com.foo.FooService?version=1.0.0

基于擴展點自適應機制,通過 URL 的 dubbo:// 協議頭識別,直接調用 DubboProtocolrefer() 方法,返回提供者引用。

2. 從注冊中心發現引用服務:

在有注冊中心,通過注冊中心發現提供者地址的情況下, ReferenceConfig 解析出的 URL 的格式為: registry://registry-host/org.apache.dubbo.registry.RegistryService?refer=URL.encode("consumer://consumer-host/com.foo.FooService?version=1.0.0")

基于擴展點自適應機制,通過 URL 的 registry:// 協議頭識別,就會調用 RegistryProtocolrefer() 方法,基于 refer 參數中的條件,查詢提供者 URL,如: dubbo://service-host/com.foo.FooService?version=1.0.0

基于擴展點自適應機制,通過提供者 URL 的 dubbo:// 協議頭識別,就會調用 DubboProtocolrefer() 方法,得到提供者引用。

然后 RegistryProtocol 將多個提供者引用,通過 Cluster 擴展點,偽裝成單個提供者引用返回。

URL 統一模型的意義

對于 dubbo 中的 URL,有人理解為配置總線,有人理解為統一配置模型,說法雖然不同,但都是在表達一個意思,這樣的 URL 在 dubbo 中被當做是公共契約,所有擴展點參數都包含 URL 參數,URL 作為上下文信息貫穿整個擴展點設計體系。

在沒有 URL 之前,只能以字符串傳遞參數,不停的解析和拼裝,導致相同類型的接口,參數時而 Map, 時而 Parameters 類包裝:

export(String url) createExporter(String host, int port, Parameters params)

使用 URL 一致性模型:

export(URL url) createExporter(URL url)

在最新的 dubbo 代碼中,我們可以看到大量使用 URL 來進行上下文之間信息的傳遞,這樣的好處是顯而易見的:

1.   使得代碼編寫者和閱讀者能夠將一系列的參數聯系起來,進而形成規范,使得代碼易寫,易讀。

2.   可擴展性強,URL 相當于參數的集合(相當于一個 Map),他所表達的含義比單個參數更豐富,當我們在擴展代碼時,可以將新的參數追加到 URL 之中,而不需要改變入參,返參的結構。

3.   統一模型,它位于 org.apache.dubbo.common 包中,各個擴展模塊都可以使用它作為參數的表達形式,簡化了概念,降低了代碼的理解成本。

到此,關于“Dubbo中的URL統一模型怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新乡市| 界首市| 得荣县| 贵港市| 松江区| 新津县| 太和县| 绥棱县| 开远市| 尼勒克县| 广丰县| 上林县| 清丰县| 农安县| 高邮市| 北辰区| 崇义县| 长岛县| 鹿泉市| 镇江市| 绵竹市| 秦安县| 怀仁县| 六安市| 胶南市| 郴州市| 彭州市| 新田县| 京山县| 修水县| 韶关市| 海阳市| 松原市| 孝义市| 渑池县| 深泽县| 沙田区| 乡城县| 同江市| 山丹县| 江阴市|