我应该使用哪种Java RMI / RPC / IPC技术?

我正在开发一个Java应用程序,它包含一个服务器和一个客户端(将来可能是多个客户端),它可以在不同的主机上运行。

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

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

我已经看过远程方法调用(RMI),但是读到协议很慢(网络开销很大)。

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

你能推荐什么?

Avro是一个专为跨语言RPC而设计的Apache项目(请参阅Thrift的精神前身)。 它是相当新的(不到两年),因此它没有像RMI那样完善。 不过,你应该给它一个机会; 像卡桑德拉这样的大型项目正在转向Avro。 Avro也是Hadoop下的一个子项目,并且一直得到该社区的健康支持。

它旨在快速并支持多种语言,因此您可能需要在编译期间引入另一个步骤,将Avro IDL文件转换为Java,尽管并非绝对必要。 其余的是典型的RPC。

Avro的一个好处是它的传输层与数据的表示方式无关。 例如,它为原始套接字,HTTP甚至本地进程内调用提供了各种“收发器”(它们的基本通信类)。 HTTPS和SASL收发器可以提供安全性。

为了表示数据,有各种类型的编码器和解码器,尽管默认的BinaryEncoder通常就足够了,因为Hadoop,Cassandra等……都注重效率。 如果您发现有用,还有一个JsonEncoder 。

这完全取决于客户端和服务器之间需要什么样的兼容性。 CORBA是一种完善且标准化的不同语言之间的通信方式,但它需要比Java RMI更多的工作量。 如果客户端从某个外部的不受信任的源运行,则基于HTTP的协议更有意义。 如果您遵循REST方法,则随后需要添加更多服务器时,可以更轻松地进行扩展。

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

如果您愿意抛弃“完善”和“标准化”,您可以使用Dirmi替代RMI。 它更快,更容易,具有更多function,并且没有RMI所具有的防火墙问题。 与RMI一样,它支持TLS(加密),但都不支持内置压缩。

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

Mybe CORBA ?

你会考虑HTTP / REST吗?

如果是这样,你可以利用像Tomcat / Spring这样的东西,并且仍然支持你列出的所有要求(健壮,轻量级,文档齐全,成熟)

基于RPC的协议简单过时。

说真的,除非你正在做一个已经需要网络行李的网络应用程序,否则你确实需要RMI,或者更好的是CORBA。 我推荐JacORB(www.jacorb.org)。

忽略慢速/快速的一般声明并执行您自己的性能测试。

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

祝你好运。

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