go常用框架 | 青训营笔记

128 阅读4分钟

go常用框架 | 青训营笔记

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

Web

官方文档

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

连接到数据库

连接MySQL为例

Gorm的约定

  • 使用名为ID的字段作为主键
  • 使用结构体的蛇形负数作为表名
  • 字段名的蛇形作为列名
  • 使用CreateAt、UpdatedAt字段作为创建、更新时间

创建数据

查询数据

First的使用踩坑:

  1. 使用First时,需要注意查询不到数据会返回ErrRecordNotFound。
  2. 使用Find查询多条数据,查询不到数据不会返回错误。

使用结构体作为查询条件:

  1. 当使用结构体作为条件查询是,GORM只会查询非零字段。这意味着如果您的字段值为0、”、false或其他零值,该字段不会被用于构建查询条件。此时应当使用Map来构建查询条件。

更新数据

Updates 方法支持 structmap[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段

删除数据

物理删除

软删除

如果您的模型包含了一个 gorm.deletedat 字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力!

拥有软删除能力的模型调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过正常的查询方法找到该记录。

事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。

Hook钩子

Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。

如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。

钩子方法的函数签名应该是 func(*gorm.DB) error

性能提高

对于写操作(创建、更新、删除),为了确保数据的完整性,GORM会将他们封装在事务内部进行,但这会降低性能。可以使用SkipDefaultTransaction关闭默认事务。

使用PrepareStmt缓存预编译语句可以提高后续调用的速度。

 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
   SkipDefaultTransaction: true,
     PrepareStme: true
 },)
 ​

生态

Rpc

官方文档

Kitex对Windows的支持不完善,得用WSL2或虚拟机。

安装代码生成工具:

go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

go install github.com/cloudwego/thriftgo@latest

然后输入kitex -version确认

定义IDL

如果要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么。这时候,就需要IDL

Thrift

Proto3

生成代码

kitex -module example -service example echo.thrift

  • build.sh,构建脚本
  • kitex_gan,IDL相关
  • main.go,程序入口
  • handler.go,用户在改文件里实现IDL service定义的方法、

基本使用

服务默认监听8888端口。

Client 发起请求

创建Client

发起请求

服务注册与发现

目前Kitex的服务注册与发现已经对接了主流的服务注册与发现中心,如ETCD,Nacos等。

链接

生态

ORM

Hertz

使用Hertz实现,服务监听8080端口并注册了一个GET方法的路由函数

快速配置

Hertz路由

提供了GET,POST,PUT,DELETE,ANY等方法用于注册路由。

Hertz 提供了路由组 ( Group ) 的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。

Hertz提供了参数路由和通配路由,优先级从高到低为静态路由、明明路由、通配路由。

链接

Hertz参数绑定

Hertz提供了Bind、Validate、BindAndValidate函数用于参数绑定和校验

链接

Hertz中间件

Hertz的中间件主要分为客户端中间件与服务端中间件。

链接

Hertz Client

Hertz提供了HTTP Client用于帮助用户发送HTTP请求

github.com/cloudwego/h…

Hertz代码生成工具

Hertz提供了代码生成工具Hz,通过定义IDL文件即可生成对应的基础服务代码。

链接

Hertz性能

  1. 网络库Netpool
  2. Json编解码Sonic
  3. 使用sync.Pool复用对象协议层数据解析优化

Hertz生态

实战案例介绍

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

链接