[ Go框架三件套 | 青训营笔记 ]

147 阅读5分钟

[ Go框架三件套 | 青训营笔记 ]

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

一.本课重点

  • 将前面几节课所学到的知识应用到项目中
  • 掌握Hertz / Kitex / Gorm的基本用法
  • 通过学习实战案例,可以使用Hertz / Kitex / Gorm完成日常后端开发任务

- 二.课程内容

1. 理解Database / SQL

设计原理

avatar

可以使用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可以嵌入在已有的结构体中,还可以进行权限控制;

模型的一些惯例约定:

avatar

连接到数据库

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最佳实践

avatar


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项目。

服务名称服务介绍传输协议主要技术栈
demoapiAPI服务HTTPGorm/Kitex/Hertz
demouser用户数据管理ProtobufGorm/Kitex
demonote笔记数据管理ThriftGorm/Kitex

项目模块:

demoapi:

  • 用户登录
  • 用户注册
  • 用户创建笔记
  • 用户更新笔记
  • 用户删除笔记
  • 用户查询笔记

demouser:

  • 创建用户
  • 查询用户
  • 校验用户

demonote:

  • 创建笔记

  • 更新笔记

  • 删除笔记

  • 查询笔记

四.个人收获

本次课程收获很多,了解了很多知识。

五.参考文献

字节青训营课程。