01. 课程介绍
1.1 课程目标
- 将前面几节课所学到的知识应用到项目中
- 掌握Hertz/Kitex/Gorm的基本用法
- 学习实战案例,将Hertz/Kitex/Gorm用于完成日常后端开发任务
1.2 三件套介绍
-
GORM : GORM是一个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展.
补充: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单来说,将程序中的兑现自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方法 是采用硬编码的方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。这种方法存在很多缺陷,所以使用ORM框架(为了解决面型对象与关系数据库存在的互不匹配的现象的框架)来解决。
-
Kitex : Kitex是字节内部的Golang微服务RPC框架,具有高性能,强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展.
-
Hertz : Hertz是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性,高性能,高扩展性的特点.
02.三件套的使用
2.1 GORM的基础使用
2.1.1 GORM支持的数据库
GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB
连接Mysql数据库案例
import (
"gorm.io/driver/mysql" //数据库驱动
"gorm.io/gorm" //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.Open(dsn), &gorm.Config{})
数据库建立好之后,要设定系统的DSN(数据来源名称),才能让网页可以知道数据库所在的位置以及数据库相关的属性。使用DSN的好处还有,如果移动数据库档案的位置,或是换成别种类型的数据库,只要重新设定 DSN 就好了,不需要去修改原来使用的程序。
2.1.2 GORM创建数据
直接创建数据:
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通过数据的指针来创建,GORM是一个链式调用,使用db.Create之后会返回一个新的gorm对象
//下面的不是代码,是表示各字段的含义
user.ID // 返回插入数据的主键,没有设置ID,但是主键会自增
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
注意使用clause.OnConflict来处理数据冲突,遇到数据冲突时,就把数据插入,其他的什么都不做。
批量插入数据
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1,2,3
}
使用动词API的时候会真的执行sql语句,如Create,Updata等。有些API只是在组合sql语句,还没有真正执行。
根据map创建数据
db.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
// batch insert from `[]map[string]interface{}{}`
db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})
定义默认值
type User struct {
gorm.Model
Name string
Age *int `gorm:"default:18"`
Active sql.NullBool `gorm:"default:true"`
2..1.3 查询数据
使用First()方法查询数据,如果没有查到会返回error,这里需要注意一下。而使用Find()查询,查询不到就会返回空数组,所以使用Find查询更好.
2.1.4 更新数据
2.1.5删除数据
物理删除就是真的删了,软删除的话记录不会真的从数据库里删除。
2.1.6 GORM事务
注意,开启事务后需要使用返回的gorm对象tx,因为db.Begin()执行了两步操作,第一步是固化一个链接,保证我们使用事务的时候使用的是同一个链接,然后执行开启事务的sql语句。因为golang底层对数据库操作使用的是连接池。
不需要再使用tx.Rollback()了,如果返回了err会自动rollback。
推荐使用trancsation的方式来使用事务,避免漏写commit和rollback等
2.1.7 GORM HOOK
2.1.8 GORM性能提高
2.1.9 GORM生态
2.2 Kitex
2.2.1 安装Kitex代码生成工具
首先,我们需要安装使用本示例所需要的命令行代码生成工具:
- 确保
GOPATH环境变量已经被正确地定义(例如export GOPATH=~/go)并且将$GOPATH/bin添加到PATH环境变量之中(例如export PATH=$GOPATH/bin:$PATH);请勿将GOPATH设置为当前用户没有读写权限的目录 - 安装 kitex:
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest - 安装 thriftgo:
go install github.com/cloudwego/thriftgo@latest
安装成功后,执行 kitex --version 和 thriftgo --version 应该能够看到具体版本号的输出(版本号有差异,以 x.x.x 示例):
$ kitex --version
vx.x.x
$ thriftgo --version
thriftgo x.x.x
2.2.2 定义IDL
接口描述语言(Interface description language,缩写IDL),是用来描述软件组件介面的一种计算机语言。IDL通过一种独立于编程语言的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;比如,一个组件用C++写成,另一个组件用Java写成。
IDL通常用于远程调用软件。在这种情况下,一般是由远程客户终端调用不同操作系统上的对象组件,并且这些对象组件可能是由不同计算机语言编写的。IDL建立起了两个不同操作系统间通信的桥梁。
2.2.3 Kitex生成代码
2.2.4 Kitex的基本使用
2.2.5 Kitex Client发起请求
2.2.6 服务注册与发现
2.2.7 Kitex生态
2.3 Hertz
2.3.1 Hertz基本使用
Hertz经过实践分为两个上下文,第一个传递原信息,第二个专注于做请求的处理。
2.3.2 Hertz路由
2.3.3 Hertz参数绑定
2.3.4 Hertz中间件
2.3.5 Hertz Client
2.3.6 Hertz代码生成工具
2.3.7 Hertz性能
2.3.8 Hertz生态
03.实战案例介绍
3.1 项目地址
3.2项目介绍
3.3 项目功能介绍
3.4 项目调用关系
etcd(读作 et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络
3.5 IDL介绍
3.6 项目技术栈介绍
3.7 Hertz关键代码
3.8 Kitex Clinet关键代码讲解
3.9 Kitex Server关键代码
3.10 GORM关键代码
04. 课程总结
- 了解GORM/Kitex/Hertz是什么?
Gorm是一个ORM框架,可以帮助大家操作数据库.
Kitex是一个RPC框架,很多服务可以拆分为许多微服务,这些服务变成了独立的进程,需要进程间的通信协议,而RPC 是一种进程间通信方式,允许像调用本地服务一样调用远程服务,通信协议大多采用二进制方式。
Hertz对外提供一个API服务,做接口聚合.
- 熟悉Gorm/Kitex/Hertz的基础用法.
- 通过实战案例分析将.