【发布时间】:2019-03-13 11:14:48
【问题描述】:
我有两台服务器
- 用户服务器:处理所有用户CRUD操作
-
产品服务器:处理产品 CRUD 操作并通过 gRPC 调用从用户服务器获取用户信息
type User struct { ID string `json:"id"` FirstName string `json:"firstName"` MiddleName *string `json:"middleName,omitempty"` LastName string `json:"lastName"` Email string `json:"email"` Disabled bool `json:"disabled"` LastSignedInAt *time.Time `json:"lastSignedInAt,omitempty"` Bio *string `json:"bio,omitempty"` BirthDate *time.Time `json:"birthDate,omitempty"` }这里有些字段是可选的,因为我使用的是 cockroachDB(extended postgreSQL),所以我将它们保存为指针,以便轻松扫描可变形式的查询结果。
这是我的原型文件:
message User {
int64 id = 1;
string firstName = 2;
string lastName = 3;
string email = 5;
bool disabled = 6;
string lastSignedInAt = 8;
string bio = 9;
string birthdate = 10;
string profession = 14;
}
现在从上面的 proto 文件生成的模型是这样的:"
type User struct {
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
FirstName string `protobuf:"bytes,2,opt,name=firstName,proto3" json:"firstName,omitempty"`
LastName string `protobuf:"bytes,3,opt,name=lastName,proto3" json:"lastName,omitempty"`
Email string `protobuf:"bytes,4,opt,name=email,json=email,proto3" json:"email,omitempty"`
Disabled bool `protobuf:"varint,6,opt,name=disabled,proto3" json:"disabled,omitempty"`
LastSignedInAt string `protobuf:"bytes,8,opt,name=lastSignedInAt,proto3" json:"lastSignedInAt,omitempty"`
Bio string `protobuf:"bytes,9,opt,name=bio,proto3" json:"bio,omitempty"`
Birthdate string `protobuf:"bytes,10,opt,name=birthdate,proto3" json:"birthdate,omitempty"`
}
现在的问题是,当我为可选字段使用指针时,它会在没有值的情况下存储 null,但在相反的站点上,gRPC 不会理解 null 值并抛出错误。
我已经尝试将google.protobuf.StringValue 值作为这样的 grpc 类型
google.protobuf.StringValue lastSignedInAt = 8;
这可行,但问题是我必须为处理程序中的每个字段编写条件:
if lastSignedInAt != nil {
user.LastSignedInAt = &wrappers.StringValue{Value:*lastSignedInAt}
}
解决此问题的最佳方法是什么?我应该更改数据库模型还是 gRPC 模型中的任何更改?
【问题讨论】:
-
我看到两个user struct有相同的json标签,你有没有试过用json.Marshal和json.Unmarshal来转换两个user struct?
-
您是否打算通过其他方式将 Proto 复制到 Struct,而不是逐个字段?这可能是最快和最安全的方法。 Protobuf 在其网站上声明它不是通用数据结构,并建议您将其转换为特定领域的表示形式。
标签: go protocol-buffers grpc