Go 框架三件套详解(Web/RPC/ORM)| 青训营
三件套(Gorm、Kitex、Hertz) 介绍
Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。
Kitex 是字节内部的Golang 微服务 RPC 框架具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。
Hertz 是字节内部的 HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点。
Gorm(ORM框架)
基本使用:
Gorm是一个强大且经过长时间迭代的ORM框架,为开发人员提供了与数据库交互的高级抽象。它的基本使用涉及以下方面:
- 定义Model: 使用结构体来定义数据模型,通过注释来定义表名、主键、默认值等。
type User struct {
ID uint `gorm:"primary_key"`
Username string
Email string
CreatedAt time.Time
UpdatedAt time.Time
}
- 数据库连接: 使用
gorm.Open方法连接数据库。
db, err := gorm.Open("mysql", "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
// 处理错误
}
defer db.Close()
- 创建数据: 使用
Create方法插入数据。
user := User{Username: "john", Email: "john@example.com"}
db.Create(&user)
- 查询数据: 使用
First、Find等方法查询数据。
var user User
db.First(&user, "username = ?", "john") // 查询第一个满足条件的用户
var users []User
db.Find(&users, "email LIKE ?", "%example.com%") // 查询满足条件的所有用户
- 更新数据: 使用
Save或Updates方法更新数据。
db.Model(&user).Update("email", "new_email@example.com")
- 软删除: 使用
Delete进行软删除。
db.Delete(&user)
- 事务: 使用
Begin、Commit和Rollback方法来处理事务。
tx := db.Begin()
// 执行操作
tx.Commit() // 提交事务
tx.Rollback() // 回滚事务
- 钩子函数: 通过在模型上定义方法来实现钩子函数,用于在操作前后执行特定逻辑。
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
// 在保存之前执行的逻辑
return
}
性能提升:
为了提高性能,可以采取以下方法:
- 关闭默认事务: 对于写操作,关闭默认事务可以提高性能。
db := gorm.Open("mysql", "...")
db = db.Session(&gorm.Session{SkipDefaultTransaction: true})
- 预编译语句: 使用
PrepareStmt缓存预编译语句,提高后续调用的速度。
db = db.Session(&gorm.Session{PrepareStmt: true})
Kitex(微服务 RPC 框架)
基本使用:
Kitex是用于构建高性能微服务的RPC框架,以下是它的基本使用方法:
- 定义服务: 使用Kitex定义RPC服务,定义服务接口和方法。
type Calculator interface {
Add(ctx context.Context, a, b int) (int, error)
}
- 实现服务: 实现定义的服务接口。
type CalculatorImpl struct{}
func (c *CalculatorImpl) Add(ctx context.Context, a, b int) (int, error) {
return a + b, nil
}
- 启动服务: 使用
kitex.NewServer创建服务器并启动。
calculator := &CalculatorImpl{}
server := kitex.NewServer(kitex.ServerConfig{})
err := server.RegisterService(calculator)
if err != nil {
// 处理错误
}
err = server.Run()
if err != nil {
// 处理错误
}
defer server.Stop()
Hertz(HTTP 框架)
基本使用:
Hertz是一个高性能的HTTP框架,以下是它的基本用法:
- 创建HTTP服务器: 使用Hertz创建HTTP服务器,注册路由和处理函数。
func main() {
r := hertz.NewRouter()
r.GET("/", func(ctx *hertz.Context) {
ctx.JSON(http.StatusOK, hertz.H{"message": "Hello, Hertz!"})
})
r.Run(":8080")
}
- 路由注册: 使用
GET、POST、PUT、DELETE、ANY等方法注册路由。
r.GET("/users/:id", getUserHandler)
r.POST("/users", createUserHandler)
- 参数绑定与校验: 使用
Bind、Validate、BindAndValidate函数进行参数绑定和校验。
var user User
ctx.Bind(&user)
err := ctx.Validate(&user)
- 中间件: 使用中间件增强HTTP处理流程。
r.Use(loggingMiddleware)
r.GET("/users/:id", getUserHandler)
- HTTP Client: 使用Hertz的HTTP Client发送HTTP请求。
resp, err := hertz.Get("https://api.example.com/users/1")
if err != nil {
// 处理错误
}
defer resp.Body.Close()
性能优化:
Hertz通过一些性能优化方法提高性能:
- 使用网络库Netpoll处理高并发网络请求。
- 使用Json编解码Sonic优化序列化和反序列化。
- 使用sync.Pool复用对象,减少内存分配。
浙公网安备 33010602011771号