这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
本节课知识点: Go 框架三件套详解(Web/RPC/ORM)
01. Go 框架三件套
Gorm:ORM 框架
Kitex:Golang 微服务 RPC 框架
Hertz:HTTP 框架
02. 使用三件套
2.1 Gorm 基本使用
定义 gorm model:type Product struct {}
为 model 定义表名:func (p Product) TableName() string {return "Product"}
数据库基本操作
Gorm 的约定:
1、Gorm 使用名为 ID 的字段作为主键
2、使用结构体的蛇形负数作为表名,字段名的蛇形作为列名
3、使用 CreatedAt、UpdatedAt 字段作为创建、更新时间
Gorm 通过驱动连接数据库
Gorm 创建数据:
1、以不冲突为例,创建一条数据:
p := &Product{}
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&p)
2、通过 default 标签为字段定义默认值
Gorm 查询数据:
1、使用 First,查询不到数据会返回 ErrRecordNotFound
2、使用 Find 查询多条数据,查询不到不会返回错误
3、使用结构体作为查询条件,Gorm 只会查询非零值字段
Gorm 更新数据:
使用结构体更新,只会更新非零值,可以使用 Map 更新或使用 Select 选择字段
// SQL 表达式更新
db.Model(&User{ID: 111}).Update("age", gorm.Expr("age * ? + ?", 2, 100))
Gorm 删除数据:
1、物理删除:delete
2、软删除:gorm.DeletedAt 实现软删,不能通过正常查询方法找到,使用 Unscoped 可以查询到被软删的数据
Gorm 事务:Gorm 提供了 Begin、Commit、Rollback 方法用于使用事务
tx := db.Begin() // 开始事务,从这里开始,使用' tx '而不是' db '
(推荐使用)Gorm提供了 Transaction 方法用于自动提交事务,避免漏写 Commit、Rollback
Gorm Hook:Gorm 提供了 CURD 的 Hook 能力
Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数,如果任何 Hook 返回错误,Gorm将停止后续的操作并回滚事务
Gorm 性能提高:
1、SkipDefaultTransaction 关闭默认事务
2、使用 PrepareStmt 缓存预编译语句提高调用速度
Gorm 生态:
扩展生态,常用扩展
2.2 Kitex 基本使用
安装 Kitex 代码生成工具
使用 IDL 定义服务与接口: 进行 RPC,需要知道对方接口是什么,传什么参数,返回什么值。需要通过 IDL 来约定双方的协议
Kitex 生成代码:
Kitex -model example -service example echo.thrift
Kitex 基本使用:
服务默认监听 8888 端口
Kitex Client 发起请求
Kitex 服务注册与发现: ETCD,Nacos
Kitex 生态
2.3 Hertz 基本使用
使用 Hertz实现,服务监听8080端口并注册一个GET方法路由函数
func main() {
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"ping": "pong"})
})
h.Spin()
}
Hertz 路由:
GET、POST、PUT、DELETE、ANY注册路由
参数路由、通配路由(范围比较大)
路由优先级:静态路由 > 命名路由 > 通配路由
Hertz 参数绑定和校验:Bind、Validate、BindAndValidate
Hertz 中间件:客户端中间件、服务端中间件
Hertz Client: 用于发送HTTP请求
Hertz 代码生成工具
Hertz 性能: 网络库 Netpoll;Json 编解码 Sonic;使用 sync.Pool 复用对象协议层数据解析优化
03. 项目案例:笔记项目
课后个人总结:
今天学习了Go语言的三个项目框架:Gorm、Kitex和Hertz,了解了Gorm、Kitex和Hertz的基本使用方法,特别在Gorm连接数据库进行操作上,通过今天这节录播课,我对这三个框架有了初步理解,但是我在如何把这些框架运用在项目上还是没有头绪,第三部分的笔记项目我听得也不是很懂,我应该去看这个项目的示例代码,加深理解,学会应用。