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

三件套(Gorm、Kitex、Hertz) 介绍

Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

Kitex 是字节内部的Golang 微服务 RPC 框架具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。

Hertz 是字节内部的 HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点。

Gorm(ORM框架)

基本使用:

Gorm是一个强大且经过长时间迭代的ORM框架,为开发人员提供了与数据库交互的高级抽象。它的基本使用涉及以下方面:

  1. 定义Model: 使用结构体来定义数据模型,通过注释来定义表名、主键、默认值等。
type User struct {
    ID        uint   `gorm:"primary_key"`
    Username  string
    Email     string
    CreatedAt time.Time
    UpdatedAt time.Time
}
  1. 数据库连接: 使用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()
  1. 创建数据: 使用Create方法插入数据。
user := User{Username: "john", Email: "john@example.com"}
db.Create(&user)
  1. 查询数据: 使用FirstFind等方法查询数据。
var user User
db.First(&user, "username = ?", "john") // 查询第一个满足条件的用户
var users []User
db.Find(&users, "email LIKE ?", "%example.com%") // 查询满足条件的所有用户
  1. 更新数据: 使用SaveUpdates方法更新数据。
db.Model(&user).Update("email", "new_email@example.com")
  1. 软删除: 使用Delete进行软删除。
db.Delete(&user)
  1. 事务: 使用BeginCommitRollback方法来处理事务。
tx := db.Begin()
// 执行操作
tx.Commit() // 提交事务
tx.Rollback() // 回滚事务
  1. 钩子函数: 通过在模型上定义方法来实现钩子函数,用于在操作前后执行特定逻辑。
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
    // 在保存之前执行的逻辑
    return
}

性能提升:

为了提高性能,可以采取以下方法:

  1. 关闭默认事务: 对于写操作,关闭默认事务可以提高性能。
db := gorm.Open("mysql", "...")
db = db.Session(&gorm.Session{SkipDefaultTransaction: true})
  1. 预编译语句: 使用PrepareStmt缓存预编译语句,提高后续调用的速度。
db = db.Session(&gorm.Session{PrepareStmt: true})

Kitex(微服务 RPC 框架)

基本使用:

Kitex是用于构建高性能微服务的RPC框架,以下是它的基本使用方法:

  1. 定义服务: 使用Kitex定义RPC服务,定义服务接口和方法。
type Calculator interface {
    Add(ctx context.Context, a, b int) (int, error)
}
  1. 实现服务: 实现定义的服务接口。
type CalculatorImpl struct{}

func (c *CalculatorImpl) Add(ctx context.Context, a, b int) (int, error) {
    return a + b, nil
}
  1. 启动服务: 使用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框架,以下是它的基本用法:

  1. 创建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")
}
  1. 路由注册: 使用GETPOSTPUTDELETEANY等方法注册路由。
r.GET("/users/:id", getUserHandler)
r.POST("/users", createUserHandler)
  1. 参数绑定与校验: 使用BindValidateBindAndValidate函数进行参数绑定和校验。
var user User
ctx.Bind(&user)
err := ctx.Validate(&user)
  1. 中间件: 使用中间件增强HTTP处理流程。
r.Use(loggingMiddleware)
r.GET("/users/:id", getUserHandler)
  1. HTTP Client: 使用Hertz的HTTP Client发送HTTP请求。
resp, err := hertz.Get("https://api.example.com/users/1")
if err != nil {
    // 处理错误
}
defer resp.Body.Close()

性能优化:

Hertz通过一些性能优化方法提高性能:

  1. 使用网络库Netpoll处理高并发网络请求。
  2. 使用Json编解码Sonic优化序列化和反序列化。
  3. 使用sync.Pool复用对象,减少内存分配。

实战案例介绍

image.png

posted @ 2023-08-08 00:00  LucianaiB  阅读(125)  评论(0)    收藏  举报  来源