RMI 协议采用 JDK 标准的 java.rmi.*
实现,采用阻塞式短连接和 JDK 标准序列化方式。
注意:如果正在使用 RMI 提供服务给外部访问 1,同时应用里依赖了老的 common-collections 包 2 的情况下,存在反序列化安全风险 3。
Serializable
接口-Dsun.rmi.transport.tcp.responseTimeout=3000
,参见下面的 RMI 配置dubbo.service.protocol=rmi
java -Dsun.rmi.transport.tcp.responseTimeout=3000
更多 RMI 优化参数请查看 JDK 文档
如果服务接口继承了 java.rmi.Remote
接口,可以和原生 RMI 互操作,即:
如果服务接口没有继承 java.rmi.Remote
接口:
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 protocol="rmi" />
多端口:
<dubbo:protocol id="rmi1" name="rmi" port="1099" />
<dubbo:protocol id="rmi2" name="rmi" port="2099" />
<dubbo:service protocol="rmi1" />
Spring 兼容性:
<dubbo:protocol name="rmi" codec="spring" />