2009-09-15 132 views
34

我正在使用gSoap将遗留的C++系统重构为SOA。我们有一些性能问题(非常大的XML),所以我的主管让我看看协议缓冲区。我做了,看起来非常酷(我们需要C++和Java支持)。但协议缓冲区仅仅是用于序列化的解决方案,现在我需要将它发送到Java前端。我应该从C++和Java的角度使用什么来通过HTTP(只是内部网络)发送这些序列化的东西?Google协议缓冲区和HTTP

PS。另一个人试图加快我们的gSoap解决方案,我只对协议缓冲区感兴趣。

+0

仅供参考。性能与gsoap团队讨论(我参与这个),我们推荐使用'SOAP_XML_TREE'标志或用'-DWITH_NOIDREF'编译。如果没有这个标志,由于用多重参考元素(id-ref)进行SOAP编码来序列化图表(即检测共同引用的对象,分析循环数据结构等),性能可能会低得多。建议的标志将此功能关闭以将XML序列化为树。消息传递速度大大提高。性能的唯一瓶颈是网络延迟和带宽。 – 2016-02-27 22:38:01

+0

@Alex SOAP仍在更新?这实在令人印象深刻!这个问题是7岁,所以不会采取行动:) – Nazgob 2016-03-02 21:41:01

+0

从我了解到其他人已阅读常见问题(自2005年以来)与此建议。是什么让你相信这是最近的发展? – 2016-03-05 14:43:48

回答

53

您甚至可以发送包含HTTP请求或HTTP响应的二进制负载。只需将协议缓冲区的字节直接写入请求/响应,并确保将内容类型设置为“application/octet-stream”。客户端和服务器应该能够轻松地处理其他问题。我认为在任何一方都不需要比这更特别的东西。

+30

我们正在使用'application/x-protobuf',如幻灯片21所述:http://www.slideshare.net/mokeefe/javaone-2009-ts5276-restful-protocol-buffers – 2009-09-15 21:17:29

+0

啊,更好。不知道有人为它提供了MIME类型。 – 2009-09-16 07:52:21

+5

具有以“x-”开头的名称的MIME类型远不如标准,通常被视为application/octet-stream。 – n0rd 2009-09-16 10:52:08

2

据我所知,协议缓冲区支持在C++和Java中都可用,您应该能够在两个系统之间交换协议缓冲区序列化数据。

这就是说,它似乎你真正的问题是“我怎么送的东西在HTTP上C++后端和Java客户端之间的”

这听起来像你需要学习如何使用gSOAP的,阅读docs

或者,也可以托管在C++应用程序一个RESTful Web服务器:看看这个:https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

接下来,您将需要访问托管新的C++的RESTful服务器上的数据:看看这个:Rest clients for Java?

+2

gSOAP正在大大地过度复杂化这个问题。 Protobufs可以在本地二进制格式下正常工作。 – Will 2012-03-29 19:16:54

+0

过于复杂?当然,如果你想传输二进制内容,那么只需使用Protobufs和REST。但是对于XML来说,它使我们的工作变得更加简单。 WSDL,SOAP和XML的复杂部分都是照顾好的。此外,我们每秒用gsoap获得超过5,000个服务调用。主要开销是TCP/IP,而不是gsoap堆栈。 – 2016-02-27 18:40:00

5

您可以序列化/反序列化字符串中的protobuf编码数据。将序列化的字符串作为HTTP POST的主体发送给Java并对其进行反序列化。这是一种方法。另一种方法是利用protobuf Service界面。 Protobuf允许您在.proto文件中定义服务接口,并且协议缓冲区编译器将使用您选择的语言生成服务接口代码和存根。您只需实现protobuf :: RpcChannel和protobuf :: RpcController类即可获得完整的RPC框架。可能你可以为这些类写一个HTTP包装器。请参见下面的链接的详细资料:

http://code.google.com/apis/protocolbuffers/docs/proto.html#services http://code.google.com/apis/protocolbuffers/docs/reference/cpp-generated.html#service http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.service.html

24

protobuf的是一个二进制协议。它不能与SOAP混合。我建议你坚持使用gSOAP或完全转换为ProtoBuf。

随着protobuf的,你在这样一个特殊的格式定义协议,

message Product { 
    required string id = 1; 
    required string description = 2; 
    required int32 quantity = 3; 
    optional bool discontinued = 4; 
} 

protoc工具可以生成C++/Java的/ Python代码,所以你可以把它序列化的一端和反序列化的另一个。

正如您所看到的,ProtoBuf旨在序列化单个对象。它不提供SOAP提供的所有功能,如标题。为了解决这个问题,我们在ProtoBuf中使用ProtoBuf。我们定义了一个信封这样,

message Envelope { 
    enum Type { 
    SEARCH = 1; 
    SEARCH_RESPONSE = 2; 
    RETRIEVE = 3; 
    RETRIEVE_RESPONSE = 4; 
    } 
    required Type type = 1; 

    required bytes encodedMessage = 2; 

    message Header { 
    required string key = 1; 
    required bytes value = 2; 
    }  
    repeated Header headers = 3; 
} 

encodedMessage是另一个序列化的protobuf消息。SOAP标题中的所有内容现在变为headers

4

谷歌前端倾向于application/protobuf

Google API客户端的ProtocolBufferModel使用application/x-protobuf