这是我参与「第五届青训营」伴学笔记创作活动的第 5 天。
三件套
Gorm Kitex Hertz
基础使用:
gorm.Open,然后mysqlOpen打开mysql链接
dns的格式:user:pass@tcp(地址)/数据库名字?传递基本参数,比如说编码方式,时区
grom.config:自定义配置
First只能查单条记录,然后内部传递的是指针接着是查询条件
Model更新,update更新一条,然后updates可更新多个字段,传递一个结构体跟一个map,本身默认值是0,默认只会更新非0值的情况,更新0值的话就传递一个map。
GORM 目前支持 MySQL、SQLServer、PostgreSQL、SQLite。
通过驱动来连接数据库,其他类型可以用复用或者自行开发驱动
gorm是链式调用,db.create会返回一条gorm对象,所以需要用res:=db.create,获取res.Error,创建多条就是传递list结构体
使用First的时候查询不到的话会返回ErrRecordNotFound,使用Find查询多条数据,查询不到的话不会返回错误。解决零值问题:传递map。
提供了tx:=db.begin、tx.commit,tx.Rollback()方法
提供了db.Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollback。
性能提高:
对于写操作(创建、更新、删除) ,为了确保数据的完整性,GORM 会将它们封装在事务内运行。但这会降低性能,可以使用SkipDefaultTransaction 关闭默认事务。
使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度。
如果本地开发环境是 Windows 的建议使用虚拟机或 WSL2.
安装代码生成工具
go install github.com/cloudwego/kitex/tool/cmd/kitex @latest
go install github.com/cloudwego/thriftgo@latest
然后执行kitex -version,返回版本
使用 IDL 定义服务与接口
(IDL:接口描述语言)
如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。
Thrift: thrift.apache.org/docs/idl
Proto3 :developers.google.com/protocol-bu…
NewClient("example目标服务名",client.WithHostPosts("0.0.0.0:8888"对端服务的ip号))
服务发现和注册,微服务,调用下一个服务,ETCD,Nacos,通过把server注册到注册中心里面去,然后client,然后去注册中心获取数据,内部实现算法,比走多层代理会快一些。导入etcd的扩展。
每次请求都会在etcd查找,然后再进行操作,会定时刷新和缓存
XDS流量路由
Hertz
server.Default初始化一个Hertz的对象,默认集成一个recover中间件
server.New就没有
Spin开启自旋,后面的代码都不会进行
两个,一个注重于传递信息,一个注重于请求的处理
可以自定义,支持路由分组的功能,同时提供了参数路由和通配路由.
路由的优先级为:静态路由>命名路由>通配路由。
①参数路由 ②通配路由
Bind、Validate、BindAndValidate函数用于进行参数绑定和校验。
中间件:客户端和服务端
通用逻辑:打日志,计算接口耗时,源信息的设置和传递。
全局中间件和路由组中间件的区别?
代码生成工具:Hz,通过IDL文件即可生成对应的基础服务代码。
性能远高于其他框架
网络库:Netpoll Json编解码Sonic 使用sync.Pool复用对象协议层数据解析优化
项目功能介绍
项目调用关系
技术栈介绍
关键代码
Hertz:
Kitex Client
Kitex Server
Gorm
Gorm orm框架,帮助操作数据库
Kitex rpc框架,服务抽象成基础服务
Hertz 对外提供api服务,接口数据聚合