【问题标题】:Simpliest RPC in Java and C++Java 和 C++ 中最简单的 RPC
【发布时间】: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 来解决我的特定问题没有太大兴趣。感谢您的想法!

【问题讨论】:

    标签: java c++ rpc


    【解决方案1】:

    我不知道其中任何一个是否符合您的简单标准,但我想说您最好的两个选择是旧的 - CORBA - 和新的 - Web 服务。

    想到 CORBA 是因为用不同语言编写的分布式组件的互操作性是其灵感的一部分,但这并不简单。市场也投票反对 CORBA。我会说它在 90 年代初到中期达到顶峰,此后一直下降。我没有听到太多关于 CORBA 的信息,因为它的价值。

    Web 服务,特别是如果您避开 SOAP 而使用 REST,则通过 HTTP 工作并且相对简单。我认为开发和维护自己的有线协议没有任何优势。我会使用 HTTP 并坚持使用 REST。

    【讨论】:

    • CORBA 对我来说似乎是最好的选择。
    • 我不知道,使用基于组件的方法似乎有点矫枉过正,而且我不知道本地 HTTP 服务器如何在性能方面工作(我最多可以有 8 个模块工作在本地一起,每秒产生大约 50 个 RPC);但谢谢,我会研究这些方法!
    • 我看不出使用自定义协议在套接字上进行 RPC 不是基于组件的。 “组件”和“模块”这两个词对我来说似乎可以互换。如果性能是一个问题,您会更担心您引入的所有网络延迟。
    • 你是对的,这接近于基于组件的方法,但如果有多个“模块”,它主要是为了重复:执行两个具有相同规范但不同实现的不同代码以避免实现中的错误(如果两者不同,那么我什么也不做并记录错误)。这就是为什么我必须在多个可执行文件之间拆分我的代码(这和我还有一些需要在沙盒 JVM 中运行的中等可信代码)。
    【解决方案2】:

    如您所知,我最终选择在我所有的 RPC 中使用MessagePack,重点是:它使用起来非常简单、开源(带有少量代码库)并且运行良好。

    缺点是:java lib 根本没有没有 cmets,但正如我所说,它是开源的,代码库小,架构简单,所以理解它的原理没有问题有效。

    Java 库也有很多不同的开发版本(这可能意味着 API 不稳定,但系统完成后我不会更新库,所以这不是问题),我不能在 windows 上编译 C++ 库(这对我来说不是问题,因为我在 Linux 上使用它)。

    【讨论】:

    • Leo,我知道这已经很老了,但是这个决定对你来说是怎样的呢?我希望将 RPC 添加到用 Java 编写的独立应用程序中,以便我们可以远程调用任务,但添加 REST 或 SOAP 之类的东西似乎太麻烦了。这似乎很简单。成功了吗?
    • 嗨,这个决定对我来说效果很好,消息包对这个项目非常有用。我不再在同一个项目上,代码库似乎发生了一些变化,但如果我不得不再次选择序列化算法,我仍然会选择它:它很简单,代码库很小,所以你可以轻松地适应根据您的特定需求编写代码。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多