簡體   English   中英

兩種不同語言之間的協議緩沖區

[英]Protocol Buffers between two different languages

我們將 Golang 和 .NET Core 用於我們的互通微服務基礎架構。 跨服務的所有數據都基於我們創建的 Protobuffs 協議。 這是我們的 Protobuff 之一的示例:

syntax = "proto3";
package Protos;
option csharp_namespace = "Protos";
option go_package="Protos";
message EventMessage {
    string actionType = 1;
    string payload = 2;
    bool auditIsActive = 3;
}

Golang 運行良好,服務根據需要生成內容並將其發送到 SQS 隊列,一旦發生這種情況,.NET 核心服務將獲取數據並嘗試對其進行序列化。

以下是 SQS 消息示例的內容:

{"@type":"type.googleapis.com/Protos.EventMessage","actionType":"PushPayload","payload":"<<INTERNAL>>"}

但是我們收到一個異常,說明線類型未定義如下:

Google.Protobuf.InvalidProtocolBufferException: Protocol message contained a tag with an invalid wire type.
   at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(CodedInputStream input)
   at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(CodedInputStream input)
   at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(UnknownFieldSet unknownFields, CodedInputStream input)
   at Protos.EventMessage.MergeFrom(CodedInputStream input) in /Users/maordavidzon/projects/github_connector/GithubConnector/GithubConnector/obj/Debug/netcoreapp3.0/EventMessage.cs:line 232
   at Google.Protobuf.MessageExtensions.MergeFrom(IMessage message, Byte[] data, Boolean discardUnknownFields, ExtensionRegistry registry)
   at Google.Protobuf.MessageParser`1.ParseFrom(Byte[] data)

兩個服務中的 Proto 文件完全相同。

是否有任何我們需要添加的潛在缺失選項或屬性?

看起來您使用的是 JSON 格式而不是二進制格式。 在這種情況下, 您需要ParseJson(string json) ,而不是ParseFrom(byte[] data)

注意:如果這對您很重要,二進制格式會更有效。 它還對 protobuf 庫/工具有更好的支持。

基本上有兩種可能的情況,或者您為 .NET 和 GoLang 生成的 protos 文件不在同一版本中,或者您的數據在 GoLang 和 .NET 應用程序之間傳輸時已損壞。

Protobuf 是一個二進制協議,檢查你是否有任何 http 過濾器或其他任何可以改變傳入或傳出字節流的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM