这是我参与「第五届青训营」伴学笔记创作活动的第3天。
前言
今天学习了三个框架,或者换个说法,了解了三个框架,毕竟两个小时学三个框架也不现实。先谈点自己的想法:三个框架里目前看来相对简单的就是Gorm,它的文档目前最为全面;然后是Hertz,主要它的语法和API都和昨天的GIN很接近,但是听老师的说法它不是封装的Gin,底层逻辑做了很多优化,但从语法角度出发学习起来更有“亲切感”;最后是Kitex,我个人认为最难的一个,资料实在太少了,虽然有Java的微服务经验,但是它除了架构上和Java那一套很像,很多内容上又不太一样。
知识点内容
1.Gorm(ORM框架)
首先是一些Gorm的默认约定:Gorm使用名为ID的字段作为主键; 使用结构体的蛇形负数作为表名;字段名的蛇形作为列名;使用CreatedAt UpdatedAt字段作为创建、更新时间。
接下来是关于结构体字段的一些API:可以通过使用default标签为字段定义默认值;还可以使用upsert或clause.OnConflict()来处理数据冲突。
以及老师总结的几个First Api日常使用踩坑:使用First时,需要注意查询不到数据会返回ErrRecordNotFound;使用Find查询多条数据,查询不到数据不会返回错误。
操作要点
当我们使用结构体作为查询条件时,GORM只会查询非零值字段。这意味着如果字段值为0、“”、false或其他零值,该字段不会被用于构建查询条件,使用map来构建查询条件。
使用结构体更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段.
删除数据则分为软删(伪删除)和物理删除(真实删除)。分别由两个API来实现,即gorm.DeletedAt()和gorm.Delet(),使用 Unscoped()可以查询到被软删的数据,使用以上的前提是我们需要先在结构体中声明软删字段:Deleted gorm.DeletedAt。
Gorm也有事务管理:通过Begin()开始事务;Rollback()遇到错误回滚;Commit()提交事务(Ps:这里需要注意操作事务的对象应该是开启事务之后的对象,而不是在建立连接时的对象)。另外,Gorm还提供了Tansaction()用于自动提交事务,避免遗漏使用Rollback()和Commit()
Gorm还提供了CURD的Hook能力,Hook在CRUD操作之前、之后自动调用的函数,如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务,这个设计理念倒是和spring的AOP很像。
在性能优化上也提到了以下两点:对于写操作,Gorm会将它们封装在事务内运行,但这会降低性能,可以使用SkipDefaultTransaction关闭默认事务; 还使用PrepareStmt缓存预编译语句可以提高后续调用的速度
2.Kitex(微服务RPC框架)
通过使用IDL定义服务与接口:
如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样,这个类似于我们在使用Java进行微服务开发时的注册中心一样。
使用Kitex搭建项目在文末的参考文档,也就是官方文档里有,如果是Win的同学需要安装WSL才可以运行,使用Linux虚拟机的同学记得调整内存到4G以上,我的2G服务器启动服务直接CPU飙到100%,又不想去折腾虚拟机了,就改用win了。在win成功运行图如下:
3.Hertz(微服务HTTP框架)
主要用在服务与服务之间的通信,也算是个中间件,概念上到没什么好说的,该有的功能都有,看官网文档上的测试图,出色的性能也有,中规中矩的一个产品吧。在win下成功运行如下:
启动成功后,访问本地的8888端口下的ping地址,可以看到如下信息,表示框架导入成功!
小结
今天早上学习整体下来,对框架三件套有了基本的认识,但是如果做Go的单体项目,我依然会选择使用Gin,它的性能没有这几个好,但是它的开发便捷度很适合我这种Java转过来的人,这三个框架让我眼前一亮的就是Kitex,相比于spring cloud那一套微服务治理,它要“轻”很多。缺点的话就是资料太少,我需要再去探索下它是怎么完成项目上的整合。