Go三件套 | 青训营笔记

114 阅读4分钟

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

Day3 三件套Web/RPC/ORM

课程介绍

把前面学过的应用起来、掌握三件套进行开发、为大作业打基础

三件套介绍

Gorm——golang的ORM框架,迭代了10年+,被广泛应用且开源

Kitex——golang微服务RPC框架,支持广泛扩展

Hertz——http框架,结合了其它框架的优势(比如gin等)

三件套的使用

Gorm

主键:默认ID为主键

命名规范:表名默认为结构体的蛇形复数(全小写,并且从单数变为复数,如User —> users),字段名默认为蛇形(全小写)

gorm支持的数据库:MySQL、SQLServer、PostgreSQL、SQLite,还支持自己开发驱动程序

什么是DSN?

【Data Source Name】是指数据库来源,当我们的数据库建立好之后,系统需要知道数据的来源,所以就需要设定系统的 DSN(数据来源名称) ,当网页在进行访问的时候,才能让网页可以知道数据库所在的位置以及数据库相关的属性。

什么是链式调用?

形如上通过“.”或“->”等连续调用类方法的操作,就是链式调用。Javascript、php、java、c\c++等语音编程中,均可以采用此类思维,设置类(Class)。链式调用是类设计的一个巧妙应用。类函数链式调用符合人类的思维模式,逻辑思路清晰,在编程过程中,使用能够提高编程效率,同时代码及简洁又易读。

所以我们在Go中有处理error的两种方式

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
  // 处理错误...}

或者 

if result := db.Where("name = ?", "jinzhu").First(&user); result.Error != nil {
  // 处理错误...
}

gorm的 CRUD 操作

创建数据Create

  1. clauses处理冲突
  2. gorm字段可以设置特定属性,比如主键、default默认值

查询数据Read

  1. First使用,查不到就会返回ErrRecordNotFound;Find查询多条数据,查不到不会返回错误,返回空数组
  2. 使用结构体查询,如果字段值为0,那么这个字段会被直接忽略,可用map来解决

更新数据Update

  1. 使用结构体更新,如果字段值为0,那么这个字段会被直接忽略,map可以用于解决0值更新
  2. .Select([string])可用于指定更新字段

删除数据Delete

  1. 物理删除——delete方法,软删除——deleteat方法
  2. Upscoped方法可以查询被软删的数据

Gorm事务

Begin Commit Rollback三大项

tx:=db.Begin() 之后就使用tx来进行db操作

tx.Rollback() 当遇到error时,可以回退事务

tx.Commit() 提交事务

Transaction可以用于防止漏写后两项(比较常用)

Gorm Hook

CRUD前后自动执行的函数,可以在遇到错误的时候回退事务

Gorm性能提高

  1. SkipDefaultTransaction关闭默认事务
  2. PrepareStmt缓存预编译语句可以提高后续调用的速度

Gorm生态

代码生成工具、分片库方案、手动索引、乐观锁、读写分离、OpenTelemetry扩展

Kitex

【个人感觉这是比较高阶的东西,值得后期学习】

代码生成工具

使用IDL定义服务和接口

如果要进行RPC,IDL用来约定双方的协议

服务默认监听8888端口

服务注册与发现

Kitex生态

Hertz

Hertz[həːts] 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。 如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。

基本操作——类似于Echo和Gin框架

路由:支持GET、POST、PUT、DELETE、ANY等(优先级:静态>命名>通配)

路由组(Group)

参数绑定Bind Validate等

中间件

Client——Hertz既可以写服务端也可以客户端

代码生成工具

Hertz生态

项目实践——easynote

我在windows端安装了wsl 配置了go环境

然后运行了程序,关键还是在于开发环境的配置比较麻烦

课程总结与展望