跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • go-zero 使用心得
未分類
28 12 月 2020

go-zero 使用心得

go-zero 使用心得

資深大佬 : iamhujiebin 8

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 之后,我!!发现!!

  1. golang 是有指针的,这不是大学熟悉的 C++那样的指针吗
  2. golang 是编译语言,原来客户端的“打包、打包”,原来是这么一回事
  3. golang 是可以做定时器的,换用 php 该怎么搞啊?很麻烦的吧。
  4. golang 不用写分号,不用写括号,看起来很简单啊,性能又很好啊!
  5. golang 原生支持 web 服务,原来不用 nginx 也可以起一个 web 服务啊
  6. …….还有很多很多

喜欢 golang

​ 尝试了 golang 之后,我发现我喜欢上了 golang 了。

golang 严谨

​ golang 中不提倡多余的变量。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 轻量

​ golang 还有另外一个属性,就是“轻”,有多轻?对比一下 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 的命令,我好像,好像!已经停不下来。

​ go-zero,用起来,真的很舒服!

​ 我刚在游戏平台公司实习转正的时候,也是可以带一两个实习生的。当时我就有个想法,“如何让员工都敲出规范、高效的代码”。当时想了下用 go-template,但是因为学艺未精,推进不下去。时隔几年,当我接触到 go-zero 的 goctl 后,发现,居然有大佬实现了当年我的想法!虽然我技术不大行,但是梦想还是要有的,go-zero 对我来说太亲切了。搞!肝!!

​ 一周时间,过完了 go-zero 的 github 文档以及语雀文档,中途也自己练手了几个 demo 。可真是越敲越舒服。迫不及待地用想找个实际项目投入生产!果真不久有个机会来了,公司想做一个简单的 app 做投放调研,允许重新搭建一个新的后台 web 项目,我! go-zero !义不容辞,开干。又花了两周时间,写完了一个后台 web 服务,里面有下面板块

  1. 用户板块
  2. 咨询板块
  3. 报告板块
  4. 支付板块
  5. 广告板块

截个图看看我的项目结构,由于还是公司项目,暂时不会开源啦,不过凡是 go-zeroer 都能看懂

go-zero 使用心得

简单说明一下:

  1. api 目录,就是 http1.1 的 web 服务,跟前端对接
  2. rpc 目录,rpc 服务,基本和 api 一一对应
  3. enum 目录,枚举目录,里面存放的是各种各样的枚举值,我把它提到一等公民了
  4. model 目录,数据库 model,目前都是用 goctl 根据 mysql 生成的 model
  5. utils 目录,这里主要存放我的一些小工具包,例如 int/string/time 的一些操作,参考了下 go-zero 的命名方法,子目录一般会以 x 结尾,例如 intx,timex,stringx 等等
  6. worker 目录,主要是做一些消费者模型的消费者,例如 kafka 的消费者,google 订阅通知的消费者等等
  7. ws 目录,存放 websocket 相关的服务,例如私聊

感谢下 go-zero,让我对项目的组织结构有了一个简单的标准。worker 、ws 等服务,以前的项目结构都杂乱无章,目前都是参考 go-zero 生成 api 的目录结构了:

  1. main.go 入口
  2. etc 存放配置,
  3. internal 内部目录
    1. config:配置
    2. handler:处理器
    3. logic:逻辑处理
    4. types:中间类型

go-zero 理念

​ “工具大于约定和文档”,这,就是 go-zero 的理念。我,表示极度赞同!

​ go-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 的生态,就出来了。一个字:舒服!!

go-zero 小工具

​ 除了 goctl 神器,另外一个让我拜服的点是,go-zero 的一些小工具。

  1. 流数据处理利器:fx 。听说 java8 的 lambda 很炫酷,go-zero 也有了! fx.Filter().Sort().Head() ,让数组的复杂处理变得简单
  2. mapReduce 降低服务相应时间:mr.Finish(),mr.Map().Reduce(),跟并发处理 waitGroup 说拜拜!
  3. etcd 服务发现的集成:p2c 的算法发现服务,免却了开发们点对点或 nginx 的转发服务,安装一个 etcd 就完事了
  4. jwt 集成 api:轻松拥有一个 jwt 的后台服务
  5. 集成 Prometheus:轻松拥有一个带监控的 golang 后台服务
  6. 等等等

二次感谢 go-zero,还有很多小工具,等待我去看源码,时间轮 /调度器等等啦。go-zero 有点像我学习的导师一样。

go-zero 拓展

​ go-zero 为小白如我的 gopher 们,提供了一个功能完备、性能可观、开发迅速的 web 框架。然而,它不像其他框架那样约束着我,我还是能里面做很多发挥的。虽然不是大牛级别的发挥,但是,个性化操作还是支持的:

  1. model 层,完全可以接入 gorm 代替掉内置的 sqlx,虽然就没了大佬辛苦做的缓存击穿等防护的功能。当然也可以两者并存。
  2. rpc 层,不必约定要 api 层去调用。例如我上面截图的 worker/ws 层去调用完全没问题。
  3. api 层自己生成的 middleware,可以抽离出到公共目录,那就可以多个 api 目录使用同一个 middlerware 了。
  4. 等等等啦

go-zero 很轻量、很便捷、很博学。里面蕴藏的着很多知识以及理念。目前我只是用了皮毛,go-zero 的 k8s 部署,目前我没开始接入。继续努力努力学习啦!

再次感谢

  1. https://www.yuque.com/tal-tech/go-zero/yaoehb go-zero 语雀文档
  2. https://github.com/tal-tech/go-zero go-zero 源码
大佬有話說 (41)

  • 資深大佬 : SuperMild

    主写得很真情实感,Go 的语法很多人不喜欢,没有泛型也是一大缺点,但喜欢 Go 的人对主说的那些优点应该多有同感。

  • 主 資深大佬 : iamhujiebin

    @SuperMild 泛型慢慢就会出啦~ golang 确实跟典型的 java c++的命名会冲突,对于大生态的程序员们,要接受 golang 是需要点时间的

  • 資深大佬 : AmrtaShiva

    写的真实

  • 資深大佬 : kevinwan

    很赞!可以投稿给我发到『微服务实践』的公众号吗?都是讲 go-zero 相关原理、实现和工具的,非常感谢!

  • 資深大佬 : echowuhao

    看了一下,lz 帖子写的不错,go zero 也不错。

    没有用过。有个疑问。

    “`
    api 目录,就是 http1.1 的 web 服务,跟前端对接
    rpc 目录,rpc 服务,基本和 api 一一对应
    “`
    api 为何要绕道 rpc ?

    我看 grpc 底层是 grpc,grpc-web 可以直接用 js/ts 在浏览器中调用后段的 rpc 。

    这样 api 就可以扔了?岂不美哉。

  • 主 資深大佬 : iamhujiebin

    @kevinwan 当然可以~~ 膜拜一下 go-zero 的作者~

  • 主 資深大佬 : iamhujiebin

    @echowuhao 我也曾经想过直接让前端对接 grpc,grpc 本质就是 http2 嘛。不过 http 还是主流,是 web 服务的标配,api 层还是有必要的。

  • 資深大佬 : echowuhao

    @iamhujiebin 这个一个问题。你 http api 直接访问数据库不行么。要在 api 里面调用 rpc 代码?

  • 資深大佬 : blless

    我一直觉得 go zero 是不是花钱买流量了,就各种吹,感觉这种大泥球聚合框架早就有了,设计上也没觉得有啥亮点,看了几个库封装也觉得没有善用 go 的接口特性,各种依赖一股脑塞进去。

  • 主 資深大佬 : iamhujiebin

    @echowuhao api 层其实可以做其他事情,比如参数校验、限流、打点等等,跟业务逻辑耦合没那么严重的逻辑。rpc 层就相对靠数据库层一点,同时也可以做微服务做服务注册发现。api 层 rpc 层分离为做微服务做了铺垫

  • 資深大佬 : liprais

    这一篇公关稿多少钱啊?

  • 資深大佬 : lidashuang

    @liprais 这就没意思了,上来就公关稿

  • 資深大佬 : kevinwan

    作为 go-zero 作者,我扪心自问,没有花过一分钱公关和推广,开源靠花钱买流量有何价值?关键看是否解决开发者实际问题吧

    觉得有问题的也可以去听听 B 站上我在 go 夜读做过的分享,直接搜 go-zero 即可找到,开源本不易,不花钱适当宣传我觉得没啥问题吧?

    代码哪里不好欢迎拍砖,请给出具体代码拍砖,框架层面都是我写的,请用力拍

  • 資深大佬 : hihanley

    啊这

  • 資深大佬 : kevinwan

    大家还是讨论技术哈

    作为 go-zero 作者,我是一个南京大学本科毕业,工作了 19 年半的资深程序员,做过三年高性能计算,用 C/C++优化过 intel 等公司使用的 cpu 仿真软件(提升 12%),优化过微软 passport 系统(提升 3%),做过某知名直播公司的大数据和推荐系统,多次合伙创业负责技术,有过失败,有过被收购。从 0 做架构,支撑过千万级日活,百万级 qps 。作为主语言使用超过 2 年的有:C,C++,C#,Java,Python,Go 。

    现在带着 100+人的研发团队,白天太忙,正常晚上十点开始写代码,完全是对技术的一份热爱。你可以说我代码哪里写的不好,我会带着感激来改进,但请保留对技术起码的尊重,谢谢!

  • 資深大佬 : KesonAn

    @blless 我看过你曾经的回帖,大部分都是比较消极的回帖,我觉得你不是认为 go-zero 有问题,而是对编程技术恐怕有着“独到”的见解,且不说你技术有多牛,用现在当前流行的一句话来形容——不讲码德,请你学会尊重,再来讨论技术。

  • 資深大佬 : LoNeFong

    开源不易 支持作者

  • 資深大佬 : seven123

    其他的话可以认同,编程本来就是一件优美的事情。但是你这么贬低 java 没必要吧…

  • 資深大佬 : blless

    @KesonAn 没多牛,对框架的评论已经写在上面了,不喜欢把所有依赖一股脑塞进包里的做法。设计也没考虑 GO 的接口特性,直接引入依赖,怎么就没讨论技术了?怎么了,评价冰箱还得自己会制冷嘛?
    我说感觉花钱买流量也不是瞎说,我特么 v 站 gocn gopherdaily 都看见推送,加上我就是觉得这个框架设计挺一般,比以前 gf,包括现在 b 站,斗鱼开源的框架都没啥出挑的地方,就不能哔哔两句?

  • 資深大佬 : kevinwan

    @blless 看到推送就说花钱买流量了?你去问问这几家站长,我给谁一分钱了?找到我一万倍付给你

  • 資深大佬 : kevinwan

    我在 go 夜读做过分享,gopherchina 大会做过分享,周末腾讯云大会分享,掘金 go meetup 合作伙伴,没有花过一分钱,如若找到,一万倍付给你,立字为证!

  • 主 資深大佬 : iamhujiebin

    @seven123 抱歉,可能让你误解了哈。 我其实也挺喜欢 java 的输出的。比如 kafka,elk,jmeter,都是 java 写的。我都在用哈。但是我还是坚持 web 应用首选 golang

  • 資深大佬 : blless

    @kevinwan 是我冒犯了,框架挺好的,也是为开源做贡献了。只是我个人不太喜欢这种大杂烩全家桶似的封装,言辞冒犯,打扰了。

  • 資深大佬 : fwee

    @blless 一点证据都没有就直接指责别人花钱买流量,有罪推定呗?就不能是作者自己用小号发的?

  • 資深大佬 : securityCoding

    B 站上面有 go 夜读分享,作者主持那期 go-zero 算是非常有料的一期了,推荐看看

  • 資深大佬 : kevinwan

    @blless 没关系的,回到技术讨论上哈,不要在意。开源也是一份爱,否则很难坚持的

  • 資深大佬 : kevinwan

    @fwee 各个公众号的推送都是公众号团队的行为,小号无法操作,v 站我仅此一号,gocn 等公众号我即使注册账号也无法推送吧

  • 資深大佬 : kevinwan

    讨论技术哈,不要纠结于技术以外的东西,我更愿意交流技术哈

  • 資深大佬 : frozenshadow

    go-kit 这种比较轻量的工具包用起来束缚少,用起来确实很爽,但是每一个人用 go-kit 写出来的项目可能都不一样。对公司业务开发框架来说,开发速度、工具稳定和风格统一非常重要,所以整个框架看起来会很“臃肿”。

  • 資深大佬 : jorneyr

    但要是有人说用 java 去写 web 后台,cms 类型还好,要是面向市场用户的,spring boot 那套,spring cloud 那套,我觉得,远远远远远远远比不上用 golang 相关的框架,java 还是去做那些单体应用吧。

    这样说的话,BAT 是不是该破产了?

  • 主 資深大佬 : iamhujiebin

    @jorneyr BAT 大厂也开始尝试 golang 啦。 很多 zf 工程还在用 iis 呢

  • 資深大佬 : salamanderMH

    这是推广帖吧。

  • 資深大佬 : kevinwan

    @salamanderMH 用户发的,我也是他发后才看到的

  • 資深大佬 : nioncodotcom

    我只想用来做 app 的后台接口服务,可能也没有多少用户量,这个框架是否合适呢

  • 主 資深大佬 : iamhujiebin

    @nioncodotcom 可以尝试一下,这个框架主要是能快速开发迭代。

  • 資深大佬 : wellsc

    @kevinwan 淘宝双十一高峰期也才百万 qps 呢

  • 資深大佬 : kevinwan

    @wellsc 淘宝的是百万笔交易,不一样的,一笔交易背后触发很多服务协同,而且是跟银行相关的,一分钱都不能错,那个会难很多

  • 資深大佬 : wellsc

    @kevinwan 不知道你在说什么,qps 这东西不是跟吞吐量,并发用户数之类的有关系,你说你在因特尔微软呆过,我倒是好奇这些公司有什么场景能达到百万级别的 qps 的。“一项交易背后触发多服务协同”, 这难道不是 tps 该统计的事吗?

  • 資深大佬 : kevinwan

    @wellsc query per second 和 transaction per second 不一样哈

  • 資深大佬 : wellsc

    @kevinwan 哈,我说的就是 qps 和 tps 不一样啊,你说“百万笔交易,不一样的,一笔交易背后触发很多服务协同”的场景难道不是 tps 层面更应该考虑的事情吗?和你说的百万 qps 有什么关系呢?你不想说 qps 也没关系,或者换个问题说吧,贵司有这么高数量级的 qps,服务化,分库分表之类的肯定搞的炉火纯青了,能不能分享一下你们微服务架构下的数据一致性最佳实践呀

  • 資深大佬 : kevinwan

    @wellsc 可以的,我分享过,你去看 b 站上 go-zero 视频,gopherchina 大会的视频也很快出来,我讲了的

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具