热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从protobuf更新数据

如何解决《从protobuf更新数据》经验,为你挑选了1个好方法。

我正在构建一个包含多个断开组件的微服务系统,我目前正在尝试了解如何根据提供的protobuf数据了解对象上的哪些字段应该更新.

流程如下:

    客户端向API发送JSON请求.

    API将JSON数据转换为protobuf结构,然后将其发送到负责处理它的微服务.

    微服务从API接收数据并对其执行任何操作,在这种情况下,我正在尝试更改MySQL表中的单个值,例如客户端的电子邮件地址.

现在,我遇到的问题是,因为protobuf(理解上)不允许指针,protobuf对象将包含未提供的所有内容的零值.这意味着,如果客户想要更新他们的电子邮件地址,我不知道他们是否也设置IncludeInMailListsfalse- 或者是否仅提供(具有零值)并且不应该更改.

问题是:我如何 - 从protobuf对象 - 知道一个值是否被明确地设置为0,或者只是没有提供?

我当前的解决方案几乎有一个特殊的对象UpdateCustomer,它也有一个数组,Fields指定微服务应该关注哪些字段,但感觉就像是一个糟糕的解决方案.

有人必须已经更好地解决了这个问题.我该如何实施呢?



1> Zak..:

Protobufs野外口罩是一种方式.

https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.FieldMask

https://github.com/golang/protobuf/issues/225

但是如果你使用的是grpc,那么就有一种(有点)内置方式.

Grpc包装纸

自proto3(protobufs v3)以来,未设置的基元和已设置为"零值"的基元(假,0,""等)之间没有区别.

相反,您可以使用对象或protobufs语言中的"消息",因为对象可以是nil/null.你没有提到你正在使用的语言,但希望这些例子有意义.

给定RPC服务,例如:

import "google/protobuf/wrappers.proto";

service Users {
    rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse)
}

message UpdateUserRequest {
    int32 user_id = 1;
    google.protobuf.StringValue email = 2;
}

message UpdateUserResponse {}

注意import "google/protobuf/wrappers.proto";很重要.它让你在这里访问谷歌protobufs包装器源代码.这些不是具有允许您测试存在的方法的对象.

在java中生成的Grpc代码为您提供了如果值存在则.hasEmail()返回的方法true.未设置值的getter仍然会返回零值.我认为golang版本使用的指针可以测试nil而不是显式hasX()方法.

更多关于此github问题的信息/讨论


推荐阅读
author-avatar
Angle健少
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有