Dubbo3 rmi 協(xié)議

2022-04-24 16:41 更新

rmi:// 協(xié)議參考手冊

RMI 協(xié)議采用 JDK 標準的 java.rmi.* 實現(xiàn),采用阻塞式短連接和 JDK 標準序列化方式。

注意:如果正在使用 RMI 提供服務給外部訪問 1,同時應用里依賴了老的 common-collections 包 2 的情況下,存在反序列化安全風險 3。

特性

  • 連接個數(shù):多連接
  • 連接方式:短連接
  • 傳輸協(xié)議:TCP
  • 傳輸方式:同步傳輸
  • 序列化:Java 標準二進制序列化
  • 適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,消費者與提供者個數(shù)差不多,可傳文件。
  • 適用場景:常規(guī)遠程服務方法調(diào)用,與原生RMI服務互操作

約束

  • 參數(shù)及返回值需實現(xiàn) Serializable 接口
  • dubbo 配置中的超時時間對 RMI 無效,需使用 java 啟動參數(shù)設置:-Dsun.rmi.transport.tcp.responseTimeout=3000,參見下面的 RMI 配置

RMI配置

java -Dsun.rmi.transport.tcp.responseTimeout=3000

更多 RMI 優(yōu)化參數(shù)請查看 JDK 文檔

接口

如果服務接口繼承了 java.rmi.Remote 接口,可以和原生 RMI 互操作,即:

  • 提供者用 Dubbo 的 RMI 協(xié)議暴露服務,消費者直接用標準 RMI 接口調(diào)用,
  • 或者提供方用標準 RMI 暴露服務,消費方用 Dubbo 的 RMI 協(xié)議調(diào)用。

如果服務接口沒有繼承 java.rmi.Remote 接口:

  • 缺省 Dubbo 將自動生成一個 com.xxx.XxxService$Remote 的接口,并繼承 java.rmi.Remote 接口,并以此接口暴露服務,
  • 但如果設置了 <dubbo:protocol name="rmi" codec="spring" />,將不生成 $Remote 接口,而使用 Spring 的 RmiInvocationHandler 接口暴露服務,和 Spring 兼容。

配置

定義 RMI 協(xié)議:

<dubbo:protocol name="rmi" port="1099" />

設置默認協(xié)議:

<dubbo:provider protocol="rmi" />

設置某個服務的協(xié)議:

<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" />

  1. 公司內(nèi)網(wǎng)環(huán)境應該不會有攻擊風險 ??

  2. dubbo 不會依賴這個包,請排查自己的應用有沒有使用 ??

  3. 請檢查應用:將 commons-collections3 請升級到 3.2.2;將 commons-collections4 請升級到 4.1。新版本的 commons-collections 解決了該問題 ??


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號