Go框架三件套详解(Web/RPC/ORM) | 青训营

147 阅读4分钟

介绍

Gorm

迭代了多年的功能强大的ORM框架,拥有丰富的开源扩展。

Kitex

是字节内部的Golang微服务RPC框架,具有强性能、强可扩展的特点,拥有丰富的开源扩展。

Hertz

是字节内部的HTTP框架,具有高易用性、高性能、高扩展性的特点。

三件套的使用

根据Db操作、RPC调用、API服务、接口的聚合、前端或客户端的顺序来介绍。

Gorm基础使用

  • 定义gorm model
  • 为model定义表名
  • 连接数据库
  • 创建数据
  • 查询、更新、删除数据

Gorm的约定

  • Gorm使用名为ID的字段作为主键
  • 无定义时,使用结构体的蛇形负数作为表名
  • 字段名的蛇形作为列名
  • 使用CreatedAt、UpdatedAt字段作为创建、更新时间

Gorm支持的数据库

MySQL、SQLServer、PostgreSQL、SQLite

  • Gorm通过驱动来连接数据库,如果需要连接其他类型的数据库,可以复用/自行开发驱动
  • DSN:包含连接数据库的信息

Gorm创建数据

  • 使用clause.OnConflict处理数据冲突
  • 通过使用default标签为字段定义默认值

Gorm查询数据

  • 使用First时,需要注意查询不到数据时会返回ErrRecordNotFound
  • 使用Find查询多条数据,查询不到数据不会返回错误
  • 当使用结构体作为查询条件(或更新条件)时,GORM只会查询非零值字段。这意味着如果字段为0、""、false或其他零值时,该字段不会被用于构建查询条件,需要使用Map来构建查询条件(或者通过Gorm提供的Select API挑选字段规避零值)

Gorm更新数据

使用结构体Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。

Gorm删除数据

删除数据分为物理删除和软删除

物理删除

直接使用db.delete()

软删除

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

Gorm事务

  • Gorm提供了Begin、Commit、Rollback方法用于使用事务
  • Gorm提供了Transaction方法用于自动提交事务,避免用户漏写Commit、Rollback。

Gorm Hook

  • Gorm提供了Crud的Hook能力
  • Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数
  • 如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务

Gorm性能提高

  • 对于写操作(创建、更新、删除),为了确保数据的完整性,Gorm会将它们封装在事务内运行。但这会降低性能,可以使用SkipDefaultTransaction关闭默认事务
  • 使用PrepareStmt缓存预编译语句可以提高后续调用的速度。

Gorm生态

  • 代码生成工具
  • 分片库方案
  • 手动索引
  • 乐观锁
  • 读写分离
  • OpenTelemetry扩展(链路追踪和监控)

Kitex基础使用

对Windows支持不完善,Windows系统建议使用虚拟机或WSL2

  • 安装代码生成工具
  • 定义IDL(使用IDL定义服务与接口,约定生成协议)
  • Kitex生成代码
  • Kitex服务默认监听8888端口
  • Kitex Client发起请求
  • Kitex的服务注册与发现已经对接了主流的服务注册与发现中心(如ETCD、Nacos等)
  • Kitex扩展生态非常丰富:
    • XDS
    • opentelemetry
    • ETCD服务注册与发现
    • Nacos服务注册与发现
    • Zookeeper服务注册于发现
    • polaris
    • 丰富的示例代码与业务Demo

Hertz 基础使用

  • Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由
  • Hertz提供了路由组的能力,支持路由分组
  • Hertz提供参数路由和分配路由,优先级为静态路由>命名路由>通配路由
  • Hertz提供了Bind、Validate、BindAndValidate函数用于进行参数绑定和校验
  • Hertz的中间件主要分为客户端中间件和服务端中间件(中间件:打印日志、计算接口耗时、元信息的设置和传递时使用)
  • Hertz提供了HTTP client用于帮助用户发送HTTP请求
  • Hertz提供了代码生成工具Hz,通过定义IDL(interface description language)文件即可生成对应的基础服务代码
  • Hertz性能优势:
    • 网络库Netpoll优于标准库
    • Json编写码Sonic
    • 使用sysc.Pool复用对象,协议层数据解析优化
  • Hertz扩展生态非常丰富:
    • HTTP2
    • opentelemetry
    • 国际化
    • 反向代理
    • JWT鉴权
    • Websocket
    • 丰富的示例代码与业务Demo