Go 实战训练营 大纲
2022年6月1日 更新
开启更多功能,提升办公效能

大纲示意图

前面九周讲的内容足以用于构建单体应用。

引入微服务框架之后,就可以用来构建微服务应用。

序号是学习顺序。











实践练习汇总

Go 进阶语法

  • 设计并实现一个服务端优雅退出机制
  • 利用反射实现一个 RPC 代理(代理模式)
  • 搭建简单的 TCP 服务
  • 为接口生成 HTTP 客户端调用代码
  • 利用 unsafe 和反射读写字段,并且压测其性能
  • 利用反射为结构体构造 INSERT 查询

Web 框架

  • 设计并实现一个 Web 框架
  • 设计并实现前缀路由树,支持通配符匹配,路径参数匹配
  • 完整支持基于 JSON 的 RESTful API
  • 设计并实现 AOP 方案,提供logging,tracing, metric 支持
  • 支持静态资源
  • 压测、分析、优化性能 (CPU 和 内存分配)
  • 设计并实现 session
  • 基于前两者,实现简单的用户注册、登录服务
  • 基于 JWT 的登录方案

ORM 框架

  • 设计并实现一个简单的 ORM 框架
  • 支持 SELECT,INSERT,DELETE,UPDATE,以及 UPSERT
  • 支持反射和 unsafe 两种处理器,并且压测比较两者性能差异
  • 设计并支持 AOP 方案,提供 logging, tracing, metric 的支持
  • 支持子查询,JOIN 查询和 UNION 查询
  • 压测、分析、优化性能 (CPU 和 内存分配)
  • 为用户服务接入自己设计的 ORM 框架

缓存框架

  • 设计一个统一缓存 API
  • 设计并实现一个本地内存
  • 为 API 提供基于 Redis 的实现
  • 利用装饰器模式实现 read-through,write-through,write-back 缓存模式
  • 利用设计模式解决缓存击穿、缓存穿透和缓存雪崩问题
  • 利用Redis实现一个简单分布式锁
  • 为用户服务接入缓存

微服务框架

  • 设计并实现一个简单的微服务框架
  • 设计并实现一个基于 TCP 的 RPC 协议
  • 基于 RPC 协议支持服务注册与发现
  • 基于 RPC 协议支持Cluster,路由和负载均衡功能
  • 基于 RPC 协议解决全链路的可观测性问题
  • 将自己的用户服务从单体应用重构为微服务框架,其中微服务框架选用自己设计并实现的框架


设计文档展示:



模块一 Go 进阶语法

教学目标:

  • 掌握 Go 并发编程,熟练使用 Go 内置类型和并发包
  • 掌握 Go 反射,unsafe,深入理解 Go 对象内存布局
  • 掌握 Go IO 编程,熟练使用 TCP 进行通信
  • 掌握 Go SQL 编程,熟练使用原生 SQL 完成增删改查
  • 掌握 Go 模板和 Go AST 操作,熟练结合两者打造代码生成器
  • 为构建复杂和高性能应用打下基础


学习和工作中的痛点:

  • 掌握了 Go 的基本语法之后,不知道下一步该干什么;
  • 缺乏真实场景来练习进阶语法,对于一些 API 仅仅局限于会用的程度,但是不清楚实践中究竟可以用于哪些场景;
  • 单一的包、或者 API 能够熟练使用,但是综合在一起运用就不知道如何下手;

实践练习

  • 综合利用 channel, sync 包 和 context 包,实现一个服务端优雅退出的机制
  • 利用反射来实现代理模式,捕捉本地调用的方法名、参数
  • 利用 Go IO 编程搭建一个简单的 TCP 服务,确保可以正常发送和接收数据
  • 综合运用 Go AST 编程、Go 模板、Go 反射 和 SQL 编程,设计一个代码生成器,为接口定义生成 HTTP 调用代码
  • 使用 unsafe 和反射来读写结构体字段,并压测其性能
  • 利用反射,将一个对象转化为一个 SQL INSERT 语句

详细内容

第一周

  • context 包详解,利用 context 包传递上下文和控制超时
  • context 与调用链路元数据传递
  • 开源实例:
  • DB.Conn 利用 context 超时控制
  • http.Request 使用 context 作为字段
  • errgroup.WithContext 传递信号,以及 Kratos 利用信号的例子
  • 面试要点
  • sync 包详解,包含 Mutex, RWMutex, Once, Pool, WaitGroup
  • Mutex 和 RWMutex:理解锁的不可重入性,理解锁使用不当导致 goroutine 泄露
  • 代码演示:
  • 综合运用 RWMutex 与装饰器模式:实现一个线程安全的 ArrayList
  • double-check 写法
  • Once:利用 Once 来确保只执行一次,设计单例
  • 开源实例:Beego 利用 Once 初始化 web 模块
  • Pool:理解 Pool 的内存管理策略,
  • 代码演示:
  • 利用 Pool 实现一个简单的 buffer 池
  • 利用泛型封装 Pool
  • 开源实例:bytebufferpool 的实现要点
  • WaitGroup:利用 WaitGroup 来协调不同 goroutine 共同完成任务
  • 面试要点
  • channel 详解:
  • 理解缓冲 channel 和无缓冲 channel
  • channel 与 goroutine 泄露
  • channel 与内存逃逸
  • 代码演示:
  • 实现一个基于内存的消息队列
  • 实现一个简单的任务池:利用有限的 goroutine 来执行用户提交任务
  • 面试要点

第二周

  • reflect 包详解:
  • Go 类型系统
  • 掌握 reflect.Type, reflect.Value, reflect.Field, reflect.Kind 和 reflect.Tag 的用法
  • 代码演示:
  • 利用反射输出字段信息
  • 利用反射输出方法信息,并且发起调用
  • 利用反射遍历切片和 map
  • 开源实例
  • Beego, GORM 利用反射解析 ORM 模型
  • Dubbo-go 利用反射生成 RPC 代理
  • 面试要点
  • unsafe 详解
  • 掌握 Go 对象内存布局
  • 掌握计算 Go 结构体中字段的偏移量计算
  • 代码演示:使用 unsafe 读写字段
  • 利用 go fuzzing 测试演示代码
  • 性能测试:使用 unsafe 和反射读写字段的性能差异
  • benchmark 测试
  • memory profile, CPU profile
  • 内存逃逸分析
  • 面试要点
  • Go IO 详解
  • 掌握使用 Go 完成 TCP、UDP 通信
  • 代码演示:
  • 搭建简单的 TCP 服务器
  • 利用 channel 来设计简单的连接池
  • 开源实例:
  • SDK database 中连接池解析
  • Dubbo-go 利用 getty TCP 通信构建 RPC
  • 面试要点

第三周

  • SQL 编程详解
  • 掌握 Go 直接使用 SELECT、UPDATE、DELETE 和 INSERT 语句
  • 掌握 Go 中事务的 API
  • 掌握 Go 中 PrepareStmt 语句的使用
  • 开源实例:GORM,Beego 利用 SQL 编程构建 ORM 框架
  • 面试要点
  • Go AST 编程详解
  • 掌握 AST 的基本概念
  • 使用 AST API 读取源代码,解析成 AST
  • 读取或者修改 AST,并还原为源代码
  • 代码演示:利用 AST 解析注释中的注解
  • 面试要点
  • Go 模板详解,掌握定义变量、循环、条件判断等基本语法
  • 代码演示:利用 AST 中解析的注解,为接口生成 http 调用代码
  • Go 编程规范:
  • 代码规范
  • 利用 table driven 编写单元测试
  • 注释规范
  • 编写公共 API 的例子
  • Go 部署


模块二 Web 框架

教学目标:

  • 掌握 Web 框架的基本原理
  • 掌握如何设计并且实现一颗前缀路由树,支持通配符匹配,路径参数
  • 掌握 http Server 和 Context 的设计,并且提供丰富 API
  • 掌握 http 中 session 的设计和实现
  • 掌握 Web 框架中 AOP 的解决方案
  • 设计并实现简单的静态资源服务器

学习和工作中的痛点:

  • 用过很多 Web 框架,但是并不了解 Web 框架的原理,并不知道怎么注册路由,怎么执行路由匹配。面试的时候无法清晰阐述前缀路由树的原理;在实际开发中,不知道如何快速定位 404 之类的错误;
  • 不知道如何设计统一的 session 抽象,支持 session 运行在本地内存或者 Redis 上;
  • 无法灵活运用 Web 框架提供的 AOP 方案解决登录校验、鉴权、日志、tracing、logging 等问题;

实践练习

  • 设计一个 http Server,该 http Server 将会基于前缀路由树支持路由通配符匹配,路径参数
  • 为 http Server 添加静态资源支持(css, js 等)
  • 为 http Server 添加 session 功能
  • 为 http Server 设计 AOP 方案
  • 利用该 http Server 实现简单的用户 API,支持注册、登录等
  • 利用该 http Server 的 AOP 方案解决登录校验、日志、tracing 和 metric 问题
  • 利用该 http Server 的 session 功能,维护登录态

详细内容

第四周

  • Web 框架要解决的主要问题:路由注册与路由匹配
  • http Server 抽象和 Context 抽象
  • 开源实例:Gin,Beego 中的 Server 和 Context 抽象
  • 代码演示:设计并实现 Server 和 Context,提供针对 JSON 的辅助方法
  • 设计并实现前缀路由树:
  • 开源实例:httprouter, Gin,Beego 中的路由树设计
  • 前缀路由树的原理
  • 前缀路由树设计
  • 代码演示:实现前缀路由树,支持通配符匹配和路径参数
  • 面试要点
  • 支持 session:
  • 开源实例:Beego 中 Session 模块
  • 代码演示:Session API 设计与实现
  • 基于内存的实现
  • 基于 Redis 的实现
  • 面试要点

第五周

  • 支持 AOP 方案:
  • 开源实例:
  • Gin 中 Handler 的设计与实现
  • Beego 中 Filter 的设计与实现
  • Kratos 中 middleware 的设计与实现
  • 代码演示:为 Web 框架提供 AOP 支持,并且支持
  • 日志
  • tracing
  • metric
  • 面试要点
  • 静态资源支持
  • 开源实例:Gin 和 Beego 中的静态资源支持
  • 代码演示:设计并实现一个可配置、可扩展的静态资源处理器
  • 基于该 Web 框架的简单用户服务
  • JWT
  • 用户 Session
  • 登录态校验

模块三 数据库查询 —— ORM 框架

教学目标

  • 掌握 ORM 的核心概念
  • 掌握对象-SQL 映射,掌握不同数据库查询语言差异
  • 掌握数据库查询结果集-对象映射,能够使用反射和 unsafe 高性能处理结果集
  • 掌握 ORM 对数据库事务的支持,以及常见的事务扩散解决方案
  • 掌握 ORM 回调设计和常见使用场景
  • 掌握 ORM 和配置中心的集成
  • 掌握 Web 框架、微服务框架和 ORM 框架结合的全链路观测

学习和工作中的痛点

  • 在日常工作中,数据库查询占了相当大比例的工作内容,但是大多数时候只会使用简单的增删改查,不知道如何观测数据库查询的性能,也不知道如何使用 ORM 框架的高级查询;
  • 只知道当使用 ORM 框架的时候,它会把对象转化为查询,再把结果集转成对象,但是不知道这个过程是怎么进行的,在面试的时候就无法解释清楚;
  • 无法结合 WEB 框架、微服务框架、ORM 框架等整条链路上的各个中间件设计高级解决方案,如全链路观测

实践练习

  • 结合模块一中的实践练习,设计一个简单的 ORM 框架,实现简单的 SELECT、UPDATE、DELETE 和 INSERT 支持
  • 使用自己的 ORM 框架替换用户系统中的数据库查询模块
  • 综合已有的微服务可观测性模块,集成 ORM 可观测性,做到全链路观测用户服务性能
  • 为自己的 ORM 框架设计简单的 AOP 方案,并且支持慢查询监控
  • 为自己的 ORM 框架添加事务支持,提供事务闭包 API
  • 重构用户服务的缓存功能,改用 ORM 的回调机制支持缓存

详细内容

第六周

  • 理解 ORM 框架的核心概念
  • 对象——SQL映射
  • 结果集 —— 对象映射
  • 开源实例:Beego,GORM,ENT 功能简介
  • 模型注册
  • 查询执行(以 SELECT 为例)
  • 结果集处理
  • 使用 Builder 模式灵活支持各种查询语句
  • ORM 模型元数据系统设计
  • SELECT:支持 WHERE,HAVING,GROUP BY,ORDER BY,LIMIT,聚合函数
  • UPDATE:支持指定列及其表达式
  • INSERT:支持单个插入、批量插入,以及 UPSERT 语义
  • DELETE
  • 设计简单的 buffer pool,减少内存分配
  • 开源实例:
  • GORM 中 SQL 构造
  • Beego 中 SQL 构造
  • 代码演示
  • SELECT 支持
  • INSERT 和 UPSERT 支持
  • 多方言支持
  • MySQL
  • SQLite
  • PostgreSQL
  • 开源实例:Beego 和 GORM 中多方言支持

第七周

  • 事务 API
  • BEGIN、COMMIT 和 Rollback
  • 事务闭包
  • 事务扩散方案
  • 开源实例:Beego,GORM 中事务 API 设计与实现
  • 代码演示:为 ORM 框架提供事务支持
  • 设计结果集处理引擎,用于组装对象
  • 利用反射
  • 利用 unsafe
  • 代码演示:设计结果集处理引擎:
  • 提供反射实现
  • 提供 unsafe 实现
  • 自由切换两种
  • 面试要点
  • 设计 ORM AOP 方案
  • 查询回调:在增删改查时触发事件
  • 数据库可观测性:接入 log, tracing 和 metric
  • 慢查询监控
  • 为数据库查询接入缓存
  • 开源实例:Beego,GORM 和ENT AOP 方案
  • 代码演示:设计回调 API
  • 执行时间监控
  • 集成主键生成策略

第八周

  • 扩展支持子查询,JOIN 查询和 UNION
  • 支持 protobuf 定义模型
  • 利用代码生成为模型生成辅助方法:
  • 生成构造 WHERE 的辅助方法


模块四 缓存客户端

教学目标

  • 掌握本地缓存设计和实现方案,控制本地缓存占用内存,过期时间处理
  • 设计统一 API,同时支持 Redis 缓存和本地缓存
  • 掌握分布式锁设计和实现方案
  • 掌握缓存模式:cache aside,read through, write through, write-back
  • 掌握缓存异步刷新和缓存预加载技巧
  • 掌握装饰器模式,singleflight 模式,全局 singleflight 以及优化方向
  • 掌握缓存击穿、缓存穿透和缓存雪崩的解决方案
  • 掌握缓存一致性的解决
  • 掌握 ORM 框架和缓存中间件框架的结合

学习和工作中的痛点

  • 缓存在工作中大量使用,但是基本只会最简单的用法,也就是形如 cache-aside。无法利用装饰器等设计模式优雅封装缓存操作,以支持不同的缓存模式;
  • 不了解缓存击穿、缓存穿透和缓存雪崩。或者听说过,但是不知道在代码上怎么实践;
  • 知道或者使用过单机 singleflight,但是没有实践过全局 singleflight,也不知道有什么技巧可以避免全局锁
  • 听过 Redis 可以用于实现分布式锁,但是不知道怎么写,或者写出来的分布式锁考虑不周全;
  • 缓存一致性的解决方案听过很多,但是落地到代码就不知道怎么处理;

实践练习

  • 手写一个本地缓存,能够控制缓存超时、控制内存占用量
  • 为用户服务替换自己手写的本地缓存,同时为用户服务接入 Redis
  • 使用装饰器模式实现 read-through 和 write-through,并在用户服务中应用两种模式
  • 为用户服务的本地缓存提供预热功能和定时刷新功能,缓解数据不一致问题
  • 利用 Redis 实现一个分布式锁
  • 假设用户服务会部署到多个节点,并且同时使用本地缓存、Redis 缓存,尝试解决数据一致性问题

详细内容

第九周

  • 本地缓存设计和实现
  • 超时控制
  • 控制内存占用量
  • 控制键值对数量
  • 控制内存总量
  • 键值对淘汰回调
  • 代码演示:实现一个简单的本地缓存
  • 设计缓存客户端统一 API
  • 代码演示:提供 Redis 实现
  • 装饰器模式
  • 缓存模式:
  • read-through
  • write-through
  • write-back
  • 代码演示:利用装饰器模式实现这些模式
  • singleflight 模式和全局 singleflight 模式:
  • 代码演示:全局 singleflight 模式和性能优化
  • 缓存预热、缓存异步刷新、缓存定时刷新、缓存随机超时时间
  • 面试要点

第十周

  • 缓存击穿、缓存穿透和缓存雪崩详解,综合利用缓存模式、预热、缓存异步刷新、缓存定时刷新、随机超时时间等手段解决问题
  • 代码演示:
  • 缓存异步刷新
  • 缓存定时刷新
  • 缓存随机超时时间
  • 利用 Redis 实现一个分布式锁
  • SETNX 最简单实现
  • 分布式锁续期
  • 分布式锁解锁
  • Redis 集群下分布式锁的难点
  • 开源实例:redsync 中分布式锁的实现
  • 缓存一致性解决方案:
  • 分布式锁
  • 业务相关负载均衡算法与 singleflight 方案
  • 面试要点


模块五 微服务框架 —— RPC 模块

教学目标:

  • 掌握 RPC 通信的基本原理
  • 掌握 RPC 协议的设计理念,了解 Dubbo 协议和 gRPC 协议设计
  • 了解各种序列化协议和压缩算法
  • 掌握代理模式和代码生成两种策略对应的 RPC 实现机制,并能选择任一策略实现一个简单的 RPC 框架
  • 掌握 RPC 下超时控制的实现

学习和工作中的痛点:

  • 用过很多 RPC,却搞不懂 RPC 究竟是怎么运作的。既不清楚 RPC 是怎么把请求发过去服务端的,也不清楚服务端究竟是怎么解析请求,执行调用的
  • 面试对 RPC 原理说不出所以然来,对业界常见的 RPC 协议也不甚了解,一问就哑口无言
  • 遇到问题的时候,无法深入到源码定位问题,更加无法通过捕捉网络传输报文来定位问题
  • 手写 RPC 毫无问题

实践练习

  • 自己设计一个 RPC 协议。并且结合模块一的代理模式实践和 TCP 服务实践,实现自己的 RPC 协议;
  • 为自己的 RPC 协议添加不同序列化协议支持
  • 为自己的 RPC 协议添加不同压缩算法支持
  • 为自己的 RPC 协议添加 one-way 调用支持
  • 为自己的 RPC 协议添加超时控制
  • 使用自己设计的 RPC 框架,实现一个简单的用户服务,完成注册、登录两个基本功能

详细内容

第十一周

  • 微服务框架概述
  • RPC 通信模式详解:
  • 基于 HTTP 的 RPC
  • 基于 TCP 的 RPC
  • 捕捉本地调用信息,获得调用的服务名、方法名、参数类型和参数值
  • 代码演示:结合反射和代理模式,捕捉本地调用信息
  • 结合 AST 编程和代码生成策略,捕捉本地调用信息
  • RPC 协议设计详解,并且设计最简单的 RPC 协议
  • RPC 头部字段设计,包含魔数,版本字段,消息长度字段,头部长度字段,消息 ID,序列化协议,压缩算法
  • RPC 消息体
  • 在 RPC 协议里面携带链路元数据,如 trace id,AB 测试标记位,压测标记位
  • 开源实例:
  • Dubbo RPC 协议设计
  • gRPC 协议设计
  • 面试要点

第十二周

  • 基于 TCP 的 RPC 实现:
  • 客户端捕捉本地调用,序列化之后传输到服务端
  • 服务端解析报文,重建调用上下文,查找本地服务,完成调用,回写结果
  • 异步调用、one way 调用和回调
  • 支持不同序列化协议
  • 支持不同压缩算法
  • 代码演示
  • 设计并实现简单的 RPC 协议
  • 异步调用,one way 调用和回调
  • 面试要点
  • RPC 超时控制
  • 单一调用超时控制
  • 全链路超时控制
  • 代码演示
  • RPC 单次调用超时控制
  • RPC 链路超时控制
  • 开源实例:
  • Dubbo-go 中超时控制
  • gRPC 超时控制
  • 面试要点


模块六 微服务框架 —— 服务注册与发现模块

教学目标:

  • 掌握业界常见的服务注册与发现模型
  • 掌握服务注册与发现的 API 设计与实现
  • 掌握服务启动、服务注册的正确顺序
  • 掌握服务取消注册、服务关闭的正确顺序
  • 掌握服务端优雅关闭的正确步骤
  • 掌握在客户端和服务端之间进行健康检测
  • 了解常见的可以充当服务注册中心的中间件,包含 zookeeper, etcd, nacos 等
  • 掌握 CP 和 AP 模型对服务注册与发现的影响
  • 掌握常见的微服务框架的服务注册与发现的 API 设计,并能进一步阅读其源码

学习和工作中的痛点

  • 不了解服务注册与发现的模型,也不了解客户端、注册中心和服务端三者究竟如何协作
  • 面对业界各种中间件,不知道注册中心选型应该要考虑什么,不知道各个中间件之间的优劣
  • 说不清楚服务启动、服务注册的顺序,不了解微服务的优雅关闭的正确步骤什么

实践练习

  • 为自己的 RPC 框架添加服务注册与发现功能,提供基于 zookeeper, etcd 或者 nacos 的任意实现
  • 设计统一的 API,允许用户接入自定义的服务注册与发现实现
  • 为支持测试,提供一套绕开服务注册与发现的机制,直接指定目标节点的 IP 和端口
  • 为自己的 RPC 框架添加优雅退出功能,并且暴露钩子函数,允许用户自定义自己退出的必要步骤
  • 用服务注册与发现功能改写自己的用户服务
  • 为用户服务接入优雅退出功能,确保用户服务在关闭之前能够结束当前事务并且释放数据库资源

详细内容

第十三周

  • 服务注册与发现的几种模式:
  • 基于 IP 直连
  • 基于 DNS
  • 基于注册中心
  • 服务自省——元数据服务
  • 服务注册与发现的本质
  • 服务注册与发现的API 设计
  • 订阅模式
  • Listener 模式
  • 开源实例:Dubbo-go, Kratos 中的服务注册与发现 API 设计
  • 代码演示:设计服务注册与发现 API
  • 服务注册与发现的实现
  • 服务注册中心选型
  • 必备功能特性
  • 非功能特性选择
  • 代码演示:基于 zookeeper 的实现
  • 开源实例:
  • Dubbo-go, Kratos 中基于 zookeeper 的实现
  • EGO 中基于 k8s 的实现
  • 服务启动与服务注册
  • 确保服务启动完成,再执行服务注册
  • 如何确定服务启动已经成功
  • 开源实例:EGO, Dubbo-go 和 Kratos 启动过程与注册过程分析
  • 优雅退出
  • 服务取消注册
  • 服务拒绝新请求
  • 服务等待已有请求
  • 服务退出或者超时强制退出
  • 开源实例:Dubbo-go 优雅退出实例
  • 客户端与服务端健康检测
  • 面试要点


模块七 微服务框架 —— 节点筛选与负载均衡

教学目标:

  • 掌握微服务框架 Cluster 算法。API 设计与实现
  • 掌握微服务框架路由算法,API 设计与实现
  • 掌握微服务框架分组功能设计与实现
  • 掌握各种负载均衡算法、优劣和使用场景
  • 掌握业界常见的微服务框架的负载均衡 API 设计与实现

学习和工作中的痛点

  • 对微服务框架如何筛选出目标节点整个过程不了解,不了解 Cluster、路由和负载均衡三重抽象;
  • 在一些场景之下,不知道该怎么把请求同时发送到多个节点;也不知道怎么动态根据请求对服务端节点进行分组,并且把请求发送到特定的一个分组;
  • 不了解或者只在算法层面上了解负载均衡算法,没有真实落地写过实现;
  • 当需要自定义负载算法的时候,不知道怎么接入自己使用的微服务框架;

实践练习

  • 为自己的微服务框架添加 Cluster 功能,实现最简单的 fail over 策略,在服务端一个节点失效的情况下,自动选择另外一个节点重试
  • 为自己的微服务框架添加分组功能
  • 为自己的微服务框架添加路由功能,提供标签路由或者条件路由的实现
  • 为用户服务接入分组功能,将用户分成普通用户和 VIP 用户两个分组,其中普通用户访问普通节点,VIP 用户访问 VIP 节点
  • 为用户服务接入自定义负载均衡算法,该算法用用户 ID 来实现哈希一致性算法。并在服务端引入本地缓存,缓存用户数据
  • 为用户服务接入路由功能,模拟 AB 测试将流量分别打到 AB 对应的服务节点上

详细内容

第十四周

  • 筛选节点:Cluster,路由和负载均衡的三重抽象
  • Cluster 单播、广播与容错
  • Cluster 单播
  • Cluster 广播
  • Cluster fail fast 策略
  • Cluster fail over 策略
  • 开源实例:Dubbo-go 中 Cluster 的设计和主要实现
  • 代码演示:添加 Cluster 支持,并提供:
  • fail-over 实现
  • 广播实现
  • 服务端分组设计与实现
  • 利用分组实现实现隔离功能
  • 利用分组来解决 AB 测试,压力测试
  • 开源实例:Dubbo-go 中分组的设计与实现
  • 代码演示:添加分组功能支持
  • 负载均衡算法 API 设计与实现
  • 轮询,加权轮询
  • 随机,加权随机
  • 哈希,一致性哈希
  • 最少连接数
  • 最少活跃数
  • 最快响应时间
  • 业务相关负载均衡算法与本地缓存
  • 利用负载均衡算法缓解缓存一致性问题
  • 负载均衡算法考虑因子、性能数据采集与衰退
  • 开源实例:Dubbo-go,Kratos 的负载均衡 API 设计与实现
  • 代码演示:添加负载均衡 API 支持
  • 允许用户注册自定义负载均衡算法
  • 最少活跃数负载均衡算法实现
  • 面试要点

模块八 微服务框架 —— 可用性和可观测性

教学目标

  • 掌握各种中间件 AOP 解决方案
  • 掌握熔断、限流和降级的各种算法
  • 掌握熔断、限流和降级的异同点,以及典型使用场景
  • 利用 AOP 解决方案实现熔断、限流和降级
  • 利用 AOP 解决方案接入可观测性:log, tracing 和 metrics
  • 掌握故障恢复,避免抖动的策略

学习和工作中的痛点

  • 不了解或者只在算法层面上了解熔断、限流和降级的算法。时常对熔断、限流和降级感到困惑,搞不清楚它们之间的区别与联系,不知道什么时候应该用熔断、限流或者降级;
  • 听过很多可观测性的问题,但是不知道它包含什么。或者知道 log, tracing 和 metric,但是不知道怎么接入到自己的项目里面。即便是在接入的时候,也不知道要观测一些什么样的数据;
  • 自己的业务需要有自定义的熔断、限流和降级的策略,但是不知道怎么实现,也不知道怎么在自己使用的微服务框架里面接入;
  • 在读微服务框架源码的时候,总不太能理解这些框架是怎么利用统一的方案来解决可用性和可观测性问题;

实践练习

  • 为自己的微服务框架设计 AOP 解决方案,可以考虑利用洋葱模式、责任链模式、拦截器等方案
  • 为自己的微服务框架接入可观测性方案,其中 tracing 用 opentelemetry,metric 使用 prometheus
  • 为自己的微服务框架提供熔断、限流和降级的默认实现,包含固定窗口、滑动窗口、漏桶和令牌桶算法
  • 为用户服务开启可观测性功能,部署 opentelemetry 的服务端和prometheus,查看采集的数据
  • 压测用户服务,并且分别设置熔断、限流和降级的策略,采集压测数据并且观察使用策略的效果
  • 在压测结束之后,为用户服务设置故障恢复策略,并且确认用户服务在一段时间后能够恢复正常处理请求的状态

详细内容

第十五周

  • AOP 解决方案
  • 洋葱模式
  • 责任链模式,函数式责任链模式
  • 拦截器
  • 开源实例:Beego, Dubbo-go, Kratos 中的 API 设计
  • 代码演示:设计 AOP API
  • 可观测性
  • log:设计 Log API,允许用户接入自己的日志采集框架
  • tracing:opentelemetry 简介以及接入 opentelemetry,微服务 tracing 采集数据
  • metric:prometheus 简介以及接入 prometheus,微服务 metric 采集数据
  • 开源实例:EGO,Beego,Dubbo-go,Kratos 中的可观测性实现
  • 代码演示:为微服务框架添加 logging, opentelemetry, prometheus 支持
  • 熔断、限流、降级:
  • 固定窗口算法
  • 滑动窗口算法
  • 令牌桶算法
  • 漏桶算法
  • 动态限流算法详解
  • 单机降级策略
  • 集群降级
  • 业务相关降级
  • 开源实例:Dubbo-go,Kratos 中的 API 设计与实现
  • 代码演示:为微服务框架添加限流支持
  • 滑动窗口算法实现
  • 支持限流自定义处理策略
  • 故障恢复策略
  • 避免恢复抖动
  • 面试要点