我正在开发一个Java应用程序,它包含一个服务器和一个客户端(将来可能有多个客户端),可以在不同的主机上运行。
对于这两者之间的通信,我目前使用自定义协议,该协议由通过网络套接字发送的JSON消息组成,并且两端都转换回Java Bean对象。然而,应用程序越复杂,我注意到这种方法不符合我的标准并且过于复杂。
我正在寻找一个完善的,可能是标准化的替代方案。
我已经看过远程方法调用(RMI),但是读到协议很慢(网络开销很大)。
我正在寻找的技术应该是轻量级的(协议和库明智的),健壮的,可能支持压缩(如果确实有大的优势!),可能支持加密,良好的文档和良好的建立(例如Apache项目)。它应该像使用RMI调用远程对象上的方法一样简单但没有缺点。
你能推荐什么?
答案 0 :(得分:5)
Avro是一个专为跨语言RPC而设计的Apache项目(请参阅Thrift的精神前身)。它是相当新的(不到两年),因此它没有像RMI那样完善。不过,你应该给它一个机会;像卡桑德拉这样的大型项目正在转向Avro。 Avro也是Hadoop下的一个子项目,并且一直得到该社区的健康支持。
它旨在快速并支持多种语言,因此您可能需要在编译期间引入另一个步骤,将Avro IDL文件转换为Java,尽管并非绝对必要。其余的是典型的RPC。
Avro的一个好处是它的传输层与数据的表示方式无关。例如,它为原始套接字,HTTP甚至本地进程内调用提供了各种“收发器”(它们的基本通信类)。 HTTPS和SASL收发器可以提供安全性。
为了表示数据,有各种类型的编码器和解码器,虽然默认BinaryEncoder通常就足够了,因为Hadoop,Cassandra等......专注于效率。如果您发现有用,还有一个JsonEncoder。
答案 1 :(得分:2)
这完全取决于客户端和服务器之间需要什么样的兼容性。 CORBA是一种完善且标准化的不同语言之间的通信方式,但它需要比Java RMI更多的工作量。如果客户端从某个外部的不受信任的源运行,则基于HTTP的协议更有意义。如果您遵循REST方法,则随后需要添加更多服务器时,可以更轻松地扩展。
如果客户端和服务器都是Java,并且它们在受信任的网络中运行,则RMI满足您“完善”的要求。 RMI的性能开销被夸大了,但很早期的版本没有池连接。
如果您愿意抛弃“完善”和“标准化”,您可以使用Dirmi替代RMI。它更快,更容易,具有更多功能,并且没有RMI所具有的防火墙问题。与RMI一样,它支持TLS(加密),但都不支持内置压缩。
无论你选择什么,都要小心锁定。尝试设计服务器,使远程访问层是核心代码上的薄层。这使您可以轻松地同时支持多种协议。
答案 2 :(得分:1)
Mybe CORBA?
答案 3 :(得分:1)
您会考虑HTTP / REST吗?
如果是这样,你可以利用像Tomcat / Spring这样的东西,并且仍然支持你列出的所有要求(健壮,轻量级,文档齐全,成熟)
基于RPC的协议简直过时了。
答案 4 :(得分:1)
说真的,除非你正在做一个已经需要网络行李的网络应用程序,否则你确实需要RMI,或者更好的是CORBA。我推荐JacORB(www.jacorb.org)。
忽略慢速/快速的一般声明并执行您自己的性能测试。
请记住,软件项目是成功的,因为它执行了它的设计和预期的有用功能,而不是因为它使用了最新酷炫的流行语技术。
祝你好运。答案 5 :(得分:0)
用于客户端 - 服务器通信的Apache MINA库和EJB3将最适合