Go 高级工程师实战营大纲

第一模块:Go深度剖析

1.Go 程序是怎么跑起来的

  • 教学目标:理解 Go 进程的启动过程,以调度循环串联相关的知识,理解 GPM 架构以及相关模型设计在不同阶段的问题及发展历史。
  • 工作痛点:看着源代码,迷失在茫茫的数据结构和字段中;面试总是被人考调度循环,只是了解一些概念,无法融会贯通
  • 详细内容:
    • Go 程序的启动过程
    • GPM 模型与调度循环
    • 全局队列与局部队列
    • 调度模型的发展历史

2.语法背后的秘密

  • 教学目标:通过学习 Go 内置的工具,了解如何将应用代码与底层代码做好对应;能够通过内置工具、调试器、源代码阅读对底层简单数据结构进行分析;
  • 工作痛点:学会了语法,但是找不到实现代码,看别人的 blog 云里雾里;自己翻代码经常发现找不到实现部分,然后放弃。
  • 详细内容:
    • 学习基本的编译原理知识,了解基本的词法分析、语法分析、编译、链接流程a
    • 了解 Go 内置的编译/反编译工具:compile -S / objdump / SSAFUNC
    • 使用工具分析 slice 的 append 实现
    • 学习函数调用规约,Go 语言为什么可以实现多个返回值
    • 其它语法糖分析:go func,select,channel send/recv

3.神奇的内置数据结构

  • 教学目标:学习 hashtable,timer 等复杂的数据结构实现;了解这些结构的进化历史和相关的优缺点;了解基本的 CSP 编程理念。
  • 工作痛点:内置数据结构只会使用 api,碰到了相关的问题不知道该从何下手,对相关数据结构的设计缺乏宏观认识。
  • 详细内容:
    • Go 语言的 hash 表实现:map 解析
    • Go 语言的 timer 实现演进
    • channel 的实现,CSP 理论基础

4.编程语言与操作系统的桥梁

  • 教学目标:了解基础操作系统接口知识,知道随着计算机体系结构的发展,系统调用是如何迭代进化的;知道如何去查询 syscall 的实现。
  • 工作痛点:代码的行为和操作系统的关联关系难以理解,我写的 make 怎么就变成了 OS 的内存分配?
  • 详细内容:
    • 了解 linux syscall 的原理
    • 理解 Go 语言是如何封装 syscall 的,哪些是 blocking syscall,哪些是 non blocking syscall
    • 一些常见的 syscall 科普:clone,tgkill,futex,madvise

5.Go 的内存管理与垃圾回收

  • 教学目标:理解基本的内存分配器原理;了解 tcmalloc 的设计理念;了解垃圾回收的繁多概念,建立相关的内存管理知识体系。
  • 为什么内存分配要设计成多级结构?为啥 GC 的 stw 都已经 1ms 以下了,我的应用延迟还是这么高?
  • 详细内容:
    • 内存分配原理讲解
    • GC 设计讲解
      • memory barrier 讲解
      • GC 调步讲解
  • 真实场景下的一些 GC 问题

6.Go 并发编程最佳实践

  • 教学目标:理解常见并发编程模型:包括 fanin,fanout,or channel 等;知道常见的并发 bug;学会避免或排查线上的并发导致的 bug;
  • 工作痛点:为什么给 string 变量赋值会 panic,难以理解;社区里的人对哪些操作是原子性的说法不一,令人困惑,我到底该相信谁。
  • 详细内容:
    • Go 语言常见并发模式一览(参考 concurrency in go)
    • 常见的并发 bug
    • 如何尽量避免并发 bug 被带到线上系统
    • 如何排查线上的并发 bug(如死锁、data race,map con write fatal等)

7.netpoll 与抢占式调度

  • 教学目标:理解 Go 语言的网络模型,netpoll,对基于信号的抢占式调度有一定了解
  • 工作痛点:有人说 Go 的网络抽象有缺陷,搞不清楚怎么回事
  • 详细内容:
    • C 语言中的网络编程
    • 阻塞与非阻塞
    • netpoll 介绍
    • 抢占式调度介绍

第二模块:Go高阶实战

1.社区优秀开源框架对比

  • 教学目标:了解当今流行的开源 web 框架设计,针对各个框架设计上的折衷进行讲解,具备对框架选择的判断能力。
  • 工作痛点:面对社区中名目繁多的框架,一个框架都列举了一大堆功能,画了复杂的架构图,不知道该怎么进行选择。
  • 详细内容:
    • 与其它语言相比,Go 的 web 框架有何特色
    • 了解社区中常见的框架:gin,echo,chi,go-micro,go-kit,beego,go-zero 的设计与取舍
    • 作为用户,学会框架选型。

2.深入框架原理与实现

  • 教学目标:深入理解当前开源社区的 web 框架设计,了解各组件的具体实现原理,能够实现自己的框架。
  • 工作痛点:工作这么多年,手边的框架还是只会用,被别人问起实现来还是一脸懵。公司内为了稳定性需要在框架中集成与基础设施绑定的模块,但不知道相关的功能应该实现在哪里。
  • 详细内容:
    • middleware 职责与原理讲解
    • orm 原理讲解,在 OLTP 系统中使用 ORM 的一些争议
    • router 原理讲解,为什么 router 都在追求 zero garbage
    • zap,viper,zerolog,cobra (日志,命令行工具,配置)如何选择开源库

3.框架之上的业务分层

  • 教学目标:了解 Go 语言的工程化问题,了解 API 分层思路;能够设计优雅的 API,并有自动化和文档化的意识;知道基本的领域驱动和整洁架构设计理念;能够对业务模块进行合理的分层。
  • 工作痛点:工作中一直在写业务逻辑,想要做一些工程效率的事情,不知从何下手;老是听人说六边形架构,整洁架构,就是听着有点懵;手边的业务模块总是觉得设计的有问题,又说不清楚哪里不对。
  • 详细内容:
    • 如何在框架中支持跨协议需求(既支持 http,又支持其它协议)
    • 理解 swagger 与 openapi 的优势和限制
    • 了解如何使用 clean architecture 和 DDD 的六边形架构对业务代码进行分层
    • 了解依赖注入的使用和原理
    • 企业级研发框架介绍

4.优雅的 Go 代码

  • 教学目标:能够使用社区的代码静态分析工具、标准和规范,并能将其落地到团队的项目,提升代码质量与团队成员的工作幸福感。
  • 工作痛点:工作中的代码一团乱麻,想要提升团队的代码质量,引入更高的标准要求个人或团队。
  • 详细内容:
    • Go 语言常见踩坑,effective go,50 shades,如何避免
    • linter 方案介绍,golangci-lint,pb lint
    • 如何写出优雅可读的代码(参考 the art of readable code 、重构等)
    • 如何进行 Go 的单元测试,性能测试,接口测试与集成测试,以社区项目 mosn 为例,gomock
    • 错误注入原理与实现,以 failpoint 为例
    • code review,如何给 Go 官方提 PR

5.知识落地-设计互联网高并发数据中台

  • 教学目标:根据企业实际需求,设计数据中台服务。了解巨头公司对实时数据的相关需求,了解 Google 的 F1 系统。
  • 工作痛点:碰到复杂的业务问题和学过的模式知识完全对应不起来,无法设计复杂的业务系统。
  • 详细内容:
    • 了解大公司中的复杂高并发数据中台架构设计
    • 针对业务场景进行读写放大优化
    • 了解基于 dag 的实时计算服务
    • 结合之前学到的框架组件,设计计算和配置分离的系统

6.服务上线后-成为 Go 语言性能调优专家

  • 教学目标:了解 Go 语言的 debug 方式;了解常见的性能调优切入点与调优手段;了解业界一流的公司在线上系统性能分析中做了哪些工作;在此基础上能够规划相关的性能分析平台。
  • 工作痛点:只会写逻辑,碰上性能问题一头雾水,只能依赖那些 Go 大神;渴望能够突破,并解决大部分应用层的性能问题。
  • 详细内容:
    • 如何阅读与调试开源项目代码
    • 通过 go test 找到函数性能瓶颈
    • 使用 ratelimit 工具实现固定 QPS 压测
    • 使用压测工具全局性能问题

第三模块:Go 工程化提升

1.微服务在复杂业务场景的拆分难题

  • 教学目标:了解微服务的常见拆分思路,深入学习更多微服务模式。学习拆分后的实际问题,并能够先进的业界经验给出方案。
  • 工作痛点:总是听架构师们说战术设计、战略设计,搞不懂和代码怎么关联;希望能够有复杂模块的设计和拆分能力。
  • 详细内容:
    • DDD 的战术设计/clean architecture/插件化架构
    • CQRS、Event Sourcing
    • 其它微服务设计模式
    • 了解微服务拆分后的利弊,Google 如何解决拆分后的数据质量问题

2.一线互联网公司持续集成与持续部署实践

  • 教学目标:了解如何在持续地迭代过程中保障项目质量,了解社区中的 CI && CD 方式,学习使用 github action 搭建自己的开源项目流水线
  • 工作痛点:公司的部署系统非常落后,每次上线都会出各种 bug,出事回滚 && 修复非常麻烦,想要了解一线互联网公司如何做 CI && CD
  • 详细内容:
    • 介绍 CI && CD 概念
    • 介绍 github action
    • 以真实开源项目为例,学习搭建开源项目的集成流水线

3.微服务的监控与可观测性

  • 教学目标:了解 prometheus 等监控工具,了解相关概念,和具体实现;了解 dapper 等分布式追踪概念,了解 open-tracing
  • 公司想要搭建统一的监控系统,不知道有哪些方法论可以遵循;希望能够学习社区的工具和规范,和先进生产力看齐。
  • 详细内容:
    • go-metrics 基本原理
    • 应该关注并监控 Go 的哪些内置指标
    • 了解 prometheus 等监控基本概念与使用
    • 了解 dapper 和 open tracing 规范
    • 使用 skywalking 等工具集成自己的 web 框架

4.微服务基础设施-服务发现、检索、定时任务、MQ

  • 教学目标:了解微服务架构下的周边基础设施,了解如何使用相关的基础设施设计合理的系统架构,并学习如何解决各种组件带来的相关问题。
  • 工作痛点:只在小公司工作过,发现大公司的人说的很多设施我们都没用过,有点迷茫。
  • 详细内容:
    • 服务发现原理与应用
      • etcd 类比 zk
      • consul 类比 eureka
    • elasticsearch 介绍
    • 分布式定时任务原理与应用
    • 消息队列基础
      • kafka 中的概念
      • exactly once

5.大型互联网公司的稳定性密码(高可用、高并发背后的密码)

  • 教学目标:了解大公司保障稳定性的一般方法论,如何对系统整体的可用性和稳定性设计相应的方案。
  • 工作痛点:工作内容不是 2C,没有什么并发量,跳槽面试时极为被动;希望获得体系化的稳定性知识。
  • 详细内容:
    • 全链路压测工具与实现
    • 限流工具介绍与应用
    • 熔断实现与应用
    • 重试,负载均衡
    • 互联网巨头的业务单元化 LDC

6.Cloud Native Go

  • 教学目标:了解 cloud native 语境下的微服务模式与设计。
  • 工作痛点:公司部署环境是上古 jenkins 和 hudson,想看看业界先进的微服务是怎么运转的
  • 详细内容:
    • cloud native 模式介绍
    • docker && k8s 介绍与应用
    • node,pod,service,daemonset 介绍
    • 拓展:大公司中的 k8s 黑魔法

7.Go 语言前沿解析(泛型、modules)

  • 教学目标:了解 Go 语言最前沿的演进与规划,了解 Go mod 的设计和实际使用中的各种问题,了解泛型的设计理念与相关一手资料。
  • 工作痛点:渴望知道一手的 Go 语言演进消息和设计资料,但又不知道从何渠道获知,自学总是找不到人交流。
  • 详细内容:
    • go mod 设计原理与常见问题
    • 学会使用一手消息源,跟踪 Go 社区的发展
    • 学习阅读官方的 proposal,以 open coded defer 为例
    • 泛型简介和应用

8.Go 语言与未来架构探索

  • 教学目标:了解基于 service mesh 或 dapr 的新一代互联网后端架构思潮。
  • 工作痛点:一直在小公司工作,对人们讲的新架构非常感兴趣,苦于没有机会接触,一直停留在羡慕和观望阶段。
  • 详细内容:
    • service mesh 介绍与应用
    • dapr 介绍与应用
    • service mesh 与 dapr 关键剖析

实战项目

项目一:企业级微服务框架设计

  • 项目背景:
  • 该项目会分析当前开源社区中的大部分微服务框架实现,并按照实际的落地需求整合一套能够生产可用的框架出来,使你能够胜任互联网公司框架组的工作岗位。
  • 应用技术栈:
    • Redis,MySQL,Kafka,Go
  • 核心内容:
    • 理解 web 框架的主要组成模块,并整合成为完整的框架,可在公司内使用。
      图片
      图片
      图片

项目二:性能优化实战

  • 项目背景:
  • 在高并发互联网系统中经常会碰到语言使用不当导致的性能问题,有些甚至是 Go 语言本身的性能问题。我们希望能够有适当的方法论来帮助你找到项目的瓶颈,并合理优化。
  • 应用技术栈:
    • wrk,go test bench,pprof,go-metrics 等
  • 核心内容:
    • 本项目会分析几个互联网巨头的实际线上性能问题,通过解决这些问题帮助你加深对 Go 性能优化的理解。
      图片
      图片

项目三: Go 语言在线诊断平台

  • 项目背景:
  • 超大规模的微服务基础设施,线上随机崩溃,为了能够睡好觉,又能给用户和老板合理的解释,我们需要设计一套完整的系统来揪出这些问题的根因。
  • 应用技术栈:
    • continuous profiling,conprof,profefe,Pyroscope 等
  • 重点收获:
    • 扩展对稳定性问题的认知
    • 了解业界先进的问题定位方法论
    • 基于课程中学到的工具,构建完整的问题诊断平台

作业:

  • 粗略是下面这些,上课期间要调整
    图片

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com

×

喜欢就点赞,疼爱就打赏