我正在开发一个
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.