共计 3877 个字符,预计需要花费 10 分钟才能阅读完成。
作者:结冰
前言
说在最后面,我是一个表面谦让,心田狂热,表面斯文,心田贪玩的一个普通人。我的职业是程序员,是一个 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 谨严
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 服务,外面有上面板块
- 用户板块
- 征询板块
- 报告板块
- 领取板块
- 广告板块
截个图看看我的我的项目构造,因为还是公司我的项目,临时不会开源啦,不过但凡 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 的理念。我,示意极度同意!
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 的生态,就进去了。一个字:难受!!
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 拓展
go-zero 为小白如我的 gopher 们,提供了一个性能齐备、性能可观、开发迅速的 web 框架。然而,它不像其余框架那样束缚着我,我还是能外面做很多施展的。尽管不是大牛级别的施展,然而,个性化操作还是反对的:
- model 层,齐全能够接入 gorm 代替掉内置的 sqlx,尽管就没了大佬辛苦做的缓存击穿等防护的性能。当然也能够两者并存。
- rpc 层,不用约定要 api 层去调用。例如我下面截图的 worker/ws 层去调用齐全没问题。
- api 层本人生成的 middleware,能够抽离出到公共目录,那就能够多个 api 目录应用同一个 middlerware 了。
- 等等等啦
go-zero 很轻量、很便捷、很博学。外面蕴藏的着很多常识以及理念。目前我只是用了皮毛,go-zero 的 k8s 部署,目前我没开始接入。持续致力努力学习啦!
再次感激
- https://www.yuque.com/tal-tec… go-zero 语雀文档
- https://github.com/tal-tech/g… go-zero 源码
我的项目地址:
https://github.com/tal-tech/go-zero