Go框架三件套(Web/RPC/ORM) | 青训营笔记

95 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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字段创建、更新时间

蛇形命名法的复数形式:

image.png

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设置为当前时间,并且无法通过正常查询手段找到该记录。

事务

两阶段提交 image.png 注意tx是一个返回的固化的链接,而不是链接池里的链接。

经验教训推荐使用Transaction:GORM提供了Transaction方法用于自动提交事务或回滚,会在return err时回滚,return nil时自动提交,避免用户漏写CommitRollback

GORM提供了CURD的Hook功能,Hook是在创建、查询、更新、删除等操作之前之后自动调用的函数。如果任何Hook返回错误,GORM将停止后续操作并回滚事务。

GORM生态

image.png

GORM性能提高

  • 关闭默认事务
  • PrepareStmt缓存预编译语句以提高后续调用速度

Kitex

文档:Kitex文档

需要使用IDL定义服务与接口,约定双方的协议

IDL协作开发技巧:用IDL统一管理接口,不论查询还是修改,直接改IDL就可以了。

Thrift语法
proto3语法

使用kitex -module example -service example hello.thrift生成服务端代码

image.png

  • build.sh用于构建脚本,脚本可以将代码编译为二进制可执行文件
  • kitex_gen/:IDL相关内容代码,主要是基础的Server/Client代码
  • main.go:程序入口
  • handler.go:用户在改文件里实现IDL service定义的方法

服务默认监听8888端口

服务发现与注册

server注册到服务注册与发现中心,client去注册中心获取数据,这样速度比多层代理快一点,因为服务发现使IP直连了。

示例代码

Hertz

官方文档: 官方文档
server.Default 默认集成了一个recover中间件,server.New 没有

  • 提供路由分组
  • 提供参数路由和通配路由
  • 中间件包括客户端中间件和服务端中间件

总结:看文档!!!

好难呀OTZ