这是我参与「第五届青训营」伴学笔记创作活动的第 6 天
Grom的基础使用
-
连接数据库
-
结构体是gorm model,对应数据库的一张表;字段对应表中的字段;
-
gorm.Open( )中,第一个参数连接数据库,第二个参数grom.Config{ }可以传递自定义配置。这样初始化了一个数据库的连接,可以做数据库的基本操作。
-
创建数据 db.Creat( ),可以创建一条数据或多条数据。创建一条数据时传递的是一个对象,结构体;创建多条数据是切片。
-
-
查询数据
-
先声明结构体
-
db.First( ),查询一条数据,参数1为已声明结构体指针,grom需要把查询的字段反写回结构体中。参数2为条件,传递整型的话,默认用整形主键查找。
-
或着,参数2 传递查询条件
db.First(&product,1) //根据整形主键查找 db.First(&product,"code=?","D42") //查找code字段值为D42的记录
-
-
更新数据
db.Model(&product).Update("Price",200) //更新多个字段 // 使用结构体仅更新非零值字段 db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) //更新零值,使用map db.Model(&product).Updates(map[string]interface{}{"Price": 200, " -
删除数据
//条件可以传整形,也可以传条件表达式 db.Delete(&product, 1) -
Grom的约定(默认)
-
Grom使用名为ID的字段作为主键,结构体中定义ID字段的话;
-
使用结构体的蛇形负数作为表名,如果没有实现TableName方法的话;
-
使用字段名的蛇形作为列名;
-
使用CreatedAt、UpdateAt字段作为创建、更新时间
-
-
Grom事务
-
一致性操作比较强时使用事务,Grom提供Begin、Commit、Rollback方法用于使用事务。
tx:=db.Begin() //开启事务,固化连接并执行开事务的sql语句 //在事务中执行一些 db 操作,应该使用 'tx' 而不是 'db' if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { tx.Rollback() //遇到错误回滚事务 return err } tx.Commit() //提交事务 -
Transaction方法用于自动提交事务,避免用户漏写Commit,Rollback。
if err=db.Transaction(func(tx *gorm.DB) error { if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { // 返回任何错误都会回滚事务 return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { return err } // 返回 nil 提交事务 return nil });err!=nil{ return }
-
-
Grom性能提高
-
禁用默认事务 ,对于写操作(创建、更新、删除),为了确保数据的完整性,GORM 会将它们封装在事务内运行。但这会降低性能,可以使用SkipDefaultTransaction关闭默认事务。
-
缓存预编译语句 ,可以提高后续调用的速度
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ SkipDefaultTransaction: true, //关闭默认事务 PrepareStmt: true, //缓存预编译语句 })
-
kitex的基础使用
[](https://www.cloudwego.io/zh/docs/kitex/getting-started/)<https://www.cloudwego.io/zh/docs/kitex/getting-started/>
-
准备
-
安装 Kitex代码生成工具
-
go install github.com/cloudwego/k…
-
go install github.com/cloudwego/t…
-
安装后,kitex -version
-
-
使用IDL定义服务与接口
-
Kitex生成代码
-
使用 kitex -module example -service example echo.thrift 命令生成代码
-
build.sh,构建脚本,执行脚本可以把代码变为可执行文件
-
handler.go,实际写的echo逻辑
-
-
-
kitex基本使用
-
handler.go中实现echo方法;服务默认监听端口8888
-
NewClient(”目标服务名”,client.WithHostPorts(”0.0.0.0:8888”));目标服务名,常规使用没什么用,服务发现与注册时会作为服务名,用来过滤服务。当指定了ip端口,服务发现无效
-
使用服务注册与发现调用下游服务。服务注册与发现,ip直连,
-
把server信息注册到注册中心,client去注册中心获取数据
-
服务注册逻辑,Echo()方法。导入etcd扩展 NewEtcdRegistry(),返回对象;初始化server,NewServer(),new(HelloImp)传进来用来解耦,通过Server.WithRegistry()传递etcd注册对象。同时要设置服务基本属性,服务名,用server.WithServerBasicInfo()
-
服务发现逻辑,client端。etcd扩展NewEtcdResolver(),传入参数etcd集群地址。log.Fatal(err)也可以导致程序退出。MustNewClient(”服务名”,client.WithResolver(r)),服务名在发现场景有用,用服务名做服务过滤,再把发现对象传进来。
-
hertz的基础使用
-
hertz中间件
-
需要中间件的场景,通用的逻辑,打日志,计算接口耗时,信息的设置传递
-
c.Next(),向下执行,执行下一个中间件,执行完后返回
-
调用:h.Use(),给全局注册这个中间件,每个路由请求前后都会执行
-
dst,高性能开发时,有些结构体时复用的,这里可以手动传入字节数组,把数据放到字节数组,这样就不需要频繁申请内存
-
通过IDL生成服务端,客户端代码
-
binding与IDL结合,通过IDL的api.query设置一个name,hz生成代码时,结构体就会有这个targ
-
-
hertz性能
- 使用网络库Netpoll,可切换标准库
- 使用Sonic作为Json编解码
- 使用sync.Pool复用对象,协议层数据解析优化
总结
通过学习,了解了Grom,Kitex,Hertz的基本用法,但还是感觉陌生,后续需要继续学习使用。