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

174 阅读5分钟

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

一、本堂课重点内容

  • 三件套的简介
  • 三件套的基础使用
  • 项目实战案例

二、详细知识点介绍

三件套的简介

  • Gorm 是一个已经迭代了10年+的功能强大的ORM框架,被广泛使用并且拥有非常丰富的开源扩展。
  • Kitex 是一种Golang微服务RPC框架,具有高性能、强可扩展的主要特点,支持多协议。
  • Hertz 是一种HTTP框架,参考了其他开源框架的优势,具有高易用性、高性能、高扩展性特点。

三件套的基础使用

Gorm的使用

声明模型:

模型是具有基本 Go 类型、指针/别名或实现Scanner和Valuer接口的自定义类型的普通结构,例如:

type User struct {
ID           uint   
Name         string   
Email        *string   
Age          uint8   
Birthday     *time.Time   
MemberNumber sql.NullString   
ActivedAt    sql.NullTime   
CreatedAt    time.Time   
UpdatedAt    time.Time 
}

GORM 定义一个 gorm.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt,可以将这个嵌入到结构体中来包含这几个字段,也可以进行字段级控制权限、打入字段标签等操作。

约定:

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

连接到数据库:

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server,访问连接到数据库 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.查看相关例子。与此同时,GORM 允许通过 DriverName 选项自定义 MySQL 驱动,也可以通过一个现有的数据库连接来初始化 *gorm.DB

创建数据:

可以进行选定字段创建,也可以进行批量插入,也可以创建hook,详情可以访问创建 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

查询数据:

使用First时,需要注意查询不到数据会返回ErrRecordNotFound。使用Find查询多条数据,查询不到数据不会返回错误。使用Struct查询时,只会查询非零字段,如果需要查询零值可以使用Map查询详情可以访问查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

更新数据:

可以更新单列、多列、选定字段。同样查询时的struct零值问题。详情可以访问更新 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

删除数据:

支持硬删除也支持软删除。拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除。但GORM会将DeletedAt置为当前时间,并且你不能再通过正常的查询方法找到该记录。使用Unscoped可以查询到被软删的数据。 详情可以访问删除 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

事务:

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

Hook:

  • GORM在提供了CURD的Hook能力。
  • Hook是在CURD等操作之前、之后自动调用的函数。
  • 如果任何Hook返回错误,GORM将停止后续的操作并回滚事务。

性能提高:

  • 使用SkipDefaultTransaction关闭默认事务
  • 使用PrepareStmt缓存预编译语句可以提高后续调用的速度

此外,GORM也支持非常丰富的生态。

Kitex的使用

kitex的安装:

www.cloudwego.io/zh/docs/kit…

定义IDL:

我们使用IDL定义服务与接口,我们需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数的时候需要知道函数签名一样。例如:

image.png

Kitex生成代码:

有了 IDL 以后我们便可以通过 kitex 工具生成项目代码了,执行如下命令生成:

$ kitex -module example -service example echo.thrift

执行后生成如下项目结构:

image.png

修改服务端逻辑文件handler.go文件使得程序可以运行。

Client发起请求:

在创建client之后发起调用

服务注册与发现:

目前Kitex的服务注册与发现已经对接了主流了服务注册与发现中心。如ETCD, Nacos等。可访问www.cloudwego.io/zh/docs/kit… 查询。

生态:

Kitex也同样拥有非常丰富的扩展生态

Hertz的使用

路由:

  • Hertz提供了GET、POST、PUT、DELETE、ANY 等方法用于注册路由
  • 提供了路由组(Group)的能力,用于支持路由分组的功能
  • 支持参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由
  • 详情可查看:www.cloudwego.io/zh/docs/her…

参数绑定:

提供了 Bind、Validate、BindAndValidate 函数用于进行参数绑定和校验,非常方便。

中间件:

Hertz 的中间件主要分为客户端中间件与服务端中间件。可以c.Abortc.AbortWithMsgc.AbortWlthStats等方法终止中间件调用链的执行。

Client:

Hertz提供了HTTP Client用于帮助用户发送HTTP请求

代码生成工具:

Hertz提供了代码生成工具Hz,通过定义IDL文件即可生成对应的基础服务代码。

性能:

从Netpoll网络库、json编码、协议层数据解析优化等方面进行了性能提升。

同样,Hertz支持非常丰富的生态。

三、实践练习例子

笔记系统

这是一个使用Gorm、Kitex、Hertz搭建出来的具备一定业务逻辑的后端API项目。可查看:github.com/cloudwego/b…

系统主要分为demoapi、demouser、demounote三大模块:分别用于用户操作、用户控制、笔记控制。

image.png

调用关系:

image.png

四、课后个人总结

本次课学习的Gorm、Kitex、Hertz均为第一次学习,有一定的学习难度,同时也是首次接触微服务的相关框架,对链路追踪、路由设置、etcd注册等知识点的学习和认识都需要进一步加深。对于本节课的项目而言,这也是青训营开营以来第一次介绍的较为完整的项目,值得我去反复学习琢磨相关代码和设计思想。