2011-03-14 23 views
2

我正在尋找一種非常簡單的方法來允許Java和C++應用程序之間的RPC。在Java和C++中簡化RPC

我的系統包含幾個Java模塊和一個C++模塊。 我沒有太多不同的程序可以調用(每個模塊大約2-3個),並且它們不會有太大變化(除了一些小的修改,例如添加新程序或更改原型)。我正在寫所有的模塊,所以我可以使用任何我想要的。此外,這些模塊都將在同一臺機器上執行,除了一臺機器,但是在另一臺機器上執行其中一些機器而不會受到多少騷擾(基本上只是更改配置文件)的可能性會更好。

這個應用程序使用的所有模塊,機器和網絡都是可信的,但我不希望RPC協議出現任何安全漏洞,並且我想要最小的性能開銷,所以RPC協議越簡單越好。另外,每個調用的方法只有一個原型。

目前我試圖通過TCP套接字使用RPC,因爲我不想使用RMI或Unix原語(在Java上沒有標準實現,也沒有網絡功能)。我已經編寫了一個非常簡單的RPC協議:通過TCP框架,您可以調用所調用方法的序列化名稱,然後是序列化的參數列表。在服務器端,它偵聽一個對象並使用反射來執行給定的方法。在發生錯誤的情況下,返回的對象是封裝錯誤的DistantRPCError。代碼非常簡單(只有大約100個loc),並且可以用於各種各樣的情況(我使用Streams,所以我甚至不依賴於套接字)。 我面臨的問題是我無法靜態測試我的代碼(本地測試的簡單初始化比測試代碼更長),我真的不明白在C++中實現它有多困難(使用JNI for序列化,我想)。

所以我的問題是:你知道在Java和C++中進行RPC調用的另一種方法,它非常簡單(因此沒有RMI)並且可以信任(我不想尋找一種令人眩目的技術,我想要一些標準和行業認證的東西)。另外,我對性能有一些限制(機器是一臺低成本的計算機,我在本地有很多密碼學)。正如我所說的,大多數模塊(除了一個或兩個)都是在本地執行的,所以我也對IPC機制感興趣(即使對於我的所有模塊只有一個RPC機制是很好的)。

如果你願意,我可以給你我的實際RPC代碼,但正如我所說的那樣,它甚至沒有經過測試,所以我不確定它的工作原理。

編輯:我可能會使用SOAP,因爲我沒有看到太多的興趣使用ORB來解決我的特定問題。感謝您的想法!

回答

4

我不知道是否有人會滿足您的簡單標準,但我會說你的兩個最好的賭注是舊的 - CORBA - 和一些新的 - Web服務。

因爲用不同語言編寫的分佈式組件的互操作性是其靈感的一部分,所以想到了CORBA,但這並不簡單。市場也投票反對CORBA。我會說它在90年代初到90年代達到頂峯,並且從那以後一直下降。我沒有聽說CORBA的價值。

Web服務,特別是如果您避開SOAP並使用REST,通過HTTP工作並且相對簡單。我認爲在開發和維護自己的有線協議方面沒有任何優勢。我會使用HTTP並堅持使用REST。

+0

CORBA似乎是我的最佳選擇。 – vickirk 2011-03-14 10:20:21

+0

我不知道,使用基於組件的方法似乎有點矯枉過正,我不知道本地HTTP服務器如何在性能方面工作(我最多可以有8個模塊在本地一起工作,並像50個RPC一樣工作每秒);但是謝謝你,我會研究這些方法! – 2011-03-14 10:23:09

+0

我不明白如何使用自定義協議對套接字進行RPC不是基於組件的。 「組件」和「模塊」這兩個詞似乎可以互換。如果性能是一個問題,你會擔心你所引入的所有網絡延遲問題。 – duffymo 2011-03-14 10:39:27

2

就這樣你知道,我最終選擇使用MessagePack來處理所有的RPC,重點是:使用起來非常簡單,開源(使用小代碼庫),它的工作原理非常奇妙。

缺點是:對於java庫,沒有任何意見在所有,但正如我所說它是開源的小代碼庫和簡單的體系結構,所以沒有理解它是如何工作的。

也有很多不同的開發版本的Java庫(這可能意味着一個不穩定的API,但我不會更新庫,一旦系統將完成,所以這不是一個問題),我可以不在Windows上編譯C++庫(這對我來說不是一個問題,因爲我在Linux上使用它)。

+0

獅子座,我知道這是相當古老的,但是這個決定是如何爲你做出的?我正在尋找將RPC添加到使用Java編寫的獨立應用程序中,以便我們可以遠程調用任務,但添加REST或SOAP或什麼都不是太麻煩。這似乎很簡單。它運作了嗎? – Daniil 2012-10-02 20:31:32

+0

嗨,這個決定對我來說效果不錯,郵件包對於這個項目來說非常棒。我不再在同一個項目中,代碼庫似乎已經發生了一些變化,但是如果我不得不再次選擇序列化算法,我仍然會這樣做:它很簡單,代碼庫很小,因此您可以輕鬆地調整代碼滿足您的特定需求。 – 2012-10-11 19:55:40