这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
Go框架三件套(Web/RPC/ORM) | 青训营笔记
三件套
Web - Hertz
RPC - Kitex
ORM - Gorm
ORM
object relational mapping,面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
RPC
remote procedure call,调用远端机器的函数或方法,且不需要关心底层的调用细节,如网络协议和传输协议等,对于调用者来说,和调用本地方法没有什么区别。一个服务拆分为不同的模块,或者单体应用拆分为多个微服务时,此时便需要RPC出场了,不同模块及不同服务间都需要RPC才能完成通信。可以说RPC是分布式系统架构或者微服务架构必不可少的实现手段。
Gorm
官方文档:GORM官方文档
Updates(): gorm使用结构体更新仅更新非零值字段,要更新零值,可以传递一个map
Gorm的约定
- Gorm使用ID的字段作为主键
- 使用结构体的蛇形复数作为表名
- 字段名的蛇形作为列名
- 使用createAt、updateAt字段创建、更新时间
蛇形命名法的复数形式:
GORM通过驱动连接数据库,目前支持MySQL、SQLServer、PostgreSQL、SQLite。
查询
First查询一个数据,Find查询一组数据;First查不到返回错误,Find查不到返回空数组,不会返回错误。
gorm使用结构体查询只会查询非零值字段,若要查询零值字段得用map。
- 使用
clause.OnConflict处理数据冲突 db.Create()、db.Update()等都是finish API,调用后就直接执行了,再添加.Where()条件是不生效的(因为这些是用来拼接sql语句的)
一个例子:
result := db.Where("ags > 10 ").Find(&users)//SELECT * FROM users where age > 10
更新
一个例子
db.Model(&User{ID:111}).Where("age > ?",18).Update("name","hello")
需要用.Model()告诉表名
同查询,需要用map或使用Select选择字段才能更新零值
删除
物理删除,删了就是真删了。更多时候应该使用软删除,记录不会从数据库中真正删除。但gorm会将DeletedAt设置为当前时间,并且无法通过正常查询手段找到该记录。
事务
两阶段提交
注意tx是一个返回的固化的链接,而不是链接池里的链接。
经验教训推荐使用Transaction:GORM提供了Transaction方法用于自动提交事务或回滚,会在return err时回滚,return nil时自动提交,避免用户漏写Commit、Rollback。
GORM提供了CURD的Hook功能,Hook是在创建、查询、更新、删除等操作之前之后自动调用的函数。如果任何Hook返回错误,GORM将停止后续操作并回滚事务。
GORM生态
GORM性能提高
- 关闭默认事务
PrepareStmt缓存预编译语句以提高后续调用速度
Kitex
文档:Kitex文档
需要使用IDL定义服务与接口,约定双方的协议
IDL协作开发技巧:用IDL统一管理接口,不论查询还是修改,直接改IDL就可以了。
使用kitex -module example -service example hello.thrift生成服务端代码
- build.sh用于构建脚本,脚本可以将代码编译为二进制可执行文件
- kitex_gen/:IDL相关内容代码,主要是基础的Server/Client代码
- main.go:程序入口
- handler.go:用户在改文件里实现IDL service定义的方法
服务默认监听8888端口
服务发现与注册
server注册到服务注册与发现中心,client去注册中心获取数据,这样速度比多层代理快一点,因为服务发现使IP直连了。
Hertz
官方文档: 官方文档
server.Default 默认集成了一个recover中间件,server.New 没有
- 提供路由分组
- 提供参数路由和通配路由
- 中间件包括客户端中间件和服务端中间件
总结:看文档!!!
好难呀OTZ