Go框架三件套详解|青训营笔记

134 阅读2分钟

这是我参与【第五届青训营】伴学笔记创作活动的第5天,

三件套(Gorm、Kitex、Hertz)

Gorm 是一个功能强大的ORM框架

Kitex是Golang微服务RPC框架

Hertz是字节内部的HTTP框架

基本使用

Gorm的基本使用

//定义gorm model,对应数据库中的一张表
type Product struct{
    Code string
    Price uint
}
//为model定义表名,实现一个接口
func(p Product) TableName() string{
    return "product"     //返回表名
}
//连接数据库
func main(){
    db,err:=gorm.Open(
        mysql.Open(dsn),
        &gorm.Config{})
    if err!=nil{
        panic("failed to connect database")
    }
    //创建数据
    db.Create(&Product{Code:"111",Price:100})
    //查询数据,First只能查询一条数据
    var product Product
    db.First(&product,value)
    db.First(&product,"code=?","111")
    //更新数据
    db.Model(&product).Update("Price",200)
    //删除数据
    db.Delete(&product,value)
}

Grom的约定:使用ID的字段作为主键,使用CreatedAt、UpdatedAt字段作为创建、更新时间。

Gorm创建数据

使用clause.OnConflict处理数据冲突

import "gorm.io/gorm/clause"

// 不处理冲突
DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&user)

在查询是使用First时,查询不到的时候会返回ErrRecordNotFount,使用Find查询多条数据,查询不到时不会返回错误。

在使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或者使用Select选择字段。

gorm.DeletedAt用于帮助用户实现软删除,记录不会被真正删除。

Gorm提供了Begin、Commit、Rollback方法用于使用事务,用于一致性比较强的地方,Gorm也提供了Tansaction方法用于自动提交事务。

Kitex的基本使用

Kitex目前对Windows的支持不完善,可以使用虚拟机或WSL2。

使用IDL定义服务和接口,进行RPC时需要知道对方的接口是什么,传什么参数,以及返回的参数是什么样的,需要IDL来约定双方的协议。

namespace go api   //go语言命名空间
struct Request{
  1:string message
}
struct Response{
  1:string message
}
service Echo{
    Response echo(1:Request req)
}
//生成代码命令
kitex -module example -service example echo.thrift

build.sh:构建脚本

handler.go: IDL实现的方法

Kitex默认监听8888端口。

Hertz基本使用

使用Hertz实现,服务监听8080端口并注册一个GET方法的路由函数。

package main

import (
    "context"

    "github.com/cloudwego/hertz/pkg/app"
    "github.com/cloudwego/hertz/pkg/app/server"
    "github.com/cloudwego/hertz/pkg/common/utils"
    "github.com/cloudwego/hertz/pkg/protocol/consts"
)

func main() {
    h := server.Default()

    h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
            ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
    })

    h.Spin()
}

Hertz提供了GET、POST、PUT、DELETE、ANY登方法用于注册路由;提供了路由组的能力,用于支持路由分组的功能;提供了参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由。

Hertz提供了代码生成工具Hz通过定义IDL文件即可生成对应的基础服务代码。

实战案例介绍

笔记项目是一个使用Hertz、Kitex、Gorm搭建出来的具备一定业务逻辑的后端API项目。

服务名称服务介绍传输协议主要技术栈
demoapiAPI服务HTTPGorm/Kitex/Hertz
demouser用户数据管理ProtobufGorm/Kitex
demonote笔记数据管理ThriftGorm/Kitex