主機地址自訂公開
自訂 Dubbo 服務公開的主機地址
功能描述
在 Dubbo 中,Provider 在啟動時主要做兩件事
- 一是啟動伺服器
- 二是將服務註冊到註冊中心。啟動伺服器時需要綁定通訊端,將服務註冊到註冊中心時需要發送通訊端的唯一服務地址。
- 在
dubbo
中未設定host
時,預設的host
是什麼? - 如何在
dubbo
中指定服務的host
,可以使用主機名稱或網域名稱代替 IP 地址作為host
嗎? - 使用 docker 時,有時需要設定端口映射。此時啟動伺服器時綁定的通訊端和註冊到註冊中心的通訊端使用的端口號不同,此時如何設定?
使用場景
使用方法
未設定 host 時的預設 host
一般的 dubbo 協定配置如下
...
<dubbo:protocol name="dubbo" port="20890" />
...
可見只配置了端口號,沒有配置 host,此時的 host 是什麼?
查看程式碼發現,在 org.apache.dubbo.config.ServiceConfig#findConfigedHosts()
中,通過 InetAddress.getLocalHost().getHostAddress()
獲取預設 host。其回傳值如下
- 未連接網路時,回傳 127.0.0.1
- 在阿里雲伺服器中,回傳私有地址,例如:172.18.46.234
- 在本地測試時,回傳公網地址,例如:30.5.10.11
指定服務的通訊端
此外,您可以透過 `dubbo.protocol` 或 `dubbo.provider` 的 `host` 屬性來設定 `host`,支援 IP 位址和網域名稱,如下所示:
...
<dubbo:protocol name="dubbo" port="20890" host="www.example.com"/>
...
socket 使用不同的埠號。
某些部署情境需要動態指定服務註冊的地址,例如 Docker 橋接網路模式需要指定註冊主機 IP 才能實現外部網路通訊。Dubbo 在啟動階段提供了兩對系統屬性,用於設定對外通訊的 IP 和埠地址。
- DUBBO_IP_TO_REGISTRY:註冊到註冊中心的 IP 位址
- DUBBO_PORT_TO_REGISTRY:註冊到註冊中心的埠號
- DUBBO_IP_TO_BIND:監聽 IP 位址
- DUBBO_PORT_TO_BIND:監聽埠號
以上四個設定項為選填,若不設定,Dubbo 會自動取得 IP 和埠號。請根據具體部署情境彈性選擇配置。Dubbo 支援多種協定,如果一個應用程式同時暴露多個不同協定的服務,且需要分別為每個服務指定 IP 或埠號,請在上述屬性前加上協定前綴。例如:
- HESSIAN_DUBBO_PORT_TO_BIND:Hessian 協定綁定的埠號
- DUBBO_DUBBO_PORT_TO_BIND:Dubbo 協定綁定的埠號
- HESSIAN_DUBBO_IP_TO_REGISTRY:Hessian 協定註冊的 IP 位址
- DUBBO_DUBBO_IP_TO_REGISTRY:Dubbo 協定註冊的 IP 位址
PORT_TO_REGISTRY 或 IP_TO_REGISTRY 不會被用作預設的 PORT_TO_BIND 或 IP_TO_BIND,但反之則成立。例如:
- 設定 `PORT_TO_REGISTRY=20881` 和 `IP_TO_REGISTRY=30.5.97.6`,則 `PORT_TO_BIND` 和 `IP_TO_BIND` 不會受到影響。
- 設定 `PORT_TO_BIND=20881` 和 `IP_TO_BIND=30.5.97.6`,則預設 `PORT_TO_REGISTRY=20881` 和 `IP_TO_REGISTRY=30.5.97.6`。
總結
- 您可以透過 `dubbo.protocol` 或 `dubbo.provider` 的 `host` 屬性設定 `host`,並且支援 IP 位址和網域名稱。但此時註冊到註冊中心的 IP 位址和監聽 IP 位址是相同的值。
- 為了要解決在虛擬環境或區域網路中消費者無法與提供者通訊的問題,您可以透過環境變數分別設定註冊到註冊中心的 IP 位址和監聽 IP 位址,其優先順序高於 `dubbo.protocol` 或 `dubbo.provider` 的 `host` 設定。
參考
最後修改日期:2023 年 1 月 2 日:增強英文文件 (#1798) (95a9f4f6c1c)