几个月前,我们宣布了对从 Ent Schema 定义生成 gRPC 服务的实验性支持。实现尚未完成,但我们希望早点发布给社区,让他们实验并反馈。
今天,在收到了大量社区反馈后,我们很高兴宣布Ent + gRPC集成已“Ready for Usage”,这意味着所有基本功能已完成,我们预计大多数 Ent 应用可以利用此集成。
自最初公告以来,我们新增了哪些功能?
支持“可选字段” – Protobuf 常见的问题是 nil 值的表示方式:零值的原始字段不会被编码到二进制表示中。这意味着应用无法区分原始字段的零值和未设值。为了解决这个问题,Protobuf 项目支持一些名为"Well-Known-Types"的"wrapper types"(包装类型),它们用结构体包装原始值。之前不支持这一点,但现在
entproto在生成 Protobuf 消息定义时会使用这些包装类型来表示 “Optional” 的 ent 字段:// Code generated by entproto. DO NOT EDIT.
syntax = "proto3";
package entpb;
import "google/protobuf/wrappers.proto";
message User {
int32 id = 1;
string name = 2;
string email_address = 3;
google.protobuf.StringValue alias = 4;
}多边关系支持 – 当我们发布最初版本的
protoc-gen-entgrpc时,只支持为 “Unique” 边(即至多引用一个实体)生成 gRPC 服务实现。自 最近一次版本 起,插件已支持生成读取和写入 O2M 与 M2M 关系实体的 gRPC 方法。部分响应 – 默认情况下,服务的
Get方法不会返回边信息。这样做是有意的,因为与实体相关的实体数量是无界的。为让调用方能够指定是否返回边信息,生成的服务遵循 Google AIP-157(部分响应)。简而言之,Get<T>Request消息包含一个名为 View 的枚举,调用方可以通过该枚举控制是否应从数据库检索此信息。message GetUserRequest {
int32 id = 1;
View view = 2;
enum View {
VIEW_UNSPECIFIED = 0;
BASIC = 1;
WITH_EDGE_IDS = 2;
}
}
开始使用
- 为帮助大家开始使用 Ent + gRPC 集成,我们发布了官方的Ent + gRPC 教程(以及相应的GitHub 仓库)
- 需要帮助开始使用集成还是有其他问题?请加入我们的 Slack或我们的 Discord 服务器
想获取更多 Ent 新闻和更新:
- 订阅我们的新闻简报
- 在推特上关注我们
- 在 Gophers Slack 的 #ent 频道加入我们
- 加入我们的Ent Discord 服务器