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 不會依賴此套件。請檢查您的應用程式是否使用了它。
  • **存在反序列化安全風險。** 請檢查應用程式:請將 commons-collections3 升級到 3.2.2;請將 commons-collections4 升級到 4.1。新版本的 commons-collections 已解決此問題。

上次修改日期:2023 年 2 月 22 日:合併重構網站 (#2293) (4517e8c1c9c)