学习资料:https://liuqh.icu/categories/Go/page/3/
课程大纲
模块一:Go 架构实践 - 微服务(微服务概览与治理)
教学目标:
-
了解微服务的演进历史及它的优缺点
-
了解微服务的设计方法
-
了解微服务中 RPC 的底层原理
-
多集群、多租户的概念
学习和工作中的痛点:
-
不理解微服务的服务角色:API Gateway、BFF 还是 Service?
-
不知道怎么做微服务拆分
-
不理解 RPC 的原理,不知道如何进行微服务 RPC 框架的选型
详细内容:
-
微服务的原理、概念,以及微服务的实现细节
-
API Gateway、BFF、Service 等概念精讲
-
微服务通讯 RPC 框架的细节和选型
-
多集群、多租户解决全链路压测、多测试环境等
模块二:Go 语言实践 - 异常处理
教学目标:
-
了解 Go 语言中 error 的处理方法
-
了解 Go 语言中业务错误的处理方法
学习和工作中的痛点:
-
error 的处理复杂,不会正确使用
-
业务错误定义和 error 整合难度较高
详细内容:
-
Go 语言中的 error 处理实践:检查错误、定义错误、追加上下文
-
Go 项目中的业务错误码如何结合 error 的最佳实践
模块三:Go 语言实践 - 并行编程
教学目标:
-
了解 Go 语言中的 Memory Model
-
了解 Go 语言的并发特性并发编程模式:Timeout、Pipeline、Cancellation、Fanout、errgroup 等模式
-
了解 Go 语言中 Context 的原理并掌握其使用方法
学习和工作中的痛点:
-
搞不清楚 Go 中内存模型和同步语义
-
无法熟练使用基于 channel 通讯方式的并行编程模式
-
不明白 Context 传播式传递有什么意义
详细内容:
-
内存模型:Happens Before、同步语义、channel 通讯、锁
-
利用 channel 完成并行开发的设计模式,包含超时控制、管道、扇出、errgroup 并发
-
使用 Go 标准库 Context 的原理和最佳实践,包含超时控制、元数据传递、生命周期控制
模块四:Go 工程化实践
教学目标:
-
了解 Go 项目中良好的项目目录组织原则和规范
-
了解 Go 项目中 API 的设计方法和规范
-
了解 Go 项目中 Package 的管理和设计方法
-
了解 Go 项目中的单元测试方法
学习和工作中的痛点:
-
不知道怎么做 Go 项目的标准化管理
-
总是设计出各种不合理的 API
-
不知道怎么做包管理
详细内容:
-
良好的 Go 项目中的分层目录结构组织和代码规范
-
Go 项目中 API 的设计原则和方法:定义、状态和业务错误码处理
-
Go 项目中包的设计和最佳实践、go mod 的使用
-
go test 工具链的使用方法、单元测试的最佳实践以及 Mock 技术
模块五:Go 架构实践 - 微服务(可用性设计)
教学目标:
-
掌握可用性设计的最佳实践
-
了解可用性设计的几大关键点:隔离、超时控制、过载保护、限流、容错&重试
学习和工作中的痛点:
-
不知道如何设计高可用的分布式服务
-
不清楚如何提升服务自愈能力
详细内容:
-
微服务的隔离实现,以及架构设计中的隔离实现
-
进程内超时控制和跨进程超时控制
-
程序自保护避免过载,抛弃一定的流量完成自适应限流
-
单机限流、多租户场景的分布式限流
-
节点故障的容错逻辑、重试容错的策略和设计
模块六:评论系统架构设计
教学目标:
-
评论系统的存储、缓存设计
-
评论系统的可用性设计
-
评论系统的架构设计
学习和工作中的痛点:
-
缓存的单飞加载,缓存的流控,缓存的优化技巧
-
缓存和存储的数据一致性设计,多级缓存的设计,热点缓存的应对
-
异步消息队列消峰设计
详细内容:
-
评论系统设计中结合消息队列如何做存储优化
-
评论系统设计中缓存、存储设计的方案
模块七:播放历史架构设计
教学目标:
-
掌握极高 TPS,高 QPS 系统的架构设计思路
-
掌握消息队列在海量数据持久化场景中的最佳实践
学习和工作中的痛点:
-
极高 TPS,高 QPS 系统在设计和优化中如何做取舍
-
对于海量写入如何消峰,提高系统吞吐
详细内容:
-
历史记录系统如何做架构设计和技术选型
-
历史记录系统设计中缓存、存储设计的方案
-
如何结合消息队列做数据持久化的优化
-
提升系统可用性的核心思想和技巧
模块八:Go 架构实践 - 中间件(缓存、数据库)
教学目标:
-
了解Redis、Memcache的原理和实战使用
-
了解MySQL的常用设计和优化
学习和工作中的痛点:
-
Redis、Memcache的应用场景、最佳实践,以及缓存的一致性设计
-
MySQL的表设计,常用优化手段,如何解决分布式事务
详细内容:
-
Redis、Memcache 的应用场景、最佳实践,以及缓存的一致性设计
-
MySQL 的表设计、常用优化手段,以及如何解决分布式事务
模块九:Go 语言实践 - 网络编程
教学目标:
-
熟练掌握 Go 语言中的 TCP 网络编程
-
熟练掌握 Go 语言中的 HTTP 网络编程
学习和工作中的痛点:
-
不知道怎么用 Go 实现高性能的 TCP Server
-
HTTP 框架有不少,但不知道怎样做选型
-
不会针对业务需求对 HTTP 框架做针对性的扩展
详细内容:
-
结合 goim 项目了解 Go 语言中 TCP Server 的基础库和性能优化方案
-
结合 gin 项目了解 Go 语言中的 HTTP Server 的基础库和框架
模块十:Go 架构实践 - 中间件(日志、指标、链路追踪)
教学目标:
-
了解 Go 项目中的日志收集
-
了解 Go 项目中的监控指标体系
-
了解 Go 项目中的分布式链路追踪
学习和工作中的痛点:
-
不知道如何解决微服务的可观测性难题
-
不清楚怎么做微服务的可视化和标准化
-
出故障后,难以对微服务进行问题诊断
详细内容:
-
实现一个可以集中收集所有微服务实例的日志,并能统一查看和检索的日志采集架构
-
指标监控、使用 Prometheus 解决监控可视化、指标采集
-
微服务中的跨服务性能问题诊断,结合 Jaeger 实现分布式链路追踪
模块十一:Go 架构实践 - 分布式架构(前端负载均衡)
教学目标:
-
掌握高可用 DNS 的最佳实践
-
了解 CDN 的架构和应用场景
-
深入理解 4/7 层负载均衡的原理
学习和工作中的痛点:
-
缺乏对在线服务的全链路视野
-
不了解应用服务上层的负载均衡
详细内容:
-
DNS 的原理、防劫持的方法、HTTPDNS + IP 长连接
-
CDN 的系统架构、应用领域以及保证数据一致性的方法
-
LVS、Nginx 4/7 层负载均衡的原理和实践
模块十二:Go 架构实践 - 中间件(消息队列、服务发现)
教学目标:
-
深入理解消息队列的原理,掌握基于消息队列的架构设计方法
-
服务发现原理、选型策略,以及服务发现实现的微服务多租户架构
学习和工作中的痛点:
-
不会做消息解耦的架构设计
-
不清楚如何实现服务发现对平滑发布的支持
-
不知道怎样利用多租户实现多测试环境
详细内容:
-
Kafka 的实现原理、异步消息系统的架构设计
-
RPC 服务发现、动态地址的选型和实现原理,以及基于服务发现的平滑重启和多租户架构
模块十三:Go 语言实践 - Runtime
教学目标:
-
了解 Go 语言中 Goroutine 的调度原理
-
了解 Go 语言中的内存模型
-
了解 Go 语言中 GC(垃圾回收)的原理
-
了解 Go 语言中 channel 的消息通讯原理
学习和工作中的痛点:
-
分不清 Goroutine 和线程的区别
-
不熟悉 Go 的内存分配机制
-
搞不懂 GC 三色标记算法
-
不了解 channel 的底层实现
详细内容:
-
Goroutine 的实现、GPM 调度模型、调度状态及流转、调度原理、协作式抢占以及和网络库的协作
-
Go 内存分配的内部结构和分配机制
-
Go GC 介绍、三色标记的实现原理、GC 的流程以及 GC 的一些优化方案
-
Go channel 的通讯机制、环形队列的结构、调度和唤醒的原理
大纲
微服务概览与设计 | 在自己的工作中,公司的微服务是如何划分的? |
---|---|
服务注册与发现的设计要点 | |
面试:微服务和模块化,究竟有哪些区别?对于不同规模的公司来说,我是应该模块化还是应该微服务化? | |
Go 语言实践 error | 如何设计 error code? |
如何利用 AOP 来统一记录错误? | |
Go 语言实践 Concurrency | Goroutine、线程、进程的统一抽象 |
利用 Context 来构建全链路 | |
channel 实现以及 sync 包 mutex 实现的面试要点 | |
Go 工程化实践 | 配置模块 API 设计,体会工程化实践 |
如何在公司内部搭建完整的 Go 代码质量体系? | |
静态代码质量检测、分支覆盖、设计利于测试的 API | |
微服务可用性设计 | 各种框架是怎么提供对可用性功能支持的? |
公司内部如何应用可用性保障? | |
微服务相关面试要点 | |
评论系统架构设计 | Cache 的各种模式以及 API 设计 |
评论系统架构设计相关面试要点 | |
播放历史架构设计 | 高可用高性能架构的设计套路 |
播放历史架构设计相关面试要点 | |
分布式缓存与分布式事务 | 分布式事务的三板斧与例子 |
SEATA 与事件驱动构建无分布式事务系统 | |
Redis 面试要点 | |
Go 语言编程实践-网络编程 | 用 TCP 来实现一个简单的 RPC |
网络编程相关面试要点 | |
日志&指标&链路追踪 | 如何在公司搭建完整的可观测性平台? |
各个框架如何集成可观测性中间件? | |
关注哪些指标以及一般的指标异常可能原因 | |
DNS & CDN & 多活架构 | 推进公司应用 CDN |
多活架构面试要点 | |
消息队列 - Kafka | 如何用 Kafka 解决问题? |
Kafka 面试要点 | |
Go 语言实践 - Runtime | 如何阅读源码? |
GC 面试要点 |
http://c.biancheng.net/golang/build/