我正在寻找一种非常简单的方法来允许Java和C++应用程序之间的远程过程调用。
我的系统包含几个Java模块和一个C++模块。我没有太多不同的过程可供调用(每个模块大约2-3个),它们也不会有太多变化(除了一些小的适应,比如添加一个新的过程或改变一个人的原型)。我正在编写所有的模块,所以我可以使用我想要的任何东西。此外,除了一个模块之外,所有模块都将在同一台计算机上执行,但可以在另一台计算机上执行其中一些模块,而不会有太多麻烦(基本上,只需更改配置文件)。
这个应用程序使用的所有模块、机器和网络都是可信的,但我不希望RPC协议有任何安全缺陷,我想要最小的性能开销,所以RPC协议越简单越好。而且,每个被调用的方法只有一个原型。
目前,我正尝试通过TCP套接字使用RPC,因为我不想使用RMI或Unix原语( Java上没有标准实现,也没有网络功能)。我已经编写了一个非常简单的RPC协议:通过TCP帧给出被调用方法的序列化名称,后跟参数的序列化列表。在服务器端,它监听一个对象并使用反射来执行给定的方法。如果出现错误,则返回的对象是封装错误的DistantRPCError。
代码非常简单(大约只有100loc),可以在很多情况下使用(我使用的是流,所以我甚至不依赖Sockets)。我面临的问题是,我不能静态地测试我的代码(本地测试的简单初始化比被测试的代码要长),并且我不能真正看出在C++中实现它有多难(我想是使用JNI进行序列化)。
所以我的问题是:您是否知道在Java和C++中进行RPC调用的另一种方法,它非常简单(所以没有RMI)并且可以被信任(我不是在寻找一种闪亮的技术,我想要的是标准的和行业认可的)。此外,我在性能上也有一些限制(这台机器是一台低成本的计算机,我有很多密码学要在本地进行)。正如我所说的,大多数模块(除了一两个模块)都是在本地执行的,所以我对IPC机制也很感兴趣(即使我的所有模块都只有一个RPC机制就好了)。
如果你愿意,我可以给你我的实际RPC代码,但正如我所说的,它甚至没有经过测试,所以我根本不确定它是否有效。
编辑:我可能会使用SOAP,因为我看不出有多少兴趣使用ORB来解决我的特定问题。谢谢你的点子!
发布于 2011-03-14 18:17:17
我不知道其中任何一个是否能满足您的简单性标准,但我想说您最好的两个选择是旧的CORBA和新的web服务。
CORBA之所以出现,是因为用不同语言编写的分布式组件的互操作是其灵感的一部分,但它并不简单。市场也投票反对CORBA。我想说的是,它在90年代初到中期达到了顶峰,此后一直在下降。我不太了解CORBA,因为它是有价值的。
Web服务,尤其是当您避免使用SOAP而使用REST时,工作在HTTP上,并且相对简单。我看不出开发和维护自己的有线协议有什么好处。我会使用HTTP,并坚持使用REST。
发布于 2011-03-24 18:24:18
就像你知道的那样,我最终选择了在我所有的RPC上使用MessagePack,重点是:它使用起来非常简单,开源(只有一个很小的代码库),而且它工作得很好。
缺点是: java lib完全没有注释,但正如我所说的,它是开源的,具有很小的代码库和简单的体系结构,因此理解它的工作原理是没有问题的。
还有很多不同的java库的开发版本(这可能意味着API不稳定,但是一旦系统完成我就不会更新库,所以这不是问题),我不能在windows上编译C++库(这对我来说不是问题,因为我在Linux上使用它)。
https://stackoverflow.com/questions/5297185
复制相似问题