GO框架三件套 | 青训营

82 阅读3分钟

Gorm、Kitex和Hertz是三种常用的Go框架,分别用于ORM(对象关系映射)、RPC(远程过程调用)和Web开发。下面逐个介绍它们的特点和使用方法。 一、Gorm(ORM框架)

  1. Gorm是一个功能强大的ORM框架,已经流行了10年以上,并且在字节内部被广泛使用。它具有以下特点:
  • 支持基本的CRUD操作,如创建、查询、更新和删除。
  • 使用简单的命名约定,默认将ID字段作为主键、将蛇形命名转换为表名和列名。
  • 支持多种数据库,如MySQL、SQLServer、PostgreSQL和SQLite。
  • 提供丰富的Hook功能,在进行数据库操作前后自动调用相应的函数。
  • 可以通过驱动来连接其他类型的数据库。
  1. 下面是一个使用Gorm进行数据库操作的示例代码:
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"time"
)

type Product struct {
	ID    uint   `gorm:"primaryKey"`
	Code  string `gorm:"uniqueIndex"`
	Price uint
}

func main() {
	dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})

	if err != nil {
		log.Fatalf("failed to connect to database: %v", err)
	}

	// 自动迁移表结构
	err = db.AutoMigrate(&Product{})
	if err != nil {
		log.Fatalf("failed to migrate table: %v", err)
	}

	// 创建记录
	product := &Product{
		Code:  "P001",
		Price: 100,
	}
	result := db.Create(product)
	if result.Error != nil {
		log.Fatalf("failed to create record: %v", result.Error)
	}

	fmt.Println("Created product:", product)

	// 查询单个记录
	var retrievedProduct Product
	result = db.First(&retrievedProduct, "code = ?", "P001")
	if result.Error != nil {
		log.Fatalf("failed to retrieve product: %v", result.Error)
	}

	fmt.Println("Retrieved product:", retrievedProduct)

	// 更新记录
	retrievedProduct.Price = 200
	result = db.Save(&retrievedProduct)
	if result.Error != nil {
		log.Fatalf("failed to update product: %v", result.Error)
	}

	fmt.Println("Updated product:", retrievedProduct)

	// 查询多个记录
	var products []Product
	result = db.Find(&products)
	if result.Error != nil {
		log.Fatalf("failed to retrieve products: %v", result.Error)
	}

	fmt.Println("Retrieved products:", products)

	// 删除记录
	result = db.Delete(&retrievedProduct)
	if result.Error != nil {
		log.Fatalf("failed to delete product: %v", result.Error)
	}

	fmt.Println("Deleted product:", retrievedProduct)
}

二、Kitex(RPC框架)

  1. Kitex是字节内部的Golang微服务RPC框架,具有高性能和高可扩展性的特点。它具有以下特点:
  • 支持多协议,如Thrift、gRPC和HTTP。
  • 提供了代码生成工具,可以根据IDL文件自动生成服务和客户端代码。
  • 支持中间件,可以在请求处理过程中添加各种功能。
  • 拥有丰富的扩展库,如XDS、opentelemetry和服务注册与发现扩展。
  1. 使用Kitex进行RPC开发的详细步骤可以参考Kitex的官方文档。

三、Hertz(Web框架)

  1. Hertz是字节内部的HTTP框架,结合了其他开源框架的优势,并满足字节跳动内部的需求。它具有以下特点:
  • 高易用性:提供简洁的API和路由定义方式。
  • 高性能:通过减少不必要的内存分配和优化路由匹配等方式提高性能。
  • 高扩展性:提供丰富的插件和中间件机制。
  1. 下面是一个使用Hertz实现的简单示例代码:
import (
	"context"
	"github.com/cloudwego/hertz/app"
	"github.com/cloudwego/hertz/pkg/router"
)

func main() {
	server := app.DefaultServer(app.WithHostPorts("127.0.0.1:8080"))
	r := router.NewRouter()
	r.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
		ctx.JSON(app.StatusOK, map[string]string{"ping": "pong"})
	})
	server.Handle(r)
	server.Spin()
}

以上代码创建了一个Hertz服务,监听8080端口,并注册了一个GET方法的路由函数,用于处理/ping路径的请求返回pong。

总结:

这节课我学习了了Gorm、Kitex和Hertz三个Go框架的特点和使用方法。Gorm用于ORM数据库操作,提供了方便的CRUD功能;Kitex用于RPC开发,支持多种协议和扩展;Hertz用于Web开发,具有高性能和易用性。这三个框架在字节跳动内部得到了广泛应用,并且拥有丰富的生态库和扩展。开发者可以根据项目需求选择适合的框架进行开发。