Golang Go语言中 proto-validator 使用介绍

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

最近把内部的一个工具开源了出来,主要功能就是可以通过配置 proto 的拓展完成 dto 的参数验证定义与执行。

proto-validator

proto-validator 是我们在平时开发中为了解决业务痛点而创造的。 为了实现 proto dto 的定义和参数验证 ,原来我们只能在写业务代码时自己再去做参数验证,会造成一定量的重复劳动。而 proto-validator 可以实现 在定义 proto 时就可以声明参数验证规则,通过 proto-gen-av 生成自动验证代码,把参数验证自动处理掉。

与 github 上其它类似的库的区别? 我人为最大的区别是更节省了一步。 我看了其它库主要是生成 validate 规则,然后需要用户在业务代码中调一下 这个验证方法,自行返回错误。 我是一步重复劳动都不想做,所以把验证并返回报错这一步也自动化了。

protoc-gen-av

全称 protoc-gen-auto-validator 简称 protoc-gen-av

最佳实践

先安装 protoc-gen-av 插件

go install github.com/Gitforxuyang/proto-validaotr/cmd/protoc-gen-av

简单服务(单个服务)

参考 examples/simple

多个服务(对于有些大仓库,很多服务在同一个目录下)

参考 examples/multi

方法介绍

所有的默认值等于不启用插件 比如如果设置 gte=0 ,可能本意是需要入参>=0 ,但是插件无法读取,所以请不要在配置中使用 各类型的零值

字段类型 默认值 类型 当字段是 string 类型时 repeated 时 int32/int64/uint32/uint64 时 float/double 时 message 类型时
omitempty true bool 不能为空字符串 数组长度不能为 0 值不能为 0 值不能为 0 不能为 nil
gte 0 double 不支持 长度必须>=n 值必须>= 值必须>= 不支持
gt 0 double 不支持 长度必须>n 值必须> 值必须> 不支持
lte 0 double 不支持 长度必须<=n 值必须<= 值必须<= 不支持
lt 0 double 不支持 长度必须<n 值必须< 值必须< 不支持
eq "" string 字符串=n 长度必须=n 值必须=n 值必须=n 不支持
in "" string 格式必须是[1,2,3] 不支持 格式必须是[1,2,3] 格式必须是[1.1,2.2,3.3] 不支持
regexp "" string 正则表达式 不支持 不支持 不支持 不支持

QA

为什么需要复制 plugin.proto 文件到自己的服务里

因为 go mod 模式下,无法通过原来 gopath 的方式去 src 目录下读取第三方库的文件了。 所以只能这样

为什么还需要传创建 error 的方法

因为有些业务有自己的 error 对象,无法直接返回系统的 error ,所以提供创建 error 对象的方法,供使用方自己 去定义 error 的创建

我的 proto 文件在 goland 里标红怎么办

在 goland 中配置对 proto 文件的读取目录,如下图所示: 

img.png

最后,github 地址( https://github.com/Gitforxuyang/proto-validaotr)

欢迎来提 issue.


Golang Go语言中 proto-validator 使用介绍

更多关于Golang Go语言中 proto-validator 使用介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

没有注解做这个真的麻烦,不然语言内用注解或者属性就更方便了。

更多关于Golang Go语言中 proto-validator 使用介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是这个道理, 不过用到了 proto 就希望把 dto 的定义跟 dto 的参数验证放到一起,这样观感上更好一点。

是不是有点麻烦?
proto 把 validator tag 加上
中间件再校验可好?

没太理解你的意思, 现在不就是在 proto 里面加 tag ,然后自动生成代码校验吗? 你指的是哪种?

我的意思是,校验这步,中间件就可以

现在 proto-validator 的做法不就类似与中间件吗? 不然如果用一个统一的中间件让服务使用, 那就需要 proto 在生成 go struct 的时候生成很多 tag 去描述参数验证的信息。

PGV 已经够用了

看了一下,感觉跟 go-proto-validators 差不多,主要是生成规则,当然跟我这个差别也不大,proto-validaor 就是把检查错误并返回的部分也自动生成了。

kratos 大法好

kratos 是微服务框架,proto-validator 只是一个参数验证小插件,不在一个级别哦

在Golang(Go语言)中,go-proto-validators是一个用于生成Protobuf消息验证器的强大工具。以下是对其使用的详细介绍:

一、安装

首先,确保你已经安装了protoc编译器和Go环境。然后,通过以下命令安装go-proto-validators

go get github.com/mwitkow/go-proto-validators/protoc-gen-govalidators

二、使用

  1. 定义验证规则:在.proto文件中,你可以为消息字段定义验证规则,如数值范围、正则表达式等。
  2. 生成验证器:使用protoc命令并指定--govalidators_out选项来生成验证器代码。
  3. 在Go代码中使用:生成的验证器代码会包含Validate方法,你可以直接调用该方法来验证消息的有效性。

三、特点

  • 高性能:生成的验证函数不依赖于反射机制,避免了性能瓶颈。
  • 易于集成:作为protoc插件,可以轻松集成到现有的Protobuf项目中。
  • 清晰的错误信息:生成的验证函数包含详细的错误信息,便于调试和维护。

四、应用场景

go-proto-validators适用于微服务架构、高性能系统以及对数据完整性有严格要求的应用场景。通过自动生成验证函数,它可以减少手动编写验证代码的工作量,提高开发效率,并确保数据的有效性和一致性。

回到顶部