proto-validator 使用介绍

2022-11-03 16:59:58 +08:00
 coderxy

最近把内部的一个工具开源了出来,主要功能就是可以通过配置 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 文件的读取目录,如下图所示: 

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

欢迎来提 issue.

1186 次点击
所在节点    Go 编程语言
10 条回复
liuhan907
2022-11-03 23:16:55 +08:00
没有注解做这个真的麻烦,不然语言内用注解或者属性就更方便了。
coderxy
2022-11-04 09:36:39 +08:00
@liuhan907 是这个道理, 不过用到了 proto 就希望把 dto 的定义跟 dto 的参数验证放到一起,这样观感上更好一点。
wencan
2022-11-06 20:57:24 +08:00
是不是有点麻烦?
proto 把 validator tag 加上
中间件再校验可好?
coderxy
2022-11-07 09:24:10 +08:00
@wencan 没太理解你的意思, 现在不就是在 proto 里面加 tag ,然后自动生成代码校验吗? 你指的是哪种?
wencan
2022-11-07 09:56:56 +08:00
@coderxy 我的意思是,校验这步,中间件就可以
coderxy
2022-11-07 10:20:18 +08:00
@wencan 现在 proto-validator 的做法不就类似与中间件吗? 不然如果用一个统一的中间件让服务使用, 那就需要 proto 在生成 go struct 的时候生成很多 tag 去描述参数验证的信息。
yeqown
2022-11-08 16:23:27 +08:00
PGV 已经够用了
coderxy
2022-11-08 17:24:24 +08:00
@yeqown 看了一下,感觉跟 go-proto-validators 差不多,主要是生成规则,当然跟我这个差别也不大,proto-validaor 就是把检查错误并返回的部分也自动生成了。
czyt
2022-11-18 21:24:46 +08:00
kratos 大法好
coderxy
2022-11-21 09:24:24 +08:00
@czyt kratos 是微服务框架,proto-validator 只是一个参数验证小插件,不在一个级别哦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/892412

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX