这是我参与「第五届青训营 」笔记创作活动的第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
- clauses处理冲突
- gorm字段可以设置特定属性,比如主键、default默认值
查询数据Read
- First使用,查不到就会返回ErrRecordNotFound;Find查询多条数据,查不到不会返回错误,返回空数组
- 使用结构体查询,如果字段值为0,那么这个字段会被直接忽略,可用map来解决
更新数据Update
- 使用结构体更新,如果字段值为0,那么这个字段会被直接忽略,map可以用于解决0值更新
- .Select([string])可用于指定更新字段
删除数据Delete
- 物理删除——delete方法,软删除——deleteat方法
- Upscoped方法可以查询被软删的数据
Gorm事务
Begin Commit Rollback三大项
tx:=db.Begin() 之后就使用tx来进行db操作
tx.Rollback() 当遇到error时,可以回退事务
tx.Commit() 提交事务
Transaction可以用于防止漏写后两项(比较常用)
Gorm Hook
CRUD前后自动执行的函数,可以在遇到错误的时候回退事务
Gorm性能提高
- SkipDefaultTransaction关闭默认事务
- 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环境
然后运行了程序,关键还是在于开发环境的配置比较麻烦