所以我看到在Java 9中删除了通过RMI的HTTP隧道。
我们销售在Tomcat中运行的商业Java软件。我们的客户在Mac,Windows和Linux服务器上安装它。然后,公众使用Java Swing客户端界面访问该软件。它使用RMI与服务器软件进行通信。
我们的大多数客户都有防火墙阻止在80/443以外的任何端口上访问服务器。这对于Java 8及更早版本来说不是问题,它可以在动态端口上使用RMI,或在防火墙阻止访问时切换到HTTP。
但是,删除Java 9中的HTTP代理功能意味着我们的大多数客户将无法再像目前的架构那样使用我们的软件。对于我们的客户来说,为公共SSH访问配置防火墙和服务器是不切实际和不安全的,特别是对于运行Windows服务器的客户。
这是否意味着我们需要重写我们的应用程序架构以使用除RMI之外的某些网络协议?或者有没有办法将RMI保留在Java 9中?完全抛弃RMI需要完全重写面向用户的应用程序代码,并且不是一种具有成本效益的选择。
答案 0 :(得分:6)
似乎JDK-8023862已经弃用了来自RMI的HTTP代理,如Java8的release notes中所述。
正如#JDK8180642中所建议的,它还询问了从RMI中删除HTTP代理实现的替代方法。其中一个替代方案可能是 use ssh to tunnel through the proxy 。
使用ssh建立通过代理隧道传输的本地端口 到远程机器。 该连接将比HTTP代理实现更具功能性。
在链接链接中,您可以在 how can one make outgoing Java RMI calls through a local firewall? 上找到一篇文章,其中还提供了其他实现,例如SOCKS和套接字工厂。
答案 1 :(得分:5)
所以我看到在Java 9中删除了通过RMI的HTTP隧道。
不足为奇。这是一个糟糕的解决方案,单向,性能损失10倍。
这是否意味着RMI死了?
没有。它是1.1版本的Java的一部分,从那时起,二十年前的Java历史是向后兼容性的一个非凡记录。 ABI兼容性的最后一次破坏是他们将AWT事件模型更改为1.0和1.1之间。如果从Java中删除RMI,那将是惊人的,并且删除RMI / HTTP隧道没有任何理由让你能够得出这个结论。
我们目前广泛使用RMI来构建客户端 - 服务器用户界面。我们的客户通常使防火墙阻止动态端口,所以我们恢复到HTTP隧道。
您肯定需要另一种隧道解决方案。想到了SSH。
我们应该如何在Java 9中处理这个问题?
见上文。
完全抛弃RMI需要完全重写面向用户的应用程序代码。
没有任何迹象表明这种必要性。
关于RMI端口使用情况:
super(port,...)
,则可以通过UnicastRemoteObject
指定;如果您不延长,则可以指定UnicastRemoteObject.exportObject(object, port, ...)
。因此,例如,如果您从同一个JVM导出一个注册表然后导出更多远程对象,它们将默认共享端口1099,或者您可以明确强制它。
如果您使用RMIServerSocketFactory
,则需要为其提供适当的equals()
方法以保留这些语义。