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

63 阅读4分钟

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

对于今天的框架学习,让我了解到这三个框架分别对应java的mybatis、cloud、boot三部分,可能学的还不算精炼,但是目前来说还算会用。

Gorm

GitHub上活跃度很高的orm库,Gorm是一个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

特点:

  • 全功能ORM;
  • 关联(包含一个,包含多个,属于,多对多,多种包含)
  • Callbacks(创建/保存/更新/删除/查找之前/之后)
  • 预加载
  • 事务
  • 复合主键
  • SQL Builder
  • 自动迁移
  • 日志
  • 可扩展,编写基于GORM回调的插件
  • 每个功能都有测试
  • 开发人员友好

连接数据库

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

func main() {

  dsn:="root:123456@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

连接mysql数据库需要按照上面的格式,输入用户名和密码,以及数据库对应IP地址以及端口号,dbname是数据库的名字,charset=utf8mb4支持完整的utf-8编码,想要正确的处理 time.Time ,需要带上 parseTime 参数

Model

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 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间。

字段标签示例

type User struct {
  gorm.Model
  Name         string
  Age          sql.NullInt64
  Birthday     *time.Time
  Email        string  `gorm:"type:varchar(100);unique_index"`
  Role         string  `gorm:"size:255"` // 设置字段大小为255
  MemberNumber *string `gorm:"unique;not null"` // 设置会员号(member number)唯一并且不为空
  Num          int     `gorm:"AUTO_INCREMENT"` // 设置 num 为自增类型
  Address      string  `gorm:"index:addr"` // 给address字段创建名为addr的索引
  IgnoreMe     int     `gorm:"-"` // 忽略本字段
}

操作MySql数据库

package main

import (
        "fmt"
        "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

// UserInfo 用户信息
type UserInfo struct {
        ID uint
        Name string
        Gender string
        Hobby string
}


func main() {
        dsn:="root:123456@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err!= nil{
                panic(err)
        }


        // 自动迁移
        db.AutoMigrate(&UserInfo{})

        u1 := UserInfo{1, "李华", "男", "篮球"}
        u2 := UserInfo{2, "刘丽", "女", "足球"}
        // 创建记录
        db.Create(&u1)
        db.Create(&u2)
        // 查询
        var u = new(UserInfo)
        db.First(u)
        fmt.Printf("%#v\n", u)

        var uu UserInfo
        db.Find(&uu, "hobby=?", "足球")
        fmt.Printf("%#v\n", uu)

        // 更新
        db.Model(&u).Update("hobby", "双色球")
        // 删除
        db.Delete(&u)
}

里面包含了基础的增删改查等一些基础操作。

事务

普通事务

type TMG struct {
        ID   uint
        Name string
}

func main() {
        db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{})
        db.AutoMigrate(&TMG{})

        db.Transaction(func(tx *gorm.DB) error {
                // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
                if err := tx.Create(&TMG{Name: "Giraffe"}).Error; err != nil {
                        // 返回任何错误都会回滚事务
                        return err
                }

                if err := tx.Create(&TMG{Name: "Lion"}).Error; err != nil {
                        return err
                }

                // 返回 nil 提交事务
                return nil
        })
}

Kitex

KiteX 是 bytedance 开源的高性能 RPC 框架,实现了高吞吐、高负载、高性能等诸多特性,具体请看 KiteX 的实践,文章介绍多传输协议、消息协议时,说到 KiteX 支持的协议类型:Thrift、Protobuf 等,今天我们主要来实践如何利用 KiteX 基于对应的 IDL 生成对应协议的代码。

在 RPC 框架中,我们知道,服务端与客户端通信的前提是远程通信,但这种通信又存在一种关联,那就是通过一套相关的协议(消息、通信、传输等)来规范,但客户端又不用关心底层的技术实现,只要定义好了这种通信方式即可。

在 KiteX 中,也提供了一种生成代码的命令行工具:kitex,目前支持 thrift、protobuf 等 IDL,并且支持生成一个服务端项目的骨架。

Hertz

Hertz 是字节跳动服务框架团队研发的超大规模的企业级微服务 HTTP 框架,具有高易用性、易扩展、低时延等特点。

Hertz提供了Get、Post、Put、Delete、ANY等方法用于注册路由函数。

为了保证框架整体上满足:

    1. 极致性能优化的可能性;
    1. 面对未来不可控需求的扩展能力, Hertz 采用了 4 层分层设计,保证各个层级功能内聚,同时通过层级之间的接口达到灵活扩展的目标。

image.png

引用:

本文部分内容来源于其他网页

原文链接:blog.csdn.net/wangsofa/ar…

原文链接:blog.csdn.net/weixin_4418…

原文链接:blog.csdn.net/weixin_4810…