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

135 阅读4分钟

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

前言

go框架中的web层框架herz、rpc框架和orm框架gorm。目前正在读gorm文档。

Go 框架三件套详解(Web/RPC/ORM)

环境搭建部分

搭建课程所需要的开发环境以及安装需要用到的软件。

学习如何安装 Docker/Postman/Git/Golang

  • 安装 Minikube 或 Docker Desktop 用于使用 Docker 安装教程

    • 可以使用 Minikube 或者使用 Docker Desktop 启动 Docker
  • 安装 Postman

  • 安装 Git 安装教程

  • 安装 Go(Golang >= 1.15) 安装教程

框架体验部分

提前体验一下课程涉及的 HTTP/RPC/ORM 框架

HTTP 框架 Hertz 初体验

通过阅读 www.cloudwego.io/zh/docs/her… 尝试运行 Hertz 的示例代码

Hertz使用

没看懂这个和kitex干嘛的……

Hertz生态

image-20230125153847458

RPC 框架 Kitex 初体验

通过阅读 www.cloudwego.io/zh/docs/kit… 尝试运行 Kitex 的示例代码

  • kitex 暂时没有针对 Windows 做支持,如果本地开发环境是 Windows 建议使用 WSL2
  • KItex 框架地址: github.com/cloudwego/k…

Kitex服务注册与发现

干嘛用的?

Kitex生态

image-20230125151450106

维护多套测试环境使用XDS扩展很舒适 推荐体验一下

ORM 框架 Gorm 初体验

通过阅读 gorm.cn/docs/#Insta… 尝试运行 Gorm 的示例代码

Gorm的基本使用

  • 如下图,Gorm的使用就是框架进行数据库的crud操作

image-20230120103115971

  • 不太懂更新操作中,更新多个字段的两种做法跟零值非零值有什么关系

  • Gorm中的默认约定

    • 使用名为ID的字段作为主键;
    • 使用结构体的蛇形复数作为表名;e.g. 如果结构体名为User,那么表名就是users;像上图中的TableName接口可以重定义表名;
    • 字段名的蛇形作为列名;同理可以在结构体中使用gorm tag来重定义列名
    • 使用CreatedAt和UpdateAt字段作为创建、更新时间

备注:蛇形命名法是每一个单词均是小写开头并将单词间的空格替换为 _ 的命名方法。

Gorm的CRUD

  • Gorm连接数据库

image-20230120104359058

  • Gorm创建数据

image-20230120105047714

  • Gorm更新数据

image-20230120110436518

  • Gorm删除数据

image-20230120110735415

  • Some tips

    • Gorm是链式调用(不太懂),所以会对传入的结构体参数做出sql语句调用后的改变,同时返回gorm对象,该对象可以记录sql语句调用的一些信息,比如sql执行的err或者查询结果的数量等;
    • Gorm提供软删除策略;
    • 如果在执行sql性质的接口前加入传入了使用TableName的结构体作为参数的接口,那么可以不用显示使用model接口去传入结构体转换到要操作的表名。在update接口中一般传入的参数是要修改的列和修改的值,没有传入结构体也就没有表名信息,所以需要调用model();
    • 在执行sql性质的接口后加入任何接口的都是无效的,只能在前面加入起到拼接sql语句的作用;
    • 关于零值的修改,貌似只能使用map或者使用select接口指定列;

Gorm事务

  • 提供了begin、commit、rollback;
  • 提供了Transaction用于自动提交事务,避免用户漏写commit和rollback;
  • 提供了curd的hook能力
  • gorm会对写操作默认开启事务,降低性能,如果同时也没有设置hook,可以加入Skip Default Transaction参数关闭事务;同时还有PrepareStmt参数缓存预编译语句提高性能;

Gorm生态

image-20230120114102421

实战项目

image-20230125155013374

总结

image-20230125160131692

其它知识

  • 了解一下什么IDL以及IDL的语法
  • 了解一下什么是 opentracing 以及 etcd

Etcd 与 Opentracing 是什么

IDL 是什么

问题

  • rpc服务和http服务啥区别 http就是管路由的吗建立url和函数之间的映射关系?

http服务是最上游对外提供api的调用,依次向下调用rpc client,然后rpc client调用rpc server,最后rpc server调用orm框架,完成对数据库的操作。

基本上大单体项目使用orm和http框架即可,但是可以把能被复用的服务拆出来形成rpc服务调用,跟微服务有关系

  • Thrift protobuf 是什么?协议?