[ Go框架三件套 | 青训营笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 5 天
一.本课重点
- 将前面几节课所学到的知识应用到项目中
- 掌握Hertz / Kitex / Gorm的基本用法
- 通过学习实战案例,可以使用Hertz / Kitex / Gorm完成日常后端开发任务
- 二.课程内容
1. 理解Database / SQL
设计原理:
可以使用import driver实现,使用driver + DSN初始化DB连接
需要注意连接池配置 & 连接池状态;
Driver连接接口;
DB连接的几种类型:
- 直接连接 / Conn
- 预编译 / Stmt
- 事务 / Tx
处理返回数据的几种方式:
- Exce / ExceContext -> Result
- Query / QueryContext -> Rows (Columns)
- QueryRow / QueryRowContext -> Row (Rows简化)
2. GORM使用简介
这一部分的详细内容依然可以参考:GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
模型定义
模型是标准的struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成。
// 一个例子
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
复制代码
gorm.Model可以嵌入在已有的结构体中,还可以进行权限控制;
模型的一些惯例约定:
连接到数据库
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server;
我们就以MySQL来举例:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})
}
复制代码
关于连接池:
连接池是什么?
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
连接池有什么好处?
- 减少连接创建时间
- 简化的编程方式
- 受控的资源使用
GORM使用Database / SQL来维护连接池;
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
复制代码
基本用法-CRUD
创建 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
关联
Belongs To | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
3. GORM设计原理
此部分待补充
- SQL生成
- 插件扩展
- ConnPool
- Dialector
4. GORM最佳实践
5. Kitex相关内容
温馨提示:Kitex目前对Windows的支持不完善,如果本地开发环境是Windows建议使用虚拟机orWSL2;
安装代码生成工具:
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest
复制代码
查看版本:
~ % kitex -version
复制代码
定义IDL:
IDL是什么?
IDL是Interface description language的缩写,指接口描述语言,是规范的一部分,是跨平台开发的基础。
RPC是什么:
RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
// 使用IDL定义服务与接口
/*
如果我们要进行PRC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值时什么样的,这个时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。
*/
// Thrift: https://thrift.apache.org/docs/idl
// Proto3: https://developers.google.com/protocol-buffers/docs/proto3
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Echo {
Response echo(1: Request req)
}
复制代码
Kitex生成代码:
具体可以参考http://www.cloudwego.io/zh/docs/kitex/getting-started/
使用如下命令生成代码:
kitex -module example -service example echo.thrift
复制代码
文件说明:
- build.sh:构建脚本
- kitex_gen:IDL内容相关的生成代码,主要是基础的Server/Client代码
- main.go:程序入口
- handler.go:用户在该文件里实现IDLservice定义的方法
服务默认监听8888端口;
Kitex Client发起请求:
- 创建Client
- 发起请求
Kitex服务注册与发现:
目前Kitex的服务注册与发现已经对接了主流的服务注册与发现中心,如ETCD,Nacos等;
Kitex生态:
详见:https://www.cloudwego.io/zh/docs/kitex/
三.项目实践
项目介绍:
笔记项目是一个使用Hertz、Kitex、Gorm搭建出来的具备一定业务逻辑的后端API项目。
| 服务名称 | 服务介绍 | 传输协议 | 主要技术栈 |
|---|---|---|---|
| demoapi | API服务 | HTTP | Gorm/Kitex/Hertz |
| demouser | 用户数据管理 | Protobuf | Gorm/Kitex |
| demonote | 笔记数据管理 | Thrift | Gorm/Kitex |
项目模块:
demoapi:
- 用户登录
- 用户注册
- 用户创建笔记
- 用户更新笔记
- 用户删除笔记
- 用户查询笔记
demouser:
- 创建用户
- 查询用户
- 校验用户
demonote:
-
创建笔记
-
更新笔记
-
删除笔记
-
查询笔记
四.个人收获
本次课程收获很多,了解了很多知识。
五.参考文献
字节青训营课程。