跳到主要内容

Ent + gRPC已可使用

· 阅读需 4 分钟

几个月前,我们宣布了对从 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 新闻和更新: