如何使⽤go-zero开发线上项⽬
前⾔
说在最前⾯,我是⼀个外表谦让,内⼼狂热,外表斯⽂,内⼼贪玩的⼀个普通⼈。我的职业是程序员,是⼀个golang语⾔爱好者,⼀半是因为golang好⽤,⼀半是因为其他语⾔学不好。我是从phper转为gopher的,写php的时候我认识了互联⽹软件,写go的时候感觉⾃⼰终于在编程。
初见golang
我⼤学专业是软件。第⼀门编程语⾔是C++,知道了指针,知道了加减乘除,知道了编程去控制软硬件。后来选修了java,被ssh框架戏耍了⼀个暑假。再后来进⼊了⼀个社团技术部,再被html/css/js打击了⾃⼰信⼼。⾼中年级总能排名前⼏的我,真的开始怀疑⼈⽣了。再再后来进⼊了⼀家游戏平台公司,开始了php的编写之旅。“噢!”,终于,我知道了什么是互联⽹,折磨我的编程语⾔c++/java/html/css,原来还可以这样⼦“变现”。
刚⼊门了互联⽹的我,⼼⾥是真的喜悦。不过,重复的东西做多了,总是少不了厌倦。每天都是写php,都是那些增删改查,都是修改数据表,增加字段,增加临时表。真的,开始腻了。“听说最新公司在⽤新的编程语⾔golang”,我,想去试试。但,我不敢,⼼⾥有对⾃⼰和对golang的怀疑,因此我不是第⼀个去拜
师的。当golang在公司流⾏了两个⽉,我的leader让我去⽤⼀下golang。终于,我师出有名了。浅尝了⼀周的golang之后,我!!发现!!
golang是有指针的,这不是⼤学熟悉的C++那样的指针吗
golang是编译语⾔,原来客户端的“打包、打包”,原来是这么⼀回事
golang是可以做定时器的,换⽤php该怎么搞啊?很⿇烦的吧。
golang不⽤写分号,不⽤写括号,看起来很简单啊,性能⼜很好啊!
golang原⽣⽀持web服务,原来不⽤nginx也可以起⼀个web服务啊
.......还有很多很多
喜欢golang
尝试了golang之后,我发现我喜欢上了golang了。
golang严谨
g olang中不提倡多余的变量。gopher都知道,golang变量不使⽤,直接会报编译错误!这让我刮⽬相看!在我看来,是把严谨提升了⼀个阶段,只要你是gopher,就会强迫你变得严谨。golang变量这个属性,秉承了golang的设计理念,严谨这个理念贯穿了golang的各处。
曾经有⼀个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轻量
g olang还有另外⼀个属性,就是“轻”,有多轻?对⽐⼀下java的jvm那套容器,你就知道有多轻了。⼏⾏代码就能实现⼀个原⽣web服务了,docker这个跨时代的产物就是golang写的。etcd这个分布式基⽯也是golang写的,云原⽣这个跨时代的名词,很多组件都是golang贡献的。“微服务”这个⾯试必问的名词,golang可以对它做最好的诠释。
go-zero⼀见如故
后来我进⼊了⼀家直播公司,刚好遇到了公司的波动,让我有了停下来⾃省的时间。其间,喜欢逛逛github,稍有⽬的去逛⼀下golang的开源项⽬。⽐如gin,iris,go-micro,go-zero,sentinel-golang,gin-vue-admin等等等啦。⼀开始,go-zero并不是特别吸引我,可能是博客/github布局不够亮眼吧。但是,当我哪天沉下来看go-zero的⽂档,开始敲起第⼀个goctl的命令,我好像,好像!已经停不下来。
g o-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的⽬录结构了:
<⼊⼝
etc存放配置,
internal内部⽬录
config:配置
handler:处理器
logic:逻辑处理
types:中间类型
go-zero理念
“⼯具⼤于约定和⽂档”,这,就是go-zero的理念。我,表⽰极度赞同!
g o-zero的最⼤特点,就是goctl。goctl是什么?就是能根据协议⽂档,⽣成代码的⼀个神器。例如
1. 定了a.proto⽂件,goctl rpc proto a.proto -dir . 即可⽣成rpc服务
2. 定了b.sql⽂件,goctl model mysql ddl -c -src b.sql -dir . 即可⽣成模板model⽂件
3. 定了c.api⽂件(go-zero出品),goctl api go -api ad-api.api -dir . 即可⽣成api⽂件
再配合上golang的jb IDE,代码提醒,代码格式化,⼀个go-zero的⽣态,就出来了。⼀个字:舒服!!
enum怎么用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拓展
g o-zero为⼩⽩如我的gopher们,提供了⼀个功能完备、性能可观、开发迅速的web框架。然⽽,它不
像其他框架那样约束着我,我还是能⾥⾯做很多发挥的。虽然不是⼤⽜级别的发挥,但是,个性化操作还是⽀持的:
model层,完全可以接⼊gorm代替掉内置的sqlx,虽然就没了⼤佬⾟苦做的缓存击穿等防护的功能。当然也可以两者并存。
rpc层,不必约定要api层去调⽤。例如我上⾯截图的worker/ws层去调⽤完全没问题。
api层⾃⼰⽣成的middleware,可以抽离出到公共⽬录,那就可以多个api⽬录使⽤同⼀个middlerware了。
等等等啦
go-zero 很轻量、很便捷、很博学。⾥⾯蕴藏的着很多知识以及理念。⽬前我只是⽤了⽪⽑,go-zero的k8s部署,⽬前我没开始接⼊。继续努⼒努⼒店铺!
到此这篇关于如何使⽤go-zero开发线上项⽬的⽂章就介绍到这了,更多相关go-zero开发线上项⽬内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论