Go框架三件套 | 青训营

215 阅读5分钟

1 Gorm简介及基础用法

1.1 Gorm简介

Gorm是一个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

  • Gorm 能够方便地将数据库操作与 Go 语言代码结合起来,提供了诸如连接数据库、执行 SQL 语句、处理结果集等功能。
  • Gorm 还支持多种数据库,包括 MySQL、PostgreSQL、SQLite、SQL Server 等,可以轻松地进行数据库的切换。
  • Gorm 还提供了方便的 API,可以轻松地进行数据库的增删改查等操作,同时还支持事务管理、数据验证、序列化等功能。

Gorm 的优点是简单易用、性能高效、代码简洁,是进行 Go 语言后端开发的不二选择。

1.2 Gorm基础用法

1.2.1 Gorm基本使用

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

image.png

1.2.2 Gorm增删改查操作

创建数据:

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

image.png

查询数据:

  • First的使用踩坑:使用First时,需要注意查询不到数据会返回ErrRecordNotFound。使用Find查询多条数据,查询不到数据不会返回错误。
  • 使用结构体作为查询条件:当使用结构作为条件查询时,GORM只会查询非零值字段。这意味着如果您的字段值为0、"、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。

image.png

更新数据:

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

image.png

删除数据:

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

(1)物理删除:

image.png

(2)软删除:

image.png

1.2.3 Gorm事务

Gorm 提供了Begin、Commit、Rollback方法用于使用事务:

image.png

Gorm提供了Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollbcak:

image.png

1.3 Gorm扩展生态

GORM拥有非常丰富的扩展生态:

image.png

2 Kitex简介及基础用法

2.1 Kitex简介

Kitex是字节内部的Golang微服务RPC框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。

  • Kitex 提供了一系列方便的工具和服务,帮助开发者构建分布式应用程序。
  • Kitex 支持多种服务发现和负载均衡机制,可以轻松地实现服务的注册和发现,同时还支持多种消息队列,包括 RabbitMQ、Kafka、Redis 等。
  • Kitex 还提供了方便的 API 网关,可以对 API 进行统一的管理和调用,同时还支持分布式锁、流量控制等功能。

Kitex 的优点是简单易用、高效稳定、可扩展性强,是进行 Go 语言微服务开发的不二选择。

2.2 Kitex基础用法

2.2.1 基础使用

服务默认监听8888端口:

image.png

2.2.2 发起请求

创建Client:

image.png

发起请求:

image.png

2.2.3 服务注册

目前Kitex的服务注册与发现已经对接了主流了服务注册与发现中心,如ETCD,Nacos等:

image.png

image.png

2.3 Kitex扩展生态

Kitex拥有非常丰富的扩展生态:

image.png

3 Hertz简介及基础用法

3.1 Hertz简介

Hertz是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点。

  • Hertz 作为分布式缓存框架,提供了一系列方便的工具和服务,帮助开发者构建高性能的分布式应用程序。
  • Hertz 支持多种缓存算法,包括 LRU、LFU、Hash、Tree 等,可以轻松地实现缓存的管理和更新。
  • Hertz 还支持多种缓存协议,包括 Redis、Memcached、TCP 等,可以轻松地与各种缓存服务进行集成。
  • Hertz 还提供了方便的 API,可以轻松地进行缓存的增删改查等操作,同时还支持分布式锁、流量控制等功能。

Hertz 的优点是简单易用、高效稳定、可扩展性强,是进行 Go 语言分布式缓存开发的不二选择。

3.2 Hertz基础用法

3.2.1 基本使用

使用Hertz实现,服务监听8080端口并注册了一个GET方法的路由函数:

image.png

3.2.2 路由

提供GET、POST、PUT、DELETE、ANY等方法用于注册路由:

image.png

路由组(Group)用于支持路由分组:

image.png

参数路由和通配路由: 路由的优先级为:静态路由>命名路由>通配路由

image.png

3.2.3 中间件

Hertz的中间件主要分为客户端中间件与服务端中间件,下图展示一个服务端中间件。

image.png

终止中间件调用链的执行:

  1. c.Abort
  2. c.AbortWithMsg
  3. c.AbortWlthStats

3.3 Hertz扩展生态

Hertz拥有非常丰富的扩展生态:

image.png

4 总结

本文主要介绍Gorm、Kitex和hert使用场景及优点,着重介绍Gorm、Kitex和hert基础用法,最后给出其扩展生态。

本文为个人见解,如有错误欢迎指正!