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

98 阅读3分钟

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

Gorm

Gorm 是一个已经迭代了10年+的功能强大的ORM框架,拥有非常丰富的开源扩展 ORM:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。

参考:gorm.io/zh_CN/docs/…

  • 安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
  • 基本使用
package main

import (
  "gorm.io/gorm"
  "gorm.io/driver/sqlite"
)

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

func main() {
  // 连接数据库
  db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
  if err != nil {
    panic("failed to connect database")
  }

  // 迁移 schema
  db.AutoMigrate(&Product{})

  // Create
  db.Create(&Product{Code: "D42", Price: 100})

  // Read
  var product Product
  db.First(&product, 1) // 根据整型主键查找
  db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录

  // Update - 将 product 的 price 更新为 200
  db.Model(&product).Update("Price", 200)
  // Update - 更新多个字段
  db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
  db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

  // Delete - 删除 product
  db.Delete(&product, 1)
}

约定:GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间

  • gorm.Model

GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}
  • 连接到数据库

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

GORM 通过驱动来连接数据库,如果需要连接其他类型的数据库,可以复用、自行开发驱动

  • 创建数据

如何使用Upsert? 使用clause.OnConflict处理数据冲突 如何使用默认值? 使用default标签为字段定义默认值

  • 查询

GORM 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

使用Find查询多条数据,查询不到数据不会返回错误

当使用结构体作为查询条件时,GORM只会查询非零值字段。这意味着如果您的字段值为0、“、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。

Kitex

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

参考:www.cloudwego.io/zh/docs/kit…

  • 安装
  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
  • 使用IDL定义服务与接口

如果我们要进行RPC,就需要知道对方的接口是什么,需要穿什么参数,同时也需要知道返回值是什么样的。这时候就需要通过IDL来约定双方的协议。

Thrift: thrift.apache.org/docs/idl.ht…

Proto3: developers.google.com/protocol-bu…

  • 生成代码
kitex -service a.b.c hello.thrift

# 若当前目录不在 $GOPATH/src 下,需要加上 -module 参数,一般为 go.mod 下的名字
kitex -module "your_module_name" -service a.b.c hello.thrift
  1. build.sh 构建脚本
  2. kitex_gen:IDL内容相关的生成代码,主要是基础的S/C代码
  3. main.go:程序入口
  4. handler.go:用户在该文件里实现IDL
  5. service: 定义的方法
  • 服务注册与服务发现

Kitex 已经通过社区开发者的支持,完成了 ETCD、ZooKeeper、Eureka、Consul、Nacos、Polaris 多种服务发现模式,当然也支持 DNS 解析以及 Static IP 直连访问模式,建立起了强大且完备的社区生态,供用户按需灵活选用。

ETCD扩展:github.com/kitex-contr…

其他参考:www.cloudwego.io/zh/docs/kit…

Hertz

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

参考:www.cloudwego.io/zh/docs/her…

  • 安装: go install github.com/cloudwego/hertz/cmd/hz@latest
  • 路由:

Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由

Hertz 提供了路由组( Group )的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。

Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。 路由的优先级:静态路由 > 命名路由 > 通配路由

  • 代码生成工具

通过定义IDL文件即可生成对应的基础服务代码