我正在寻找一种在Java和C ++应用程序之间允许RPC的非常简单的方法。
我的系统包含几个Java模块和一个C ++模块。 我没有太多不同的程序来调用(每个模块大约2-3个),并且它们不会有太大变化(除了一些小的改编,例如添加新程序或更改一个原型)。我正在编写所有模块,所以我可以使用我想要的任何东西。此外,模块将在同一台机器上执行,除了一个,但是在另一台机器上执行其中一些模块的可能性没有太大的骚扰(基本上只是更改配置文件)将是一个加号。
此应用程序使用的所有模块,计算机和网络都是可信的,但我不希望RPC协议存在任何安全漏洞,我希望最小的性能开销,因此RPC协议越简单越好。此外,每个被调用的方法只有一个原型。
目前我正在尝试使用RPC通过TCP套接字,因为我不想使用RMI或Unix原语(没有Java上的标准实现,也没有网络功能)。我编写了一个非常简单的RPC协议:通过TCP框架,您可以给出所调用方法的序列化名称,然后是序列化的参数列表。在服务器端,它侦听对象并使用反射来执行给定的方法。如果出现错误,返回的对象是封装错误的DistantRPCError。
代码非常简单(只有大约100个loc),并且可以在各种情况下使用(我使用Streams,所以我甚至不依赖于套接字)。 我面临的问题是我无法静态测试我的代码(本地测试的简单初始化比测试代码长)我真的不知道在C ++中实现它有多难(使用JNI进行序列化) ,我想)。
所以我的问题是:你是否知道在Java和C ++中进行RPC调用的另一种方式非常简单(因此没有RMI)并且可以信任(我不是在寻找一种闪亮的技术,我想要标准和行业标准的东西)。另外,我对性能有一些限制(机器是低成本的计算机,我在本地有很多密码学)。正如我所说,大多数模块(一个或两个除外)都是在本地执行的,所以我也对IPC机制感兴趣(即使我的所有模块只有一个RPC机制会很好)。 / p>
如果你愿意,我可以给你我真正的RPC代码,但正如我所说,它甚至没有经过测试,所以我不确定它是否有效。
编辑:我可能会使用SOAP,因为我没有看到对我的特定问题使用ORB感兴趣。谢谢你的想法!
答案 0 :(得分:4)
我不知道其中任何一个是否符合您的简单标准,但我会说您的两个最好的赌注是旧的 - CORBA - 以及新的东西 - 网络服务。
CORBA浮现在脑海中,因为用不同语言编写的分布式组件的互操作是其灵感的一部分,但并不简单。市场也投票反对CORBA。我会说它在90年代早期到中期达到顶峰,并且自那以后一直在下降。我不太了解CORBA,因为它值得。
Web服务,特别是如果您避开SOAP并使用REST,通过HTTP工作并且相对简单。我认为开发和维护自己的线路协议没有任何优势。我使用HTTP并坚持使用REST。
答案 1 :(得分:2)
您知道,我最终选择对我的所有RPC使用MessagePack,重点是:它使用起来非常简单,开源(代码库很小)并且工作得非常好。< / p>
缺点是:对于java lib,没有任何评论 ,但正如我所说它是开源的,具有小代码库和简单的架构,因此理解它是如何的的工作原理。
此外,java libs有很多不同的开发版本(这可能意味着一个不稳定的API,但是一旦系统完成就不会更新lib,所以这不是问题)我不能在Windows上编译C ++库(这对我来说不是一个问题,因为我在Linux上使用它。)