このセクションでは、GoaでのProtocol Bufferの操作と、gRPCサービスでのメッセージのシリアライゼーションについて説明します。
Goaは、サービス設計からProtocol Bufferの生成とコンパイルまでを、いくつかの主要なコンポーネントを通じて管理します:
Goaは、サービス設計から自動的にProtocol Buffer定義を作成します。これには以下が含まれます:
Protocol Bufferコンパイラ(protoc)のGoaでの統合は高度に設定可能です:
Goaは、Protocol Buffer型とサービスエンドポイントを橋渡しする洗練されたコードを生成します:
var _ = Service("calculator", func() {
// gRPCトランスポートを有効化
GRPC(func() {
// protocオプションを設定
Meta("protoc:path", "protoc")
Meta("protoc:version", "v3")
// 追加のprotocプラグイン設定
Meta("protoc:plugin", "grpc-gateway")
Meta("protoc:plugin:opts", "--logtostderr")
})
})
GoaでProtocol Buffer型を定義する際、Go型は自動的に対応するProtocol Buffer型にマッピングされます。以下は、Goa型とProtocol Buffer型の対応関係です:
Goa型 | Protocol Buffer型 |
---|---|
Int | int32 |
Int32 | int32 |
Int64 | int64 |
UInt | uint32 |
UInt32 | uint32 |
UInt64 | uint64 |
Float32 | float |
Float64 | double |
String | string |
Boolean | bool |
Bytes | bytes |
ArrayOf | repeated |
MapOf | map |
Protocol Bufferのフィールド番号は、メッセージのシリアライゼーションにおいて重要な役割を果たします。以下のベストプラクティスに従ってください:
例:
Method("createUser", func() {
Payload(func() {
// 頻繁に使用されるフィールド(1バイトエンコーディング)
Field(1, "id", String)
Field(2, "name", String)
Field(3, "email", String)
// あまり使用されないフィールド(2バイトエンコーディング)
Field(16, "preferences", func() {
Field(1, "theme", String)
Field(2, "language", String)
})
})
})
var Address = Type("Address", func() {
Field(1, "street", String)
Field(2, "city", String)
Field(3, "country", String)
Required("street", "city", "country")
})
var User = Type("User", func() {
Field(1, "id", String)
Field(2, "name", String)
Field(3, "address", Address) // ネストされた型
Required("id", "name")
})
相互に排他的なフィールドにはOneOf
を使用します:
var ContactInfo = Type("ContactInfo", func() {
OneOf("contact", func() {
Field(1, "email", String)
Field(2, "phone", String)
Field(3, "address", Address)
})
})
将来の拡張性を考慮してメッセージを設計します:
例:
var UserProfile = Type("UserProfile", func() {
// 現在のバージョンのフィールド
Field(1, "basic_info", func() {
Field(1, "name", String)
Field(2, "email", String)
})
// 将来の使用のために予約
Reserved(2, 3, 4)
ReservedNames("location", "department")
// 拡張ポイント
Field(5, "extensions", MapOf(String, Any))
})
型のマッピング
パフォーマンス
バージョニング