介绍
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