Dubbo中的統一契約是如何實現的?
阿新 • • 發佈:2021-01-22
## 寫在前面
之前,很多小夥伴私信我:如何才能快速的掌握Dubbo的核心原理和原始碼。所以,我寫了一篇《[我是如何在短期內快速掌握Dubbo的原理和原始碼的(純乾貨)?](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490192&idx=1&sn=afedf86349f76c864f42b2b48a245c62&chksm=cf55ad91f8222487088c333cb7160dd63496f9754c5533dbc868d9ac875101cc67dc1483c0da&token=1511921100&lang=zh_CN#rd)》。對於Dubbo的原始碼解析系列文章,我也在思考如何讓原始碼解析的文章變得更加簡單易懂,所以,我調整了寫Dubbo原始碼解析文章的策略,力求讓小夥伴們能夠以更簡單、易懂的方式徹底掌握Dubbo原始碼。今天,我們先說說Dubbo中的統一契約是如何實現的。
文章已收錄到:
[https://github.com/sunshinelyz/technology-binghe](https://github.com/sunshinelyz/technology-binghe)
[https://gitee.com/binghe001/technology-binghe](https://gitee.com/binghe001/technology-binghe)
## 不得不說的URL
URL全稱為統一資源定位符,它能夠在網際網路中定位到唯一的一個網路地址。URL的格式如下所示。
```bash
protocol://username:password@host:port/path?key=value&key=value
```
其中,各個部分的簡要說明如下所示。
* protocol:URL的協議。最常見的協議就是HTTP和HTTPS,其他的還有FTP、WS、FILE、SMTP等。
* username:使用者名稱。
* password:密碼。
* host:主機,通常是域名或者IP地址。
* port:主機的埠號。
* path:請求的目標檔案的路徑。
* parameters:請求的具體引數資訊,這裡為key=value&key=value。
這就是我們網際網路中的URL的簡單說明。
那麼,在Dubbo內部,大量的方法接收的引數都是以URL進行封裝的,那麼,URL在Dubbo內部到底起到了什麼作用呢?我們繼續往下看。
## Dubbo中的URL
**總的來說,在Dubbo內部,服務提供者Provider會將自身的相關資訊封裝成URL註冊到Zookeeper或其他註冊中心中,從而對外暴露自己提供的服務。而服務消費者Consumer也會通過URL的形式向Zookeeper或其他註冊中心訂閱自己想要呼叫的服務。而在Dubbo的SPI實現中,URL又會參與擴充套件實現的邏輯處理。所以說,URL在Dubbo的實現中是非常重要的。也可以這麼說,Dubbo中的URL就是Dubbo的統一契約。**
我們先來看一下Dubbo中的URL具體長什麼樣吧,通過除錯Dubbo自帶Provider的示例原始碼,我們可以看到在Dubbo中的URL如下所示。
```bash
dubbo://192.168.175.1:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-annotation-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=15012&release=&side=provider×tamp=1610857629484
```
這也是Provider註冊到Zookeeper或者其他註冊中心的資訊。各個部分的說明如下所示。
* dubbo:使用的是dubbo協議。
* host:主機的IP地址為192.168.175.1。
* port:埠號為20880。
* path:這裡的請求路徑為:org.apache.dubbo.demo.DemoService
* parameters:請求的引數資訊,這裡為:anyhost=true&application=dubbo-demo-annotation-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=15012&release=&side=provider×tamp=1610857629484。
既然Dubbo是向Zookeeper或其他註冊中心註冊這些資訊的,那Dubbo內部是如何對URL進行封裝的呢。
在dubbo-common模組中,有一個URL類專門用於封裝URL,如下所示。
![](https://img-blog.csdnimg.cn/20210117200650477.png)
在URL類中,我們來看一個核心建構函式,如下所示。
```java
public URL(String protocol,
String username,
String password,
String host,
int port,
String path,
Map