这是我参与【第五届青训营】伴学笔记创作活动的第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项目。
| 服务名称 | 服务介绍 | 传输协议 | 主要技术栈 |
|---|---|---|---|
| demoapi | API服务 | HTTP | Gorm/Kitex/Hertz |
| demouser | 用户数据管理 | Protobuf | Gorm/Kitex |
| demonote | 笔记数据管理 | Thrift | Gorm/Kitex |