〖课程介绍〗:
- 课程设计对标字节跳动 2-2,教学贴近大厂真实场景
- 资深 Go 工程师手把手带你实现能力进阶
- 资深 Go 工程师,某互联网公司技术总监
- 毛剑有近十年的服务端研发经验,他擅长高性能、高可用的服务端研发。毛剑是忠实的 Go 语言粉丝,也是一名 Go 语言老手,他曾在 GitHub 上开源了几个基于 Go 语言的项目,如果你想了解他的技术实力,可以点进去看看,毕竟,Talk is cheap,Show you the code。
- 另外,毛剑作为嘉宾,也在 QCon、ArchSummit、GopherChina 等业界知名会议上做过 Go 相关的技术干货分享。
- 作为资深架构师,他参与了某大型互联网公司从单体架构到微服务架构的完整转型,并从中收获了很多经验,这其中包括微服务治理、可用性设计、数据一致性设计、缓存、消息队列、监控、日志、负载均衡,以及 RPC 框架等。
- 作为公司的技术专家,他还负责公司的 Go 工程师招聘,所以他非常了解一线互联网公司对于 Go 工程师的能力要求,以及 Go 工程师在成长过程中,可能会遇到的问题。
- 熟练掌握 Go 语言,熟悉 Goroutine、Channel、锁、GC 等核心特性;
- 具备 3 年以上后端开发经验,并具有 1 年以上 Go 语言服务端开发经验;
- 熟练掌握 Golang 常用框架,深入了解框架提供的特性及其实现原理细节;
- 熟悉常见的中间件技术,包括但不限于 MySQL、RPC、MQ、Redis 等;
- 了解分布式技术,具备扎实的工程经验和软件设计能力;
- 熟悉微服务架构,具有高并发或大型 Go 项目经验者优先。
〖课程目录〗:
模块一:Go 语言实践 – Runtime
教学目标
- 了解 Go 语言中 Goroutine 的调度原理
- 了解 Go 语言中的内存模型
- 了解 Go 语言中 GC(垃圾回收)的原理
- 了解 Go 语言中 channel 的消息通讯原理
学习和工作中的痛点
- 分不清 Goroutine 和线程的区别
- 不熟悉 Go 的内存分配机制
- 搞不懂 GC 三色标记算法
- 不了解 channel 的底层实现
详细内容
- Goroutine 的实现、GPM 调度模型、调度状态及流转、调度原理、协作式抢占以及和网络库的协作
- Go 内存分配的内部结构和分配机制
- Go GC 介绍、三色标记的实现原理、GC 的流程以及 GC 的一些优化方案
- Go channel 的通讯机制、环形队列的结构、调度和唤醒的原理
模块二:Go 语言实践 – 并行编程
教学目标
- 了解 Go 语言中的 Memory Model
- 了解 Go 语言的并发特性并发编程模式:Timeout、Pipeline、Cancellation、Fanout、errgroup 等模式
- 了解 Go 语言中 Context 的原理并掌握其使用方法
学习和工作中的痛点
- 搞不清楚 Go 中内存模型和同步语义
- 无法熟练使用基于 channel 通讯方式的并行编程模式
- 不明白 Context 传播式传递有什么意义
详细内容
- 内存模型:Happens Before、同步语义、channel 通讯、锁
- 利用 channel 完成并行开发的设计模式,包含超时控制、管道、扇出、errgroup 并发
- 使用 Go 标准库 Context 的原理和最佳实践,包含超时控制、元数据传递、生命周期控制
模块三:Go 语言实践 – 网络编程
教学目标
- 熟练掌握 Go 语言中的 TCP 网络编程
- 熟练掌握 Go 语言中的 HTTP 网络编程
学习和工作中的痛点
- 不知道怎么用 Go 实现高性能的 TCP Server
- HTTP 框架有不少,但不知道怎样做选型
- 不会针对业务需求对 HTTP 框架做针对性的扩展
详细内容
- 结合 goim 项目了解 Go 语言中 TCP Server 的基础库和性能优化方案
- 结合 gin 项目了解 Go 语言中的 HTTP Server 的基础库和框架
模块四:Go 语言实践 – 异常处理
教学目标
- 了解 Go 语言中 error 的处理方法
- 了解 Go 语言中业务错误的处理方法
学习和工作中的痛点
- error 的处理复杂,不会正确使用
- 业务错误定义和 error 整合难度较高
详细内容
- Go 语言中的 error 处理实践:检查错误、定义错误、追加上下文
- Go 项目中的业务错误码如何结合 error 的最佳实践
模块五:Go 工程化实践
教学目标
- 了解 Go 项目中良好的项目目录组织原则和规范
- 了解 Go 项目中 API 的设计方法和规范
- 了解 Go 项目中 Package 的管理和设计方法
- 了解 Go 项目中的单元测试方法
学习和工作中的痛点
- 不知道怎么做 Go 项目的标准化管理
- 总是设计出各种不合理的 API
- 不知道怎么做包管理
详细内容
- 良好的 Go 项目中的分层目录结构组织和代码规范
- Go 项目中 API 的设计原则和方法:定义、状态和业务错误码处理
- Go 项目中包的设计和最佳实践、go mod 的使用
- go test 工具链的使用方法、单元测试的最佳实践以及 Mock 技术
模块六:Go 架构实践 – 分布式架构(前端负载均衡)
教学目标
- 掌握高可用 DNS 的最佳实践
- 了解 CDN 的架构和应用场景
- 深入理解 4/7 层负载均衡的原理
学习和工作中的痛点
- 缺乏对在线服务的全链路视野
- 不了解应用服务上层的负载均衡
详细内容
- DNS 的原理、防劫持的方法、HTTPDNS + IP 长连接
- CDN 的系统架构、应用领域以及保证数据一致性的方法
- LVS、Nginx 4/7 层负载均衡的原理和实践
模块七:Go 架构实践 – 分布式架构(数据分片)
教学目标
- 掌握数据 Sharding 的设计原则
- 了解 Hash 分片的算法和演进历史
学习和工作中的痛点
- 不了解 Sharding 的应用场景,不会合理使用
- 搞不清楚各种变种 Hash 算法的使用场景
详细内容
- 架构设计中的数据分片设计,如:分库分表、多活的 Shard 设计等等
- 分片算法的 Hash 实现和演进:Hash 求余、一致性 Hash、有界负载一致性 Hash、节点映射
模块八:Go 架构实践 – 微服务(微服务概览与治理)
教学目标
- 了解微服务的演进历史及它的优缺点
- 了解微服务的设计方法
- 了解微服务中 RPC 的底层原理
学习和工作中的痛点
- 不理解微服务的服务角色:API Gateway、BFF 还是 Service?
- 不知道怎么做微服务拆分
- 不理解 RPC 的原理,不知道如何进行微服务 RPC 框架的选型
详细内容
- 微服务的原理、概念,以及微服务的实现细节
- API Gateway、BFF、Service 等概念精讲
- 微服务通讯 RPC 框架的细节和选型
模块九:Go 架构实践 – 微服务(可用性设计)
教学目标
- 掌握可用性设计的最佳实践
- 了解可用性设计的几大关键点:隔离、超时控制、过载保护、限流、容错&重试
学习和工作中的痛点
- 不知道如何设计高可用的分布式服务
- 不清楚如何提升服务自愈能力
详细内容
- 微服务的隔离实现,以及架构设计中的隔离实现
- 进程内超时控制和跨进程超时控制
- 程序自保护避免过载,抛弃一定的流量完成自适应限流
- 单机限流、多租户场景的分布式限流
- 节点故障的容错逻辑、重试容错的策略和设计
模块十:Go 架构实践 – 中间件(日志、指标、链路追踪)
教学目标
- 了解 Go 项目中的日志收集
- 了解 Go 项目中的监控指标体系
- 了解 Go 项目中的分布式链路追踪
学习和工作中的痛点
- 不知道如何解决微服务的可观测性难题
- 不清楚怎么做微服务的可视化和标准化
- 出故障后,难以对微服务进行问题诊断
详细内容
- 实现一个可以集中收集所有微服务实例的日志,并能统一查看和检索的日志采集架构
- 指标监控、使用 Prometheus 解决监控可视化、指标采集
- 微服务中的跨服务性能问题诊断,结合 Jaeger 实现分布式链路追踪
模块十一:Go 架构实践 – 中间件(缓存、数据库)
教学目标
- 了解 Redis、Memcache 的原理和实战技巧
- 了解 MySQL 的常用设计和优化方法
学习和工作中的痛点
- 不会解决缓存的一致性问题
- 不知道怎样合理地设计 MySQL 的表
详细内容
- Redis、Memcache 的应用场景、最佳实践,以及缓存的一致性设计
- MySQL 的表设计、常用优化手段,以及如何解决分布式事务
模块十二:Go 架构实践 – 中间件(消息队列、服务发现)
教学目标
- 深入理解消息队列的原理,掌握基于消息队列的架构设计方法
- 服务发现原理、选型策略,以及服务发现实现的微服务多租户架构
学习和工作中的痛点
- 不会做消息解耦的架构设计
- 不清楚如何实现服务发现对平滑发布的支持
- 不知道怎样利用多租户实现多测试环境
详细内容
- Kafka 的实现原理、异步消息系统的架构设计
- RPC 服务发现、动态地址的选型和实现原理,以及基于服务发现的平滑重启和多租户架构
〖视频截图〗: