[英]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.