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

82 阅读3分钟

前言

这是我参与【第五届青训营】伴学笔记创作活动第五天,今日学习的重点内容为go的三件套,及三件套的使用,及实战案例介绍,go的三件套对开发有很重要的作用,三件套是Gorm,Kitex,Hertz。

正文

三件套的使用

  1. Gorm的基础使用:

微信图片_20230120190815.jpg

  • GORM支持的数据库:MySQL,SQLSever,PostgreSQL,SQLite;GORM通过驱动来链接数据库,如果需要其他连接类型的数据库,可以复用/自行开发驱动

  • GORM创建数据:GORM是个链式调用

微信图片_20230120190805.jpg

  • GORM的查询数据:

微信图片_20230120190610.jpg

  • GORM更新数据:使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或者Select选择字段

微信图片_20230120191504.jpg

  • GORM删除数据:GORM提供了gorm.DeletedAt帮助用户实现软删,拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除,但GORM会将DeleteAt置为当前时间,并且你不能通过正常的查询方式找到该记录。使用Unscoped可以查询到被软删的数据。
  • GORM事务:GORM提供了begin,commit,reollback方法用法使用事务

问题:忘写Rollback和commit导致数据库链接泄露,GORM提供Tansaction方法用于自动提交事务,避免用户漏写Commit,rollback

微信图片_20230120192827.jpg

  • GORM hook:GORM提供了GURD的Hook的能力,Hook是在创建,查询,更新,删除等操作之前,之后自动调用的函数,如何返回Hook返回错误,GORM将停止后续操作并回滚事务
  • GORM性能提高:对于写操作(创建更新删除)为了保证数据的完整性,GORM会将它们封装在事务内运行,但会降低性能,可以用SkipDefaultTransaction关闭默认事务,使用PrepareStmt缓存预编译语句可以提升后续调用的速度。
  • GORM的生态:gorm代码生成工具;gorm分片库方案;gorm手动索引;gorm乐观锁;gorm读写分离;gorm OpenTelemetry扩展
  1. Kitex:目前对windows的支持不完整,如果本地开发环境是Windows使用虚拟机或WSL2;
  • 定义IDL
namespace go api  //命名空间
struct Request{
1string message
}
struct Response{
1string message
}
service Echo{
Response echo(1:Request req)
}
  • kitex生成代码:使用kitex-module-service example echo.thrift命令生成代码 build.sh:构建脚本;kitex_gen:IDL内容相关的生成代码,主要是基础的Server/Cilent代码;main.go:程序入口;handler.go:用户在该文件里实现IDL service定义的方法
  • Kitex基本使用:服务器默认监听8888端口
package main
import(
“context”
“example/kitex_gen/api”
)
type EchoImpL struct{}
func(s* EchoImpLEcho(ctx context.Context,req*api.Resonse,err error){
return
}
  • kitex client发起请求:

微信图片_20230120195954.jpg

  • kitex服务注册与发现:目前kitrx的服务注册与发现已经对接了主流的服务注册与发现中心
  • kitex生态:XDS扩展;opentelemetry扩展;ETCD服务注册与发展扩展;Nacos服务注册与发展扩展;Zookeeper服务注册与发展;palaris扩展;丰富的实例代码与业务Demo

3.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(server.WithHosPorts(hp:"127.0.0.1:8080"))
h.GET(relativePath:"ping",func(c context.Context,ctx*app.RequesContext){
ctx.JSON(consts.StatusOK,utils.H{"ping":"pong"})
})
h.Spin()
}

  • Hertz路由:提供GET,POST,PUT,DELETE,ANY等方法注册路由;提供了路由组(Group)的能力,用于支持路由分组的能力;提供了参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由
  • Hertz参数绑定:提供了Bind,Vaildate,BindAndValidate函数用于进行参数绑定和校验。
  • Hertz中间件:主要分为客户端中间件与服务端中间件
  • Hertz提供了HTTP Client用于帮助用户发送HTTP请求
  • Hertz代码生成工具:提供代码生成工具Hz,通过定义IDL文件即可生成对应的基础服务代码

个人总结

本节课主要学习了go框架的三件套,主要作用是帮助我们更好的操作数据库,使项目可以更安全可靠。