【发布时间】:2011-07-14 21:47:31
【问题描述】:
我正在寻找一种非常简单的方法来允许 Java 和 C++ 应用程序之间的 RPC。
我的系统包含几个 Java 模块和一个 C++ 模块。 我没有太多不同的程序可以调用(每个模块大约 2-3 个),它们不会有太大变化(除了一些小的修改,比如添加新程序或更改原型)。我正在编写所有模块,所以我可以使用我想要的任何东西。此外,这些模块都将在同一台机器上执行,除了一个,但在另一台机器上执行其中一些而不会有太多麻烦(基本上,只需更改配置文件)的可能性将是一个加号。
用于此应用程序的所有模块、机器和网络都是可信的,但我不希望 RPC 协议出现任何安全漏洞,并且我希望将性能开销降至最低,因此 RPC 协议越简单越好。此外,每个调用的方法只有一个原型。
目前我正在尝试通过 TCP 套接字使用 RPC,因为我不想使用 RMI 或 Unix 原语(Java 上没有标准实现,也没有网络功能)。我编写了一个非常简单的 RPC 协议:通过一个 TCP 帧,您给出所调用方法的序列化名称,然后是序列化的参数列表。在服务器端,它监听一个对象并使用反射来执行给定的方法。如果发生错误,返回的对象是一个封装了错误的 DistantRPCError。
代码非常简单(只有大约 100 loc)并且可以在多种情况下使用(我使用 Streams,所以我什至不依赖于 Sockets)。 我面临的问题是我无法静态测试我的代码(本地测试的简单初始化比测试的代码长)而且我真的看不出在 C++ 中实现它有多难(使用 JNI 进行序列化,我想)。
所以我的问题是:您知道在 Java 和 C++ 中进行 RPC 调用的另一种方法吗,这种方法非常简单(所以没有 RMI)并且可以信任(我不是在寻找一种闪亮的技术,我想要一些标准且经过行业验证的东西)。另外,我对性能有一些限制(这台机器是一台低成本的计算机,我在本地有很多密码学要做)。正如我所说,大多数模块(除了一两个)都是在本地执行的,所以我也对 IPC 机制感兴趣(即使我的所有模块只有一个 RPC 机制会很好)。
如果你愿意,我可以给你我的实际 RPC 代码,但正如我所说,它甚至没有经过测试,所以我不确定它是否有效。
编辑:我可能会使用 SOAP,因为我对使用 ORB 来解决我的特定问题没有太大兴趣。感谢您的想法!
【问题讨论】: