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

152 阅读4分钟

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

Grom的基础使用

参考: gorm.cn/zh_CN/docs/…

  • 连接数据库

    • 结构体是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事务

    参考:gorm.cn/zh_CN/docs/…

    • 一致性操作比较强时使用事务,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.cn/zh_CN/docs/…

    • 禁用默认事务 ,对于写操作(创建、更新、删除),为了确保数据的完整性,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/>
  • 准备

  • 使用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的基本用法,但还是感觉陌生,后续需要继续学习使用。