RMI 協定
功能說明
RMI 協定使用 JDK 標準的 java.rmi.*
實現,使用阻塞式短連線和 JDK 標準序列化。
- 連線數量:多連線
- 連線方式:短連線
- 傳輸協定:TCP
- 傳輸方式:同步傳輸
- 序列化:Java 標準二進位序列化
- 適用範圍:出入參封包大小混合,消費者與提供者數量接近,可傳輸檔案。
- 適用場景:常規的遠端服務方法呼叫,與原生 RMI 服務互通
限制
- 參數和回傳值需要實現
Serializable
介面 - dubbo 配置中的逾時對 RMI 無效,需要使用 java 啟動參數設定:
-Dsun.rmi.transport.tcp.responseTimeout=3000
,詳見下方 RMI 配置
使用場景
它是一組支援分散式應用程式開發的 Java API,實現了不同作業系統之間程式的函式呼叫。
使用方法
導入依賴
從 Dubbo 3 開始,RMI 協定不再內嵌於 Dubbo 中,需要單獨引入一個獨立的 模組。
<dependency>
<groupId>org.apache.dubbo.extensions</groupId>
<artifactId>dubbo-rpc-rmi</artifactId>
<version>1.0.0</version>
</dependency>
java -Dsun.rmi.transport.tcp.responseTimeout=3000
更多 RMI 優化參數,請參見 JDK 文件
介面說明
如果服務介面繼承了 java.rmi.Remote
介面,則可以與原生 RMI 互通,即
- 提供者使用 Dubbo 的 RMI 協定暴露服務,消費者直接使用標準 RMI 介面呼叫,
- 或者提供者使用標準 RMI 暴露服務,而消費者使用 Dubbo 的 RMI 協議呼叫。
如果服務介面沒有繼承 java.rmi.Remote
介面
- 預設情況下,Dubbo 會自動產生一個
com.xxx.XxxService$Remote
介面,繼承java.rmi.Remote
介面,並透過此介面暴露服務, - 但如果設定了
<dubbo:protocol name="rmi" codec="spring" />
,則不會產生$Remote
介面,服務將使用 Spring 的RmiInvocationHandler
介面暴露,與 Spring 相容。
定義 RMI 協議
<dubbo:protocol name="rmi" port="1099" />
設定預設協議
<dubbo:provider protocol="rmi" />
設定服務的協議
<dubbo:service interface="..." protocol="rmi" />
多個埠
<dubbo:protocol id="rmi1" name="rmi" port="1099" />
<dubbo:protocol id="rmi2" name="rmi" port="2099" />
<dubbo:service interface="..." protocol="rmi1" />
Spring 相容性
<dubbo:protocol name="rmi" codec="spring" />
- 如果您使用 RMI 提供服務供外部存取,在公司內網環境中應該沒有攻擊風險。
- 同時,如果應用程式依賴舊的 common-collections 套件, Dubbo 不會依賴此套件。請檢查您的應用程式是否使用了它。
上次修改日期:2023 年 2 月 22 日:合併重構網站 (#2293) (4517e8c1c9c)