Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解
简介
Go语言是一个既快速又性能卓越的开源编程语言。Gorm、Kitex和Hertz是三个基于Go语言的框架,都在不同的领域内有着广泛的应用。下面我们将从基本用法和常见API的讲解来介绍这三个框架。
Gorm
Gorm是一个简单而强大的ORM框架,可以处理从MySQL到PostgreSQL的关系数据库操作。以下是Gorm的基本用法。
安装
使用Gorm的第一步是安装它。可以使用以下命令安装最新版本的Gorm。
go get -u gorm.io/gorm
连接数据库
下面是一个示例,演示如何使用Gorm连接MySQL数据库。
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
db, err := gorm.Open(mysql.Open("user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic(err)
}
defer db.Close()
}
定义模型
接下来,我们为Gorm定义一个模型。一个模型在Gorm中表示一个数据库表。
type User struct {
gorm.Model
Name string
Email string
Age uint8
Birthday time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
CRUD操作
下面是一些Gorm的CRUD操作的基本用法:
创建一条记录
db.Create(&User{Name: "张三", Email: "zhangsan@xxx.com"})
更新一条记录
db.Model(&User{}).Where("name = ?", "张三").Update("name", "李四")
删除一条记录
db.Where("name = ?", "李四").Delete(&User{})
查询一条记录
var user User
db.First(&user, "name = ?", "张三")
查询多条记录
var users []User
db.Where("name like ?", "%三%").Find(&users)
Kitex
Kitex是一种高性能、易于使用的微服务框架,具有协程管理、协议照抄、泛化调用、任务显式/隐藏等特性。以下是Kitex的基本用法。
安装
Kitex可以使用以下命令来安装:
go get -u github.com/cloudwego/kitex
客户端
定义接口
首先,我们需要定义一个Kitex接口,例如:
type Greeter interface {
Hello(context.Context, *HelloRequest) (*HelloReply, error)
}
type HelloRequest struct {
Name string
}
type HelloReply struct {
Message string
}
实现服务
然后,我们需要实现Kitex服务,例如:
type GreeterHandler struct {}
func (h *GreeterHandler) Hello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
return &HelloReply{Message: fmt.Sprintf("Hello, %s!", req.Name)}, nil
}
创建服务器
最后,我们需要创建一个Kitex服务器,例如:
import (
"context"
"github.com/cloudwego/kitex/pkg/klog"
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
"github.com/cloudwego/kitex/server/http"
)
func main() {
cfg := server.SvrConfig{
Proto: kitex_proto.ProtoSerilizerType(kitex_proto.SerializeType(1)),
ListenOn: "0.0.0.0:8080",
ServerType: "http",
}
svr := http.NewServer(&cfg)
kitex.RegisterGreetorServer(svr, &GreeterHandler{})
if err := svr.Run(); err != nil {
klog.Errorf("run server failed, err:%+v.", err)
}
}
客户端
创建客户端
在Kitex中,创建客户端非常简单。只需实例化一个客户端实现。
import (
"context"
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/pkg/klog"
)
func main() {
cfg := client.NewClientConfig(client.WithRemote("localhost:8080"), client.WithClientThreshold(500))
client := client.NewClient(cfg)
if err := client.Init(); err != nil {
klog.Errorf("init client failed, err=%+v.", err)
return
}
defer client.Close()
}
调用服务
使用Kitex客户端调用服务也很简单。只需要使用生成的客户端接口调用函数。
func CallGreeterService(ctx context.Context, name string) (string, error) {
req := &HelloRequest{Name: name}
reply := &HelloReply{}
greeterClient := kitex.NewGreeterClient(client)
if err := greeterClient.Hello(ctx, req, reply); err != nil {
return "", err
}
return reply.Message, nil
}
Hertz
Hertz是一个轻量级的WEB框架,提供了快速构建中小型项目的能力。以下是Hertz的基本用法。
安装
可以使用以下命令安装最新版本的Hertz。
go get -u github.com/cosiner/hertz
创建路由
在Hertz中,我们可以使用Router函数创建路由。
func main() {
router := hertz.Router()
router.GET("/", func(ctx *hertz.Context) {
ctx.String("Hello World!")
})
router.Run(":8080")
}
获取参数
从URL中获取参数在Hertz中非常简单。
func main() {
router := hertz.Router()
router.GET("/users/:name", func(ctx *hertz.Context) string {
return "Hello, " + ctx.Param("name")
})
router.Run(":8080")
}
使用中间件
Hertz中的中间件可用于添加对请求和响应的处理。
func main() {
router := hertz.Router()
router.Use(func(ctx *hertz.Context) {
fmt.Println("开始处理请求")
ctx.Next()
fmt.Println("请求处理结束")
})
router.GET("/", func(ctx *hertz.Context) {
ctx.String("Hello World!")
})
router.Run(":8080")
}
示例说明
示例一:德州扑克牌库存管理
某个德州扑克牌小卖家需要一个库存管理平台,平台应该支持对库存的添加、销售和查询,以及低库存提醒。针对这个场景,我们可以使用Gorm和Hertz框架来实现此功能。
首先,我们需要定义一个牌类表的Gorm模型,用于存储牌类信息。
type Card struct {
gorm.Model
Name string
Count uint8
Price float32
}
然后,我们需要创建一个Hertz应用程序,并使用Hertz的路由和Gorm的模型添加,查询和销售牌。
func main() {
router := hertz.Router()
router.POST("/cards", func(ctx *hertz.Context) {
var card Card
if err := ctx.Bind(&card); err != nil {
ctx.String(http.StatusBadRequest, "绑定失败!")
return
}
if err := db.Create(&card).Error; err != nil {
ctx.String(http.StatusBadRequest, "创建失败!")
return
}
ctx.String(http.StatusCreated, "创建成功!")
})
router.GET("/cards", func(ctx *hertz.Context) {
var cards []Card
if err := db.Find(&cards).Error; err != nil {
ctx.String(http.StatusBadRequest, "查询失败!")
return
}
ctx.JSON(http.StatusOK, cards)
})
router.POST("/sale", func(ctx *hertz.Context) {
var saleRequest SaleRequest
if err := ctx.Bind(&saleRequest); err != nil {
ctx.String(http.StatusBadRequest, "绑定失败!")
return
}
var card Card
if err := db.Where("name = ?", saleRequest.Card).First(&card).Error; err != nil {
ctx.String(http.StatusBadRequest, "找不到牌!")
return
}
if card.Count < saleRequest.Count {
ctx.String(http.StatusBadRequest, "库存不足!")
return
}
card.Count -= saleRequest.Count
if err := db.Save(&card).Error; err != nil {
ctx.String(http.StatusBadRequest, "销售失败!")
return
}
ctx.String(http.StatusOK, "销售成功!")
})
router.Run(":8080")
}
最后,我们可以使用Gorm的Hooks机制来实现一个低库存提醒的功能,例如:
func checkLowStock(db *gorm.DB) {
var cards []Card
if err := db.Where("count <= ?", 10).Find(&cards).Error; err != nil {
return
}
for _, card := range cards {
fmt.Println(card.Name + "的库存不足!")
}
}
func main() {
db.Callback().Create().After("gorm:create").Register("hertz:checkLowStock", checkLowStock)
router.Run(":8080")
}
示例二:牌类添加和销售系统
某个扑克牌销售商需要一个库存管理系统,可以添加、销售和查询扑克牌的库存。同时,需要使用Kitex的客户端和服务器来实现多个用户之间的实时库存交流。针对这个场景,我们可以使用Gorm和Kitex框架来实现此功能。
在这个场景中,和前面一样,我们需要首先定义一个牌类表的Gorm模型,用于存储牌类信息。
type Card struct {
gorm.Model
Name string
Count uint8
Price float32
}
然后,我们需要创建一个Kitex服务来实现库存交流。
type GreeterHandler struct {}
type StockRequest struct {
Name string
}
type StockReply struct {
Count uint8
}
func (h *GreeterHandler) Stock(ctx context.Context, req *StockRequest) (*StockReply, error) {
var card Card
if err := db.Where("name = ?", req.Name).First(&card).Error; err != nil {
return nil, err
}
return &StockReply{Count: card.Count}, nil
}
func main() {
cfg := server.SvrConfig{
ServerType: "http",
ListenOn: "0.0.0.0:8081",
}
svr := http.NewServer(&cfg)
kitex.RegisterStockServer(svr, &GreeterHandler{})
if err := svr.Run(); err != nil {
klog.Errorf("run stock server failed, err:%+v.", err)
}
}
最后,我们可以在Hertz应用程序中使用作为客户端的生成的Kitex接口来添加和销售牌。
ctx := context.Background()
stockClient := kitex.NewStockClient(client)
var card Card
if err := db.Where("name = ?", request.Name).First(&card).Error; err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "找不到牌类"})
return
}
if card.Count < request.Count {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "库存不足"})
return
}
card.Count -= request.Count
if err := db.Save(&card).Error; err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "销售失败"})
return
}
if _, err := stockClient.Stock(context.Background(), &kitex.StockRequest{Name: card.Name}); err != nil {
fmt.Printf("获取库存失败:%v.\n", err)
}
ctx.String(http.StatusOK, "销售成功!")
结论
这篇文章简要介绍了Gorm、Kitex和Hertz这三个基于Go语言的框架的常用API和基本用法。这些框架都非常适合中小型项目,能够以高效的方式提供卓越的性能和开发体验。如果你是一名Golang开发人员,我们强烈建议你熟悉和尝试这些框架。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解 - Python技术站