跳转至

开篇词 如何成为Go服务开发高手?

你好,我是徐逸,欢迎来到我的 Go 服务开发高手课。

先简单做个自我介绍。我一直在大厂使用 Go 做开发工作。先前负责过腾讯云网络自动化平台、腾讯少儿教育 App 开心鼠的产品研发。目前,我在另一个大厂负责亿级DAU产品的后端研发工作,通过高并发设计、性能优化和稳定性建设,支撑了部分场景千万DAU、百万QPS访问。

近些年来,我留意到很多公司和团队开始使用 Go 进行项目开发或是积极转向Go。其中既包括腾讯、阿里、字节这样的大厂,也不乏一些快速发展的新兴赛道(比如Web 3领域)以及创业公司。

从公司的视角很好理解,选择 Go 就是因为它的超高性价比,在确保功能与性能能够满足业务诉求的前提下,尽可能降低所投入的时间以及人力成本。

相应地,求职市场上 Go 相关岗位的待遇也比较可观,尤其是高级的 Go 开发者、专家。而想要应聘或者晋升到这个level,就必须要深入了解 Go 语言技术原理,具备高并发、可扩展、高可用方面的实践经验。

Go 服务开发面临哪些挑战?

虽然Go语言容易上手,但在实践中想真正用Go做好服务开发并不容易。随着公司业务发展,Go项目的复杂度也越来越高,研发除了完成各种产品功能需求外,还要应对技术需求的挑战。

就我的亲身经验和观察来看,最常见但也最有挑战性的需求是以下几类:

首先就是性能需求,这是支撑我们产品或服务发展的核心基础。除了堆机器,我们还需要掌握提升服务吞吐、优化性能的可行方案。

其次是可维护需求,这是我们保证乃至提升工程效率的强大保障。这需要我们掌握项目拆分、目录结构和代码设计的相关技巧。

最后还有稳定性需求,为了把故障消灭在萌芽里,服务的稳定可靠也十分重要。为了保障服务的稳定性,我们需要掌握常见保障服务稳定性的Go编码技巧和架构、流程手段。

可以说应对上面这些需求,既是我们Go开发者的必修课,也是区分初级Go开发和中高级Go开发的分水岭。

成为Go服务开发高手难在哪?

不过比起单纯掌握Go语言来说,想要掌握这些技能并不容易。

根据我的观察,很多人都挣扎在一知半解的状态,要么对原理一知半解,要么是编码、架构和流程方面的技能不扎实,或者虽然有相关知识的储备,但就是不会用。

比如性能优化方面,虽然知道一些用协程做并发处理的技巧,但并不清楚原理。这样一来,遇到延时问题,就可能会盲目地增加协程数量,结果反而导致系统资源过度消耗,性能下降,而又无法从原理层面去分析和解决。

还有些同学,对Go语言原理很熟悉,但是当真正碰到性能任务时,却不知道该如何快速定位性能瓶颈。而且,知道了瓶颈,除了语言编码方面,也不知道该怎么从框架和架构层面做优化。

再比如系统可维护方面,很多人虽然会注意命名规范,但是项目的目录结构却非常混乱,不注意按职责分层,这直接升高了理解和修改的成本。

我还留意到,有一些人虽然学习过设计模式方面的知识,但在实际的项目实践当中,却并不清楚应当如何去运用这些设计模式。

就拿常见的情况来说,在代码中时常会出现很长一串 if-else 语句块来处理不同的情况。但实际上,其中有不少场景是可以借助策略模式来解决的,可我们要么压根就没有想到能够运用策略模式来处理,要么甚至都没有意识到,自己所编写的代码在本质上其实已经趋近于使用了策略模式,只是没有以一种规范、清晰的策略模式结构来呈现。

同样,在服务稳定性方面,很多朋友也存在知识盲区。比如说虽然知道灰度发布,但没掌握灰度发布过程要点,最后导致大批量线上用户下不了单,造成事故。在架构上,有些人也不知道该怎么保障线上服务的稳定性。比如偶尔有突发流量,服务直接被打爆,不知道提前限流。或者是下游有问题,不知道该怎么降级,也不知道怎么防护自身,导致核心业务场景受损。

说了这么多,其实我们和高手的差距无非是这三个层面:

  • Know What(是什么):性能、可维护性、稳定性方面的知识和技能缺失。
  • Know How(怎么做):掌握了一定的知识和技能,但不知道该如何用到实处。
  • Know Why(为什么):虽然积累了一定的技巧和解决方案,但并没掌握底层原理,情况稍一复杂就无法灵活应对。

我们课程是如何设计的?

我始终认为,任何技术都是为了解决问题而存在的,所以我结合自己工作中的实践、思考和总结写下了这门课程,目的是让你能够独立应对并高效解决生产实践里的技术难题,成为 Go服务开发领域的高手。

为了实现这一目标,大部分课程我们都会先还原生产实践场景里的痛点问题,然后一步步分析和动手实现,剖析相关原理,最终让你真正融会贯通。

比如说学习高性能数据的处理技巧(第四节课),我们就会从一段有性能问题的代码开始,带你用火焰图和Benchmark工具去做性能优化,在这个过程中,逐步学习Go语言底层是如何实现的,为什么这些处理技巧可以提升性能。

在比如讲如何组织项目目录结构(第十六节课),我们也不是上来就直接介绍一个清晰的项目目录结构,而是会从一个维护复杂的大文件开始,带你逐步重构成分层目录结构,让你知道目录的每一层是怎么来的,为什么要分层。

再说说这门课程的整体规划,一共分为3章。

第一章:高性能实践

高并发场景下对性能有着极致要求,需要从多个关键方面进行优化。这个部分我们学习服务性能优化流程、性能优化工具、高性能编码和架构技巧等,让你在高并发场景下如鱼得水,轻松应对各种性能挑战。

第二章:代码可维护实践

代码可维护是软件长期发展的关键。这部分我们将学习 Go 语言中实现维护性强的项目的各种实践,包括项目拆分、目录结构设计、常用的设计原则和设计模式、函数设计等。让你打造出易于扩展、容易理解的高质量软件系统。

第三章:服务稳定性实践

软件系统的稳定、可靠也至关重要。第三章包含编码、架构和流程3个方面,我们将掌握Go编程中容易踩的坑和编码规范,并学习如何从架构和流程上保证服务的稳定性(包括熔断、降级、限流、隔离、灰度发布等)。

学完这门课你将获得什么?

说了这么多,这门课到底能让你学到哪些具体的技能点呢?我用一张图展示一下。


当然,这门课目的不仅是想教给你一个个技能点,而是想让你掌握解决服务性能、代码维护性、稳定性方面实际问题的能力。学完整门课程之后,我们将会达成以下目标:

  • 掌握 Go 在高并发低延时场景下的性能优化方案,能够设计和编写出高性能的系统,提升服务吞吐,降低接口延时。
  • 学会构建维护性强的 Go 项目和代码结构,能够轻松应对未来的功能扩展和需求变化,提高代码的可读性和可扩展性。
  • 了解 Go 容易踩的坑和代码规范,从流程和架构上保障服务稳定性,确保写出无bug、稳定运行的系统,增强系统的稳定性。
  • 提升整体的 Go 编码和架构水平,能够开发出高效、可靠、易于维护的软件系统,为企业和个人项目带来更大的价值。

最后,关于怎么学习这门课,我还想给你一些建议。

  1. 第一,注重实战。课程所有的演示源码,我都会放在 Github 上。建议你学习完每节的图文内容以后,亲自动手跑跑代码,看看实际效果。
  2. 第二,注重思考。课程里的内容来自于我从工作实践中的思考和总结。我希望你在学习的时候,除了关注技能点,还能留意技能的使用场景,掌握我用这个技能点解决问题的思考过程。这样你才能举一反三,把学到内容在实际工作里灵活运用。

高手不是一蹴而就的奇迹,而是稳定持续地变强。让我们踏上Go服务开发高手的修炼之旅,一同迎接更广阔的未来!

精选留言(8)
  • 请务必优秀 👍(2) 💬(2)

    老师对目前字节部分服务开始go转rust怎么看呢,甚至会将一个go服务其中一部分用动态链接库的形式拿rust重构

    2024-12-10

  • 请务必优秀 👍(1) 💬(2)

    希望有一些实际的生产故障案例排查案例过程

    2024-12-10

  • Alex_Shen 👍(0) 💬(1)

    老师的思维导图用的什么工具

    2025-01-07

  • WenjieXu 👍(0) 💬(1)

    创作不易,支持一下!正好想系统看下性能调优方面的知识。

    2024-12-22

  • 🇲 🇳 🇸 🇮 🇳 🇷 👍(0) 💬(1)

    希望有所收获!

    2024-12-18

  • Geek_2302dc 👍(0) 💬(1)

    刚准备好好学一下,发现老师还在写,支持一下,希望能结合实际场景深入浅出的讲一下

    2024-12-11

  • 彭梦清 👍(0) 💬(1)

    支持大佬

    2024-12-10

  • CodeFish-Xiao 👍(0) 💬(1)

    看这个大纲感觉挺有用的,可以追一手

    2024-12-09