Go 框架三件套详解(Web/RPC/ORM) | 青训营笔记

113 阅读4分钟

这是我参与「第五届青训营 」笔记创作活动的第5天

Go 框架三件套详解(Web/RPC/ORM)

一、本堂课重点内容:

本堂课的知识要点有哪些?

  • 将前几节课的知识运用到项目
  • 掌握Hertz/Kitex/Gorm的基本使用方式
  • 通过学习实战案例,可以使用 Hertz/Kitex/Gorm 完成日常后端开发任务

二、详细知识点介绍:

三件套的使用

  • GORM
    • GORM会使用名为ID的字段为主键
    • 使用结构体的蛇形负数为表明
    • 字段名的蛇形作为列名
    • 使用 CreatedAt 、 UpdatedAt 字段作为创建 、更新时间
    • GORM支持度数据库MvSQL 、 SQLServer 、 PostgreSQL 、 SQLite 。
    • GORM 通过驱动来连接数据库 , 如果需要连接其它类型的数据库 , 可以复用 / 自行开发驱动 。
    • 如何使用 Upsert使用 clause.OnConflict 处理数据冲突
    • 如何使用默认值通过使用 default 标签为字段定义默认值
    • First 的使用踩坑使用 First 时 , 需要注意查询不到数据会返回 ErrRecordNotFound0使用 Find 查询多条数据 , 查询不到数据不会返回错误 。
    • 使用结构体作为查询条件当使用结构作为条件查询时 , GORM 只会查询非零值字段 。 这意味着如果您的字段值为 0 、false 或其他零值字段,该字段不会被用于构建查询条件,使用map来构建查询条件
    • GORM 提供了 gorm.DeletedAt 用于帮助用户实现软删拥有软删除能力的 Model 调用 Delete 时 , 记录不会被从数据库中真正删除 。 但 GORM 会将 DeletedAt 置为当前时间并且你不能再通过正常的查询方法找到该记录 。使用 Unscoped 可以查询到被软删的数据
    • Gorm 提供了 Begin 、 Commit 、 Rollback 方法用于使用事务
    • Gorm 提供了 Tansaction 方法用于自动提交事务 , 避免用户漏写 Commit 、 Rollback
    • GORM 在提供了 CURD 的 Hook 能力 。Hook 是在创建 、 查询 、 更新 、 删除等操作之前 、 之后自动调用的函数 。如果任何 Hook 返回错误 , GORM 将停止后续的操作并回滚事务 。
    • 对于写操作 ( 创建 、 更新 、 删除 ) , 为了确保数据的完整性 , GORM 会将它们封装在事务内运行 。 但这会降低性能 , 你可以使用SkipDefauItTransaction 关闭默认事务 。
  • Kitex
    • 目前Windows对kitex支持不完善,建议使用WSL或者虚拟机
    • KItex 框架地址: github.com/cloudwego/k…
    • 使用 IDL 定义服务与接口
      • 如果我们要进行 RPC , 就需要知道对方的接口是什么 , 需要传什么参数 , 同时也需要知道返回值是什么样的 。 这时候 , 就需要通过 IDL 来约定双方的协议 , 就像在写代码的时候需要调用某个函数 , 我们需要知道函数签名一样 。
    • 使用 kitex -module example -service example echo.thrift 命令生成代码
    • 目前 Kitex 的服务注册与发现已经对接了主流了服务注册与发现中心 , 如 ETC D , Nacos 等 。
  • Hertz
    • 使用 Hertz 实现 , 服务监听8080 端口并注册了一个 GET方法的路由函数 。
    • Hertz提供了路由组 ( Group ) 的能力 , 用于支持路由分组的功能
    • Hertz 提供了路由组 ( Group ) 的能力 , 用于支持路由分组的功能
    • Hertz 提供了参数路由和通配路由 , 路由的优先级为 : 静态路由 > 命名路由 > 通配路由
    • Hertz 提供了 Bind 、 Validate 、 BindAndValidate 函数用于进行参数绑定和校验
    • 网络库 Netpoll
    • Json 编解码 Sonic
    • 使用 sync.Pool 复用对象协议层数据解析优化

三、实践练习例子:

  • 笔记项目是一个使用 Hertz 、Kit ex 、 Gorm 搭建出来的具备一定业务逻辑的后端 API 项目 。

四、课后个人总结:

本章有什么知识点不容易掌握?

我觉得基本上都不容易掌握

什么地方容易与其他内容混淆?

最大的问题是,讲的太简略了,而且视频清晰度奇差,代码看不清楚

五、引用参考:

  • 什么是 DSN?
    • image.png

我参考了哪些外部博客/笔记/文章?

文章中有什么地方是我参考引用了外部博客/笔记/文章的?

六、例文: