【问题标题】:Which Java RMI/RPC/IPC technology should I use?我应该使用哪种 Java RMI/RPC/IPC 技术?
【发布时间】:2011-05-27 15:32:12
【问题描述】:

我正在开发一个 Java 应用程序,它由一个服务器和一个客户端(将来可能会有多个客户端)组成,它们可能在不同的主机上运行。

对于这两者之间的通信,我目前使用一个自定义协议,该协议由通过网络套接字发送的 JSON 消息组成,这些消息在双方都转换回 Java Bean 对象。然而,应用程序越复杂,我注意到这种方法不符合我的标准并且过于复杂。

我正在寻找一个完善的、可能标准化的替代方案。

我查看了远程方法调用 (RMI),但读到该协议很慢(网络开销大)。

我正在寻找的技术应该是轻量级的(协议和库方面的)、健壮的、可能支持压缩(如果支持的话,那就太棒了!)、可能支持加密、良好的文档和完善的(例如 Apache 项目)。它应该像使用 RMI 在远程对象上调用方法一样简单,但没有它的缺点。

你有什么推荐的?

【问题讨论】:

  • 灵活性,例如。在我开始调整我的自定义协议以满足所有新要求之前,我宁愿使用开源库。

标签: java ipc rmi rpc


【解决方案1】:

这实际上完全取决于您在客户端和服务器之间需要什么样的兼容性。 CORBA 是一种在不同语言之间进行通信的成熟且标准化的方式,但与 Java RMI 相比,它使用起来需要更多的努力。如果客户端从一些外部的、不受信任的来源运行,那么基于 HTTP 的协议更有意义。如果您遵循 REST 方法,那么以后需要添加更多服务器时横向扩展会变得更容易。

如果客户端和服务器都是 Java,并且它们在受信任的网络中运行,则 RMI 满足您对“完善”的要求。 RMI 的性能开销被夸大了,但很早的版本并没有池连接。

如果您愿意同时抛弃“完善”和“标准化”,您可以使用 Dirmi 作为 RMI 的替代品。它更快、更简单、功能更多,而且没有 RMI 的防火墙问题。与 RMI 一样,它支持 TLS(加密),但都不支持内置压缩。

无论您选择什么,都要小心锁定。尝试设计您的服务器,使远程访问层是核心代码之上的一个薄层。这使您可以轻松地支持多种协议,也许同时支持。

【讨论】:

    【解决方案2】:

    说真的,除非您正在开发一个已经需要网络包袱的网络应用程序,否则您确实需要 RMI,或者甚至更好的是 CORBA。我推荐 JacORB (www.jacorb.org)。

    忽略关于慢/快的一般说法并执行您自己的性能测试。

    请记住,软件项目之所以成功,是因为它执行了设计和预期的有用功能,而不是因为它使用了最新的酷炫技术。

    祝你好运。

    【讨论】:

      【解决方案3】:

      Avro 是一个为跨语言 RPC 设计的 Apache 项目(参见Thrift 了解其精神前身)。它是相当新的(不到两年),所以它不像 RMI 那样成熟,例如。不过,您仍然应该给它一个机会;像 Cassandra 这样的大型项目正在转移到 Avro。 Avro 也是 Hadoop 下的一个子项目,并且一直得到该社区的大力支持。

      它的设计速度很快并支持多种语言,因此您可能需要在编译过程中引入另一个步骤,将Avro IDL 文件翻译成Java,尽管这不是绝对必要的。其余的是典型的 RPC。

      Avro 的一个优点是它的传输层独立于数据的表示方式。例如,它带有用于原始套接字、HTTP 甚至本地进程内调用的各种“收发器”(它们的基本通信类)。 HTTPS 和 SASL 收发器可以提供安全性。

      对于表示数据,有各种类型的编码器和解码器,虽然默认的BinaryEncoder一般就足够了,因为Hadoop、Cassandra等……注重效率。还有一个JsonEncoder,以防您觉得有用。

      【讨论】:

        【解决方案4】:

        用于客户端-服务器通信和 EJB3 的 Apache MINA 库最适合

        【讨论】:

          【解决方案5】:

          您会考虑使用 HTTP/REST 吗?

          如果是这样,您可以利用 Tomcat/Spring 之类的东西,并且仍然支持您列出的所有要求(健壮、轻量、有据可查、完善)

          基于 RPC 的协议已经过时了。

          【讨论】:

            【解决方案6】:

            Mybe CORBA?

            【讨论】:

            • Afaik Java RMI 是或曾经基于 CORBA。所以 CORBA 不是最先进的?
            • @Sven Well 它是1991年发布的,所以它很成熟,被金融行业广泛使用。并且它支持压缩
            • Java RMI 实际上是基于 Modula-3 网络对象的。 CORBA 对其进行了改造。
            猜你喜欢
            • 2011-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-15
            • 1970-01-01
            相关资源
            最近更新 更多