这是我参与「第五届青训营 」笔记创作活动的第6天
只不过是字节给我的任务罢了
Go 框架三件套详解(Web/RPC/ORM)
Gorm
-
创建数据
-
约定
-
使用名为ID的字段作为主键
-
使用结构体的蛇形负数作为表名
-
字段名的蛇形作为列名
-
使用CreatedAt、UpdateAt字段作为创建更新时间
-
Gorm Tag
-
可以使用Gorm Tag对数据库的主键、字段名、默认值等参数进行设置Gorm官方文档相关说明
个人理解:链式调用就是调用了对象的某个方法后,该方法的返回值是这个对象的引用,因此开发者还可以通过这个返回值调用该对象的方法,参考: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是在CRUD操作之前、之后自动调用的函数:
BeforeSave
,BeforeUpdate
、AfterSave
、AfterUpdate
- 添加了Hook时会自动添加默认事务,如果任何Hook返回错误,Gorm将会停止后续操作并回滚事务
- Hook是在CRUD操作之前、之后自动调用的函数:
-
性能提高
-
Gorm也有丰富的扩展生态
Kitex
Kitex 是一个 RPC 框架,提供两大功能:
-
Serialization 序列化
-
Transport 传输
Kitex 框架及命令行工具,默认支持
thrift
和proto3
两种 IDL,对应的 Kitex 支持thrift
和protobuf
两种序列化协议。 传输上 Kitex 使用扩展的thrift
作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。IDL 全称是 Interface Definition Language,接口定义语言。——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服务发现扩展,支持与主流注册中心对接
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…