Golang Go语言中造了一个 protoc-gen-fieldmask 插件

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言中造了一个 protoc-gen-fieldmask 插件

动手做一个 protoc-gen-fieldmask 插件来解决,gRPC 在服务侧的增量更新和屏蔽字段的场景问题;同时总结下使用 PG* 开发 protoc 插件的一些经验。

https://yeqown.xyz/2022/01/25/protoc-gen-fieldmask%E6%8F%92%E4%BB%B6/


更多关于Golang Go语言中造了一个 protoc-gen-fieldmask 插件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

更多关于Golang Go语言中造了一个 protoc-gen-fieldmask 插件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


功能上是有很多应用场景的,但官方这个[]string 里面传字符串的定义其实挺臭的,兼容性的角度,性能的角度都不行

哈哈,是的,所以避免人为传 string 出错,我就想直接从 proto 生成近乎所有字段的 Mask_xxx 函数来使用。兼容性方面得看自己需求是什么,如果频繁变动的确实不太适合加这种功能;性能的话,我个人感觉是如果有要求的话,最好是自己去判断 “某些计算和调用” 相关字段是否需要返回,应该会降低某些场景下的延迟,但是这样势必侵入逻辑,有利有弊吧

问一个问题,我调用的其他后台提供的 RPC 接口,我和后台使用同一份 proto 协议进行交互,但是后台返回的结果里有一个多余的字段,我这边没有使用这个字段,可以你的这个插件屏蔽该字段吗?如果可以的话,应该怎么屏蔽呢?

可以啊,就是客户端使用 FieldMask 而已,把屏蔽的处理过程放到了客户端而已(客户端获取到 response 之后,调用一下 XXX_FieldMask.Mask(resp) 就会屏蔽不需要的字段,客户端后续的处理中再获取这个字段时就是空值了)只是这样做几乎没有意义~

为啥没意义呢?

从我的角度出发,mask response 字段是为了减少客户端的使用成本,同时节省带宽和减少不必要的计算(提升服务端性能)。但是,如果再客户端自己做的话,那么这两个目的都没有达到 ~ 所以我认为没有意义

在Go语言中,protoc-gen-fieldmask 是一个非常有用的插件,特别是在处理基于Protocol Buffers(简称Protobuf)的RPC(远程过程调用)服务时,它极大地简化了字段屏蔽(Field Masking)的功能实现。字段屏蔽是一种优化数据传输和API设计的有效方法,允许客户端指定它们感兴趣的数据字段,从而减少不必要的数据传输。

protoc-gen-fieldmask 插件的工作原理是,在编译Protobuf定义文件(.proto文件)时生成额外的代码,这些代码能够理解和处理字段屏蔽请求。这通常涉及到在请求和响应消息中添加额外的字段屏蔽信息,以及修改服务端的逻辑以根据这些字段屏蔽信息来序列化或反序列化数据。

使用这个插件的主要好处包括:

  1. 减少带宽使用:只传输客户端请求的数据字段,降低了网络开销。
  2. 提高安全性:避免传输敏感信息,增强了数据隐私保护。
  3. API设计的灵活性:允许API以更细粒度的方式控制数据的暴露。

要在项目中集成protoc-gen-fieldmask,你需要先安装这个插件,然后在编译.proto文件时指定它。这通常涉及到在protoc命令行工具中添加相应的--plugin--<plugin_output_option>参数。

总之,protoc-gen-fieldmask是一个强大的工具,可以帮助你更有效地管理和优化基于Protobuf的RPC服务中的数据传输。如果你正在开发这样的服务,并且希望提高数据传输的效率和安全性,那么集成这个插件无疑是一个明智的选择。

回到顶部