2016-11-16 18 views
3

我指定了幾個獨立的gRPC服務將全部託管在同一個服務器進程之外。每個服務都在其自己的protobuf文件中定義。然後,這些工具通過gRPC工具運行,給我目標語言(在我的情況下是c#),然後我可以實現我的服務器和客戶端。你如何分享服務之間的gRPC原型定義

每個這些不同的API使用許多通用元素,諸如錯誤響應枚舉,所述消息類型(這似乎是,可以在GRPCWellKnownTypes;但我不知道怎樣包括那要麼我定義了我自己的)。

目前,我最終將每個proto構建重複枚舉和類到自己的名稱空間中。雖然我知道我可以在一個共同的原始文件中分享這些定義,並且包含這些定義;我不知道如何最終只將這些代碼生成一個通用的命名空間。雖然這樣做有效,但將它保留到一套更合適;如果採取諸如在服務之間彙總錯誤之類的方式,它在轉換和等效性方面可能也會遇到問題。

我以爲我失去了一些東西是我的東西,如WellKnownTypes命名認爲,這應該是可能的,但讀書,正如前面提到的,我不看我怎麼指的是在原無論是。

SO在目前看起來非常輕巧gRPC目前所以我的搜索沒有太多的發現,而我對這個新手這麼有指針?

+0

https://developers.google.com/protocol-buffers/docs/proto#other可能是你的事情。 – weismat

回答

4

協議緩衝區通過使用不同的package標識符來解決此問題。每條消息都將放置在不同的協議緩衝區特定包中,該包與C#名稱空間無關。例如:

// common.proto 
syntax "proto3"; 
package my.api.common; 

option csharp_namespace = "My.Api.Common"; 

message Shared { 
    // ... 
} 

然後在服務特定的文件:

// service1.proto 
syntax "proto3"; 
package my.api.service1; 

import "common.proto"; 

option csharp_namespace = "My.Api.Service1"; 

message Special { 
    my.api.common.Shared shared = 1; 
} 

你需要確保只有一個共同的原副本,否則他們可能會不同步。您可以將常見消息放入common.proto文件中,並從每個特定的其他原始文件中引用它們。

+0

我太sooooo對不起,我花了這麼長時間纔回到驗證這一點。被拖到另一個任務。 – Wizbit