我用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严谨
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-tech/go-zero/yaoehb go-zero语雀文档
- https://github.com/tal-tech/go-zero go-zero源码
我用go-zero开发了第一个线上项目的更多相关文章
- TODO:即将开发的第一个小程序
TODO:即将开发的第一个小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验.个人理解小程序是寄宿在微信平台上的一个前端框架,具有跨平台功能, ...
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- SharePoint使用BCS开发你第一个应用程序(一)
SharePoint使用BCS开发你第一个应用程序(一) 本系列教你使用BCS(Business Connectivity Service)创建OBA(Office business ...
- SharePoint使用BCS开发你第一个应用程序(三)
SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型. 创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoin ...
- Winform常用开发模式第一篇
Winform常用开发模式第一篇 上一篇博客最后我提到“异步编程模型”(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了 ...
- [翻译]现代java开发指南 第一部分
现代java开发指南 第一部分 第一部分:Java已不是你父亲那一代的样子 第一部分,第二部分 =================== 与历史上任何其他的语言相比,这里要排除c语言和cobol语言,现 ...
- 我的长大app开发教程第一弹:Fragment布局
在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...
- 2、Arx二次开发创建第一个应用程序
一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...
- EnjoyingSoft之Mule ESB开发教程第一篇:初识Mule ESB
目录 1. Mule ESB基本介绍 2. Mule ESB社区版和企业版 3. Mule ESB常用场景 4. Mule ESB软件安装 客户端安装 服务端安装 5. 第一个Mule ESB应用- ...
随机推荐
- kali 系列学习02 - 被动扫描
被动扫描是指目标无法察觉的情况下进行信息收集,注意有经验的渗透工程师会在信息收集上花费整个测试过程一半以上的时间,信息量太大,需要自动化的信息收集工具. 一.借鉴<kali linux2 网络渗 ...
- sqlilab less32-less37
less-32 过滤了单引号,双引号,斜杠,同时设置数据库为GBK编码,可以考虑宽字节注入, 当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字.用脚本来测试下哪些符合 ...
- 公司新来的小姐姐不懂java中的static关键字,这样给她描述不香吗?
前言 static关键字是摆在刚入行编程语言的小白们面前的一道难题,为什么要用static?使用它有什么好处?修饰方法和修饰变量有什么区别?本文将就java中static关键字的使用方法及注意事项进行 ...
- SpringSecurity之整合JWT
SpringSecurity之整合JWT 目录 SpringSecurity之整合JWT 1. 写在前面的话 2. JWT依赖以及工具类的编写 3. JWT过滤器 4. 登录成功结果处理器 5. Sp ...
- 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...
- ScheduledThreadPoolExecutor源码分析-你知道定时线程池是如何实现延迟执行和周期执行的吗?
Java版本:8u261. 1 简介 ScheduledThreadPoolExecutor即定时线程池,是用来执行延迟任务或周期性任务的.相比于Timer的单线程,定时线程池在遇到任务抛出异常的时候 ...
- 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天
[NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...
- redis的配置文件redis.conf常用配置
参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. 当Redis以守护进程方式运行时 ...
- 第9.6节 Python使用read函数读取文件内容
一.语法 read(size=-1) read函数实际上在读取文本文件和二进制文件时,调用的是不同类的read,这是因为文本文件和二进制文件打开后返回的文件对象类型不同,同时读取的具体处理机制上也不同 ...
- PyQt(Python+Qt)学习随笔:QListView的gridSize属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListView的gridSize属性用于控制视图中数据项排列所在网格的大小,gridSize默认 ...