一、三件套简介
1.1 Gorm
Gorm 是一个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。
1.2 Kitex
Kitex 是字节内部的Golang微服务RPC框架,具有高性能、抢可扩展的主要特点,支持多协议并且有用丰富的开源扩展。
1.3 Hertz
Hertz是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高可拓展性特点。
二、三件套的使用
2.1 Gorm
2.1.1 Gorm 的基本使用
- Gorm 的约定(默认)
- Gorm 使用名为 ID 的字段作为主键
- 使用结构体的实行负数作为表名
- 字段名的蛇形作为列名
- 使用 CreatedAt、UpdatedAt 字段作为创建、更新时间
2.1.2 Gorm支持的数据库
Gorm 目前支持 MySQL、SqlServer、PostgreSQL、SQLite。
GORM通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动
2.1.3 Gorm 创建数据
如何使用 Upsert? 使用 clause.OnConflict 处理数据冲突
如何使用默认值?
通过使用default标签为字段定义默认值
2.1.4 Gorm 查询数据
First 的使用踩坑
使用First时,需要注意查询不到数据会返回 ErrRecordNotFound。
使用Find查询多条数据,查询不到数据不会返回错误。
使用结构体作为查询条件
当使用结构体作为条件查询时,Gorm 只会查询非零值字段。这意味着如果您的字段值为0、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。
2.1.5 Gorm 更新数据
使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。
2.1.6 Gorm 删除数据
物理删除
软删除
- GORM提供了gorm.DeletedAt用于帮助用户实现软删
- 拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除。但GORM会将DeletedAt置为当前时间,并且你不能再通过正常的查询方法找到该记录。
- 使用Unscoped可以查询到被软删的数据
2.1.7 Gorm 事务
Gorm 提供了Begin、Commit、 Rollback 方法用于使用事务
Gorm提供了Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollbcak
2.1.8 Gorm Hook
- GORM在提供了CURD的Hook能力。
- Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
- 如果任何Hook返回错误,GORM将停止后续的操作并回滚事务。
2.1.9 Gorm 性能提高
对于写操作(创建、更新、删除) ,为了确保数据的完整性,GORM会将它们封装在事务内运行,但这会降低性能,你可以使用SkipDefaultTransaction关闭默认事务。
使用PrepareStmt缓存预编译语句可以提高后续调用的速度,本机测试提高大约35 %左右。
2.2 Kitex
2.2.1 定义IDL
使用IDL定义服务与接口
如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。
2.2.2 Kitex 生成代码
使用kitex -module example -service example echo.thrift命令生成代码
build.sh :构建脚本
kitex gen :IDL内容相关的生成代码,主要是基础的Server/Client代码。
main.go程序入口
handler.go用户在该文件里实现IDL service定义的方法
2.2.3 Kitex 基本使用
服务默认监听8888端口
2.2.4 Kitex Client 发起请求
创建Client
发起请求
2.2.5 Kitex 服务注册与发现
目前Kitex的服务注册与发现已经对接了主流了服务注册与发现中心,如ETCD,Nacos等。
2.3 Hertz
2.3.1 Hertz 的基本使用
使用Hertz实现,服务监听8080端口并注册了一个GET方法的路由函数。
2.3.2 Hertz 路由
Hertz提供了GET、POST、PUT、DELETE、ANY 等方法用于注册路由。
Hertz提供了路由组( Group)的能力,用于支持路由分组的功能
Hertz提供了参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由
2.3.3 参数绑定
Hertz提供了Bind、Validate、BindAndValidate 函数用于进行参数绑定和校验。
2.3.4 Hertz 中间件
Hertz的中间件主要分为客户端中间件与服务端中间件,如下展示一个服务端中间件。
2.3.5 Hertz Client
Hertz提供了HTTP Client用于帮助用户发送HTTP请求
三、课后心得
今天这节课讲了Go 框架三件套:Gorm、Kitex、Hertz。老师讲得很详细,从不同的知识点来具体的讲解这三个框架,由浅入深。这节课过后,对Go 框架三件套也有了基本的了解。
四、参考引用
- 字节跳动青训营内部课