V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
coderxy
V2EX  ›  Go 编程语言

proto-validator 使用介绍

  •  
  •   coderxy · 2022-11-03 16:59:58 +08:00 · 1391 次点击
    这是一个创建于 758 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近把内部的一个工具开源了出来,主要功能就是可以通过配置 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.

    10 条回复    2022-11-21 09:24:24 +08:00
    liuhan907
        1
    liuhan907  
       2022-11-03 23:16:55 +08:00 via Android
    没有注解做这个真的麻烦,不然语言内用注解或者属性就更方便了。
    coderxy
        2
    coderxy  
    OP
       2022-11-04 09:36:39 +08:00
    @liuhan907 是这个道理, 不过用到了 proto 就希望把 dto 的定义跟 dto 的参数验证放到一起,这样观感上更好一点。
    wencan
        3
    wencan  
       2022-11-06 20:57:24 +08:00
    是不是有点麻烦?
    proto 把 validator tag 加上
    中间件再校验可好?
    coderxy
        4
    coderxy  
    OP
       2022-11-07 09:24:10 +08:00
    @wencan 没太理解你的意思, 现在不就是在 proto 里面加 tag ,然后自动生成代码校验吗? 你指的是哪种?
    wencan
        5
    wencan  
       2022-11-07 09:56:56 +08:00
    @coderxy 我的意思是,校验这步,中间件就可以
    coderxy
        6
    coderxy  
    OP
       2022-11-07 10:20:18 +08:00
    @wencan 现在 proto-validator 的做法不就类似与中间件吗? 不然如果用一个统一的中间件让服务使用, 那就需要 proto 在生成 go struct 的时候生成很多 tag 去描述参数验证的信息。
    yeqown
        7
    yeqown  
       2022-11-08 16:23:27 +08:00
    PGV 已经够用了
    coderxy
        8
    coderxy  
    OP
       2022-11-08 17:24:24 +08:00
    @yeqown 看了一下,感觉跟 go-proto-validators 差不多,主要是生成规则,当然跟我这个差别也不大,proto-validaor 就是把检查错误并返回的部分也自动生成了。
    czyt
        9
    czyt  
       2022-11-18 21:24:46 +08:00
    kratos 大法好
    coderxy
        10
    coderxy  
    OP
       2022-11-21 09:24:24 +08:00
    @czyt kratos 是微服务框架,proto-validator 只是一个参数验证小插件,不在一个级别哦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2574 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:37 · PVG 11:37 · LAX 19:37 · JFK 22:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.