我用go-zero开发了第一个线上项目

简介: 我用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都能看懂

简单说明一下:

  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源码
相关文章
|
2月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
257 4
|
4月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
357 0
|
2月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
501 4
|
6月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
371 61
|
5月前
|
监控 Java 编译器
限流、控并发、减GC!一文搞懂Go项目资源优化的正确姿势
本章介绍Go语言项目在构建与部署阶段的性能调优和资源控制策略,涵盖编译优化、程序性能提升、并发与系统资源管理、容器化部署及自动化测试等内容,助力开发者打造高效稳定的生产级应用。
|
5月前
|
测试技术 Go 开发工具
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
Go语言项目工程化实践中的开发工具与CI/CD支持,涵盖格式化、静态检查、依赖管理、构建打包、自动化测试及部署策略。内容包括常用工具如gofmt、go vet、golangci-lint、Docker、GitHub Actions等,并提供实战建议与总结,提升团队协作效率与项目质量。
|
5月前
|
NoSQL 中间件 Go
Go语言项目工程化 — 项目结构与模块划分
本章讲解Go语言项目工程化中的结构设计与模块划分,涵盖单体及分层架构方案,指导如何按功能组织代码,提升项目的可维护性、扩展性,适用于不同规模的开发场景。
|
5月前
|
JSON 安全 Go
Go语言项目工程化 —— 日志、配置、错误处理规范
本章详解Go语言项目工程化核心规范,涵盖日志、配置与错误处理三大关键领域。在日志方面,强调其在问题排查、性能优化和安全审计中的作用,推荐使用高性能结构化日志库zap,并介绍日志级别与结构化输出的最佳实践。配置管理部分讨论了配置分离的必要性,对比多种配置格式如JSON、YAML及环境变量,并提供viper库实现多环境配置的示例。错误处理部分阐述Go语言显式返回error的设计哲学,讲解标准处理方式、自定义错误类型、错误封装与堆栈追踪技巧,并提出按调用层级进行错误处理的建议。最后,总结各模块的工程化最佳实践,助力构建可维护、可观测且健壮的Go应用。
|
6月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
7月前
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。