您好,登录后才能下订单哦!
这篇文章给大家介绍利用go-zero怎么开发一个线上项目,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
曾经有一个CTO跟我说,定义的每一个变量、每一个字段,都应该有它的作用。多余的代码,多余的变量,多余的字段,除了误导别人,弄脏代码,别无他用。我,表示绝对赞同!
golang性能好
单单靠golang的简单、严谨,当然上不了程序员的舞台。可恨的是,golang性能还很好!比C++要差点,但是就web应用的并发、资源占用来说,比java、python、php、nodejs都是要优秀的。具体数据大家上网一搜比比皆是。一个语法简单、性能又好、入门只需一周的语言,反正我是入坑了。
有段时间,我太热爱golang了导致认为golang可以做任何事情。不过慢慢,我理性了。做web应用,首选golang。做数据分析、爬虫、图片处理还是python吧。但要是有人说用java去写web后台,cms类型还好,要是面向市场用户的,spring boot那套,spring cloud那套,我觉得,远远远远远远远比不上用golang相关的框架,java还是去做那些单体应用吧。
golang还有另外一个属性,就是“轻”,有多轻?对比一下java的jvm那套容器,你就知道有多轻了。几行代码就能实现一个原生web服务了,docker这个跨时代的产物就是golang写的。etcd这个分布式基石也是golang写的,云原生这个跨时代的名词,很多组件都是golang贡献的。“微服务”这个面试必问的名词,golang可以对它做最好的诠释。
后来我进入了一家直播公司,刚好遇到了公司的波动,让我有了停下来自省的时间。其间,喜欢逛逛github,稍有目的去逛一下golang的开源项目。比如gin,iris,go-micro,go-zero,sentinel-golang,gin-vue-admin等等等啦。一开始,go-zero并不是特别吸引我,可能是博客/github布局不够亮眼吧。但是,当我哪天沉下来看go-zero的文档,开始敲起第一个goctl的命令,我好像,好像!已经停不下来。
go-zero,用起来,真的很舒服!
我刚在游戏平台公司实习转正的时候,也是可以带一两个实习生的。当时我就有个想法,“如何让员工都敲出规范、高效的代码”。当时想了下用go-template,但是因为学艺未精,推进不下去。时隔几年,当我接触到go-zero的goctl后,发现,居然有大佬实现了当年我的想法!虽然我技术不大行,但是梦想还是要有的,go-zero对我来说太亲切了。搞!肝!!
一周时间,过完了go-zero的github文档以及语雀文档,中途也自己练手了几个demo。可真是越敲越舒服。迫不及待地用想找个实际项目投入生产!果真不久有个机会来了,公司想做一个简单的app做投放调研,允许重新搭建一个新的后台web项目,我!go-zero!义不容辞,开干。又花了两周时间,写完了一个后台web服务,里面有下面板块
用户板块
咨询板块
报告板块
支付板块
广告板块
截个图看看我的项目结构,由于还是公司项目,暂时不会开源啦,不过凡是go-zeroer都能看懂
简单说明一下:
api目录,就是http1.1的web服务,跟前端对接
rpc目录,rpc服务,基本和api一一对应
enum目录,枚举目录,里面存放的是各种各样的枚举值,我把它提到一等公民了
model目录,数据库model,目前都是用goctl根据mysql生成的model
utils目录,这里主要存放我的一些小工具包,例如int/string/time的一些操作,参考了下go-zero的命名方法,子目录一般会以x结尾,例如intx,timex,stringx等等
worker目录,主要是做一些消费者模型的消费者,例如kafka的消费者,google订阅通知的消费者等等
ws目录,存放websocket相关的服务,例如私聊
感谢下go-zero,让我对项目的组织结构有了一个简单的标准。worker、ws等服务,以前的项目结构都杂乱无章,目前都是参考go-zero生成api的目录结构了:
main.go入口
etc存放配置,
internal内部目录
config:配置
handler:处理器
logic:逻辑处理
types:中间类型
“工具大于约定和文档”,这,就是go-zero的理念。我,表示极度赞同!
go-zero的最大特点,就是goctl。goctl是什么?就是能根据协议文档,生成代码的一个神器。例如
定了a.proto文件,goctl rpc proto a.proto -dir . 即可生成rpc服务
定了b.sql文件,goctl model mysql ddl -c -src b.sql -dir . 即可生成模板model文件
定了c.api文件(go-zero出品),goctl api go -api ad-api.api -dir . 即可生成api文件
再配合上golang的jb IDE,代码提醒,代码格式化,一个go-zero的生态,就出来了。一个字:舒服!!
除了goctl神器,另外一个让我拜服的点是,go-zero的一些小工具。
流数据处理利器:fx。听说java8的lambda很炫酷,go-zero也有了!fx.Filter().Sort().Head() ,让数组的复杂处理变得简单mapReduce降低服务相应时间:mr.Finish(), mr.Map().Reduce(), 跟并发处理waitGroup说拜拜!etcd服务发现的集成:p2c的算法发现服务,免却了开发们点对点或nginx的转发服务,安装一个etcd就完事了jwt集成api:轻松拥有一个jwt的后台服务集成Prometheus:轻松拥有一个带监控的golang后台服务等等等
二次感谢go-zero,还有很多小工具,等待我去看源码,时间轮/调度器等等啦。go-zero有点像我学习的导师一样。
go-zero为小白如我的gopher们,提供了一个功能完备、性能可观、开发迅速的web框架。然而,它不像其他框架那样约束着我,我还是能里面做很多发挥的。虽然不是大牛级别的发挥,但是,个性化操作还是支持的:
model层,完全可以接入gorm代替掉内置的sqlx,虽然就没了大佬辛苦做的缓存击穿等防护的功能。当然也可以两者并存。
rpc层,不必约定要api层去调用。例如我上面截图的worker/ws层去调用完全没问题。
api层自己生成的middleware,可以抽离出到公共目录,那就可以多个api目录使用同一个middlerware了。
等等等啦
关于利用go-zero怎么开发一个线上项目就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。