Golang Go语言中 proto-validator 使用介绍
最近把内部的一个工具开源了出来,主要功能就是可以通过配置 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
简单服务(单个服务)
多个服务(对于有些大仓库,很多服务在同一个目录下)
方法介绍
所有的默认值等于不启用插件 比如如果设置 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 文件的读取目录,如下图所示:
最后,github 地址( https://github.com/Gitforxuyang/proto-validaotr)
欢迎来提 issue.
Golang Go语言中 proto-validator 使用介绍
更多关于Golang Go语言中 proto-validator 使用介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
没有注解做这个真的麻烦,不然语言内用注解或者属性就更方便了。
更多关于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
二、使用
- 定义验证规则:在
.proto
文件中,你可以为消息字段定义验证规则,如数值范围、正则表达式等。 - 生成验证器:使用
protoc
命令并指定--govalidators_out
选项来生成验证器代码。 - 在Go代码中使用:生成的验证器代码会包含
Validate
方法,你可以直接调用该方法来验证消息的有效性。
三、特点
- 高性能:生成的验证函数不依赖于反射机制,避免了性能瓶颈。
- 易于集成:作为
protoc
插件,可以轻松集成到现有的Protobuf项目中。 - 清晰的错误信息:生成的验证函数包含详细的错误信息,便于调试和维护。
四、应用场景
go-proto-validators
适用于微服务架构、高性能系统以及对数据完整性有严格要求的应用场景。通过自动生成验证函数,它可以减少手动编写验证代码的工作量,提高开发效率,并确保数据的有效性和一致性。