Dubbo-URL、數據包結構


 

 
一、Dubbo中的URL
一個標准的 URL 格式至多可以包含如下的幾個部分
protocol://username:password@host:port/path?key=value&key=value 
 
在 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 協議的服務
dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000
 
描述一個 zookeeper 注冊中心
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
 
描述一個消費者
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
 
URL的生命周期
  • 解析服務
  • 暴露服務
  • 引用服務
 
(1)解析服務
基於 dubbo.jar 內的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名稱空間時,會回調 DubboNamespaceHandler。
所有 dubbo 的標簽,都統一用 DubboBeanDefinitionParser 進行解析,基於一對一屬性映射,將 XML 標簽解析為 Bean 對象。
在 ServiceConfig.export() 或 ReferenceConfig.get() 初始化時,將 Bean 對象轉換 URL 格式,所有 Bean 屬性轉成 URL 的參數。
然后將 URL 傳給協議擴展點,基於擴展點自適應機制,根據 URL 的協議頭,進行不同協議的服務暴露或引用。
 
(2)暴露服務
1. 只暴露服務端口:
在沒有注冊中心,直接暴露提供者的情況下,ServiceConfig 解析出的 URL 的格式為:dubbo://service-host/com.foo.FooService?version=1.0.0。
基於擴展點自適應機制,通過 URL 的 dubbo:// 協議頭識別,直接調用 DubboProtocol的 export() 方法,打開服務端口。
 
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:// 協議頭識別,就會調用 RegistryProtocol 的 export() 方法,將 export 參數中的提供者 URL,先注冊到注冊中心。
再重新傳給 Protocol 擴展點進行暴露: dubbo://service-host/com.foo.FooService?version=1.0.0,然后基於擴展點自適應機制,通過提供者 URL 的 dubbo:// 協議頭識別,就會調用 DubboProtocol 的 export() 方法,打開服務端口。
 
(3)引用服務
1. 直連引用服務:
在沒有注冊中心,直連提供者的情況下,ReferenceConfig 解析出的 URL 的格式為:dubbo://service-host/com.foo.FooService?version=1.0.0。
基於擴展點自適應機制,通過 URL 的 dubbo:// 協議頭識別,直接調用 DubboProtocol 的 refer() 方法,返回提供者引用。
 
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:// 協議頭識別,就會調用 RegistryProtocol 的 refer() 方法,基於 refer 參數中的條件,查詢提供者 URL,如: dubbo://service-host/com.foo.FooService?version=1.0.0。
基於擴展點自適應機制,通過提供者 URL 的 dubbo:// 協議頭識別,就會調用 DubboProtocol 的 refer() 方法,得到提供者引用。
然后 RegistryProtocol 將多個提供者引用,通過 Cluster 擴展點,偽裝成單個提供者引用返回。
 
 
 
URL 統一模型的意義
對於 dubbo 中的 URL,有人理解為配置總線,有人理解為統一配置模型,說法雖然不同,但都是在表達一個意思,這樣的 URL 在 dubbo 中被當做是公共契約,所有擴展點參數都包含 URL 參數,URL 作為上下文信息貫穿整個擴展點設計體系。
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM