go框架三件套 | 青训营笔记

117 阅读8分钟

01. 课程介绍

1.1 课程目标

  1. 将前面几节课所学到的知识应用到项目中
  2. 掌握Hertz/Kitex/Gorm的基本用法
  3. 学习实战案例,将Hertz/Kitex/Gorm用于完成日常后端开发任务

1.2 三件套介绍

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

    补充: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单来说,将程序中的兑现自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方法 是采用硬编码的方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。这种方法存在很多缺陷,所以使用ORM框架(为了解决面型对象与关系数据库存在的互不匹配的现象的框架)来解决。

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

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

02.三件套的使用

2.1 GORM的基础使用

GORM官方文档

image-20230301172011903.png

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创建数据

image-20230301183537569.png

直接创建数据:

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 查询数据

image-20230301190221725.png

使用First()方法查询数据,如果没有查到会返回error,这里需要注意一下。而使用Find()查询,查询不到就会返回空数组,所以使用Find查询更好.

2.1.4 更新数据

image-20230301191205847.png

2.1.5删除数据

image-20230301192620968.png

物理删除就是真的删了,软删除的话记录不会真的从数据库里删除。

2.1.6 GORM事务

image-20230301193618821.png

注意,开启事务后需要使用返回的gorm对象tx,因为db.Begin()执行了两步操作,第一步是固化一个链接,保证我们使用事务的时候使用的是同一个链接,然后执行开启事务的sql语句。因为golang底层对数据库操作使用的是连接池。

image-20230301201348582.png

不需要再使用tx.Rollback()了,如果返回了err会自动rollback。

推荐使用trancsation的方式来使用事务,避免漏写commit和rollback等

2.1.7 GORM HOOK

image-20230301201348582

2.1.8 GORM性能提高

image-20230301201834240

2.1.9 GORM生态

image-20230301201933160

2.2 Kitex

Kitex官方文档

2.2.1 安装Kitex代码生成工具

首先,我们需要安装使用本示例所需要的命令行代码生成工具:

  1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
  2. 安装 kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
  3. 安装 thriftgo:go install github.com/cloudwego/thriftgo@latest

安装成功后,执行 kitex --versionthriftgo --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建立起了两个不同操作系统间通信的桥梁。

image-20230301212708347

2.2.3 Kitex生成代码

image-20230301213617345

2.2.4 Kitex的基本使用

image-20230301213853767

2.2.5 Kitex Client发起请求

image-20230301214102000

2.2.6 服务注册与发现

image-20230301215237318

image-20230301220000433

2.2.7 Kitex生态

image-20230301220122434

2.3 Hertz

Hertz官方文档

2.3.1 Hertz基本使用

image-20230301220242123

Hertz经过实践分为两个上下文,第一个传递原信息,第二个专注于做请求的处理。

2.3.2 Hertz路由

image-20230301220721130

image-20230301220749887

image-20230301220801711

2.3.3 Hertz参数绑定

image-20230301220929970

2.3.4 Hertz中间件

image-20230301221339756

2.3.5 Hertz Client

image-20230301221637693

2.3.6 Hertz代码生成工具

image-20230301221817305

image-20230301221856135

2.3.7 Hertz性能

image-20230301222012932

2.3.8 Hertz生态

image-20230301222143192

03.实战案例介绍

3.1 项目地址

github.com/cloudwego/k…

3.2项目介绍

image-20230301222524192

3.3 项目功能介绍

image-20230302114124224

3.4 项目调用关系

image-20230302151424931

etcd(读作 et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络

3.5 IDL介绍

image-20230302152657167

image-20230302151610063

3.6 项目技术栈介绍

image-20230302151656879

3.7 Hertz关键代码

image-20230302151714957

image-20230302151856979

3.8 Kitex Clinet关键代码讲解

image-20230302151846131

image-20230302151824622

3.9 Kitex Server关键代码

image-20230302151911926

image-20230302151937509

3.10 GORM关键代码

image-20230302152001677

image-20230302152019214

04. 课程总结

  1. 了解GORM/Kitex/Hertz是什么?

Gorm是一个ORM框架,可以帮助大家操作数据库.

Kitex是一个RPC框架,很多服务可以拆分为许多微服务,这些服务变成了独立的进程,需要进程间的通信协议,而RPC 是一种进程间通信方式,允许像调用本地服务一样调用远程服务,通信协议大多采用二进制方式。

Hertz对外提供一个API服务,做接口聚合.

  1. 熟悉Gorm/Kitex/Hertz的基础用法.
  2. 通过实战案例分析将.