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

162 阅读4分钟

这是我参与「第五届青训营 」笔记创作活动的第6天

只不过是字节给我的任务罢了

Go 框架三件套详解(Web/RPC/ORM)

Gorm

Gorm官方文档

  • 创建数据

    • 约定

      • 使用名为ID的字段作为主键

      • 使用结构体的蛇形负数作为表名

      • 字段名的蛇形作为列名

      • 使用CreatedAt、UpdateAt字段作为创建更新时间

      • Gorm Tag

        个人理解:链式调用就是调用了对象的某个方法后,该方法的返回值是这个对象的引用,因此开发者还可以通过这个返回值调用该对象的方法,参考:GO]小技巧,如何实现一个链式操作

    • Upsert

      • 使用clause.OnConflict处理数据冲突
      • db.Create()db.Update()等都是finish API,调用后就直接执行了,再添加.Where()条件是不生效的
  • `查询数据

    • db.First()获取第一条数据,获取不到返回ErrRecordNotFound

    • 使用db.Find()查询多条数据,查询不到时,不会返回错误

    • 结构体作为查询条件时,只会查询非零字段,如果字段值为零值,该字段不会被用于构建查询条件。

    • 使用Map构造查询条件

  • 更新数据

    • 使用db.Update()更新数据,和db.Model()搭配使用
    • 使用Struct更新时,可以使用Map更新或db.Select()选择字段
    • 使用db.Updates()更新多条数据
    • 可以使用gorm.Expr()更新表达式
  • 删除数据

    • 使用db.Delete()物理删除
    • 使用db.DeleteAt()软删,Gorm会把DeleteAt设置为当前时间,将不能通过正常查询方法查找该记录
    • 使用db.Unscoped()找到被软删的数据
  • 事务

    • 使用db.Begin()开始事务,最好不要用这个进行链式调用,因为要固化sql连接
    • db.Rollback()回滚事务
    • db.Commit()提交事务
    • db.Transaction()自动回滚/提交事务
  • HOOK

    • Hook是在CRUD操作之前、之后自动调用的函数:BeforeSaveBeforeUpdateAfterSaveAfterUpdate
    • 添加了Hook时会自动添加默认事务,如果任何Hook返回错误,Gorm将会停止后续操作并回滚事务
  • 性能提高

    • 对于写操作,为确保数据完整性,gorm会把他们封装在事务中进行,但这会降低性能,可以使用SkipDefaultTransaction跳过默认事务
    • 使用PrepareStmt缓存预编译语句,可以提高后续调用速度,本机测试提高约35%左右
  • Gorm也有丰富的扩展生态

Kitex

Kitex 是一个 RPC 框架,提供两大功能:

  • Serialization 序列化

  • Transport 传输

Kitex 框架及命令行工具,默认支持 thriftproto3 两种 IDL,对应的 Kitex 支持 thriftprotobuf 两种序列化协议。 传输上 Kitex 使用扩展的 thrift 作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。IDL 全称是 Interface Definition Language,接口定义语言。——Kitex基础教程

相关链接

Thrift IDL 语法

proto3 语法

快速体验Kitex

使用kitex -module example -service example hello.thrift生成服务端代码

  • 第一个example是指定的module
  • 第二个example是指定到service
  • hello.thrift是IDL(接口描述语言)文件
  • --module选项可省略(当前目录在 $GOPATH/src/下时)
├── build.sh
├── client
│   └── main.go
├── conf
│   └── kitex.yml
├── handler.go
├── hello.thrift
├── kitex_gen
│   └── api
│       ├── hello
│       │   ├── client.go
│       │   ├── hello.go
│       │   ├── invoker.go
│       │   └── server.go
│       ├── hello.go
│       ├── k-consts.go
│       └── k-hello.go
├── main.go
└── script
    ├── bootstrap.sh
    └── settings.py

  • build.sh用于构建脚本,脚本可以将代码编译为二进制可执行文件

  • kitex_gen/:IDL相关内容代码,主要是基础的Server/Client代码

  • main.go:程序入口

  • handler.go:根据IDL生成的方法会添加到这个文件中

  • Kitex服务默认监听8888端口

  • 支持ETCD服务发现扩展,支持与主流注册中心对接

  • 支持丰富扩展www.cloudwego.io/zh/docs/kit…

Hertz

  • Hertz是一个微服务HTTP框架,提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由,也支持路由分组的功能,提供了参数路由和通配路由,优先级为静态路由>命名路由>通配路由

  • 提供了Bind、Validate、BindAnd、Validate函数用于参数绑定和校验

  • Hertz支持中间件,分为服务端中间件和客户端中间件,使用.Use()注册,注册在Hertz对象则是全局中间件,也可以注册在路由组上

  • 提供了HTTP Client用于发送HTTP请求(GET、POST)

  • 提供代码生成工具hz,通过定义IDL生成对应的基本服务/客户端代码

  • 性能

    • 使用Netpoll库,但不支持https的tls
    • JSON编解码Sonic
    • 使用sys.Pool复用对象协议层数据解析优化
  • 支持丰富扩展github.com/cloudwego/h…

参考

GORM官方文档

CloudWeGo文档