🌟《初级 GO 训练营》:https://w.1yb.co/VegwY1K
第一周 Go 基础语法
教学目标:
- 掌握在 Linux、Mac 和 Windows 下的 Go 环境搭建
- 掌握如何配置 Goland IDE,以及 Goland IDE 使用小技巧
- 熟练使用 Go 基本语法
- 掌握 Go 内置类型(map、切片)使用
- 掌握 Go 接口定义和结构体定义
- 掌握 Go 泛型的使用
- 掌握 Go 语言单元测试写法,单元测试设计思路
针对的用户痛点:
- 学习新语言的时候常常被环境搭建困扰,也会被 IDE 使用困扰
- 基本语法一学很简单,一写代码就忘记
- 难以理解 Go 鸭子类型的含义,无法抽象
- 无法理解 Go 中接收器的含义,难以准确把握在什么时候应该使用什么作为方法接收器
- 不懂 Go 泛型,或者无法用好 Go 泛型
实践练习:
- 利用 Go 泛型,设计 map 的工具方法
- 利用 Go 泛型,设计切片的工具方法
- 利用 Go 泛型,设计 Set 接口,并提供基于 map 的实现
- 利用 Go 泛型,设计并实现基于切片的 ArrayList 和 LinkedList
- 利用 Table Driven 的思路设计测试用例
详细内容:
- Go 基本语法
- Hello,World!
- 方法定义与调用、变量定义、常量定义
- 控制结构:循环、if-else
- 类型定义:接口定义和结构体定义
- Go 内置类型
- 切片
- map
- 数组
- Go 泛型
- Go 测试入门
- 单元测试入门
- 使用 Table Driven 来设计测试用例
- 职场刷亮点
- 利用泛型为公司提供工具包或者辅助类
- 利用泛型重构公司代码
- 面试要点
第二周 Gin、GORM 入门与用户注册登录功能实现
教学目标:
- 进一步练习和熟悉 Go 语法
- Gin、Gin Session 插件入门
- GORM 入门
- 数据库表结构设计与索引设计入门
- 掌握最基本的用户登录注册功能实现
- 掌握在 Go 中获得数据库返回错误码的方法
- 利用 Gin middleware 完成登录校验
- 掌握用户密码加密设计要点
- 掌握前后端分离的基本架构模式
- 掌握跨域问题及其解决方案,利用 Gin middleware 机制解决跨域问题
针对的用户痛点:
- 想要学习 Gin 或者 GORM,但是不知道从何下手,不知道如何查找官方文档
- 数据库表结构设计和索引设计全靠直觉,缺乏深入思考
- 不了解登录和注册过程,不知道如何选择合适的密码加密算法
- 听过前后端分离,但不知道究竟是指什么,也不知道这样做的好处是啥
- 听过或者遇到过跨域问题,但是不知道怎么解决,很多时候都是抄网上的代码片段,根本不清楚问题的根源
- 听说过 Gin,用过 Gin,但却不知道怎么用好 Gin 的 middleware
实践练习:
- 利用 Gin 和 GORM 设计并实现简单的用户登录、注册功能
- 利用 Gin middleware 机制解决跨域问题
- 利用 Gin 的 Session 插件支持登录态,并且利用 Gin middleware 解决登录态校验问题
- 利用 docker-compose 搭建开发环境
详细内容:
- Gin 框架简介与入门
- 整体设计
- 核心用法
- 插件机制
- 利用插件解决跨域问题
- GORM 简介与入门
- 整体设计
- 增删改查写法
- Gin Session 插件入门
- 整体设计
- 核心用法
- Session 与 Cookie 的基本概念
- 利用 docker-compose 来启动开发所需依赖
- 用户注册和登录功能设计与实现
- 数据库表设计与索引设计
- 获得数据库返回的错误码
- 密码加密算法选取
- 职场刷亮点
- 针对公司需求提供一系列的 Gin 插件,如跨域问题插件
- 面试要点
第三周 JWT、Redis 入门与 Kubernetes 部署实战
教学目标:
- 掌握依赖反转和依赖注入的设计思路
- 掌握单体应用多实例部署要考虑的问题
- 掌握 JWT 用法,用 JWT 重构系统
- 掌握 Redis 用法,利用 Redis 来提高应用性能
- 掌握 Nginx 用法
针对的用户痛点:
- 在单机的情况下直接存储 Session 到内存,等到分布式环境下,系统就无法运作
- 只会简单的 Redis 用法,没有深入学习和研究 Redis 不同的数据结构
- 项目结构不合理,整个项目充斥着包变量,缺乏可测试性和可扩展性
- 没有接触过 Kubernetes,想要学习但是不知道该如何入手
- 平时没有机会接触到 Nginx,面试的时候也不知道该怎么面
实践练习:
- 在分布式环境下(单体应用但是多个实例部署),使用 Redis 来存储 Session
- JWT 入门,用 JWT 重构系统
- 使用依赖注入设计模式重构系统,提供系统可测试性
- 搭建 Kubernetes 环境
- 在 Kubernetes 上部署用户服务,并且部署多个实例
详细内容:
- Redis 入门
- Redis 数据结构和底层实现
- 使用 Redis 来存储 Session
- Redis Sentinel 和 Redis Cluster 模式简介
- JWT 入门
- Kubernetes 入门与应用部署
- Nginx 入门,单体应用部署多实例
- 重构系统,重新设计项目结构
- 职场刷亮点
- 使用依赖注入理念,重构公司项目,提高可测试性和可扩展性
- 面试要点
第四周 接口抽象技巧与短信服务实现
教学目标:
- 掌握为可能发生变更的点设计抽象接口,对调用者屏蔽差异并提供可扩展性的方法
- 掌握 go mock 的使用
- 掌握对接短信接口,实现手机号验证码登录的方法
- 将短信抽象为独立模块,为可能的其它使用场景留出扩展空间
- 初步体会超前半步的设计理念
针对的用户痛点:
- 开发的功能缺乏可扩展性,每次对接新的第三方、新的下游、新的中间件,都要从零开始研发
- 开发过程中用力过猛,设计过于复杂,以至于没有人愿意用,或者自己用起来也很别扭
- 设计接口的时候不知道该如何定义核心方法,接口设计不够准确
- 不会使用 go mock 工具,复杂逻辑只能依赖于启动服务器和全部依赖,才能进行测试
- 缺乏学习第三方接口的技巧,每次新学习一个接口,都要花费很多时间
实践练习:
- 对接第三方短信供应商,实现发送短信功能
- 进一步抽象短信模块,提供抽象并且一致的短信服务,以屏蔽不同第三方短信供应商的差别
- 使用 go mock 为自己定义的接口和第三方接口生成 mock 代码
详细内容:
- 短信验证码登录功能的设计和实现
- 独立的短信模块的设计与实现
- 接口设计
- 对接第三方短信服务提供商
- 单元测试和集成测试
- 为业务方提供测试支持
- go mock 入门
- 为自己的接口生成 mock 代码
- 为第三方接口生成 mock 代码
- mock 条件设置与结果设置
- 职场刷亮点
- 重新设计公司的短信模块,并且提供测试支持
- 面试要点
第五周:SSO 与微信扫码登录实现
教学目标:
- SSO 入门
- 对接微信 API,实现微信扫码登录
- 为系统设计统一的日志接口,掌握日志组件 Zap 的用法
- 掌握在系统中打印日志的技巧
- 为系统引入配置中心,掌握 etcd 的用法
- 掌握不同配置放置的合适位置,例如运行参数、环境变量、配置文件还是配置中心
- 掌握使用第三方组件但是不直接依赖第三方的设计思路
针对的用户痛点:
- 直接使用第三方组件,如etcd,一旦要替换为别的组件,就得全局都排查过去
- SSO 听说过,也被面试过,但就是记不住原理,也难以落地,面试也跪了一遍又一遍
- 工作中要对接微信 API 的时候,总是一地鸡毛,功能难开发、难测试
- 平时业务开发的时候,知道日志很重要,就是不知道该在哪里打、怎么打
实践练习:
- 对接微信 API,实现微信扫码登录
- 设计并实现统一的微信 API 测试机制
- 接入日志,在项目中埋点日志
详细内容:
- SSO 基本原理
- 对接微信 API
- 跑微信流程,获得各种 token
- 微信 API 速览
- 微信登录 API 详解
- 利用微信 API 实现扫码登录
- 测试微信扫码登录
- 抽象统一的微信模块,并且提供友好的测试支持
- 为系统设计日志接口,适配 Zap 组件
- 为系统设计配置接口,适配 etcd 组件
- 在系统中埋点打日志
- 职场刷亮点
- 为公司对接第三方平台提供友好地测试支持
- 面试要点
第六周 文本存储与 OSS/CDN
教学目标:
- 掌握发帖功能的设计和实现,包括数据库设计和索引设计
- 掌握制作库和线上库分离的设计方式
- 掌握关系型数据库存储大文本的优缺点
- 掌握 MongoDB 的用法
- 掌握 OSS 的基本概念,学会设计统一的 OSS 接口、对接第三方 OSS 服务
- 掌握云厂商 OSS 存储对象与 CDN 结合的用法
针对的用户痛点:
- 日常存储大文本字段不知道该怎么处理,在关系型数据库和 NoSQL 中摇摆不定
- 对内容生产平台,怎么保证作者一边修改文章,但是读者还是可以查看的功能特性感到困惑
- 日常工作中没机会接触到 MongoDB,想要学习但是不知道该如何入手,面试的时候一面就倒
- 听说过 OSS,但是不知道有什么用,也不知道拿来干啥
- 听说过 CDN,但是从来没用过,面试的时候也不知道该怎么面
实践练习:
- 实现一个发帖功能,实现制作库和线上库分离
- 在开发环境中启动 MongoDB
- 设计并实现一个统一的 OSS 接口,屏蔽云厂商的差异
- 设计统一的存储接口,提供 MySQL/MongoDB 和 OSS 的实现,用于存储帖子
- 演示如何自由切换存储实现
- 演示如何在云厂商上接入 OSS 和 CDN
详细内容:
- 发帖功能的设计与实现:使用 MySQL 来存储
- MySQL 存储大文本
- 制作库与线上库分离
- MongoDB 入门:使用 MongoDB 来存储帖子
- OSS 概念和入门:使用 OSS 来存储帖子
- 改进设计,允许存储在 MySQL/MongoDB/OSS 之中自由切换
- 职场刷亮点
- 为公司的静态资源接入 OSS 和 CDN
- 为公司引入 MongoDB 解决特定的问题
- 面试要点
第七周 点赞阅读收藏实现与 Kafka 入门
教学目标:
- 掌握常见的阅读、点赞、收藏功能的设计与实现,深入对比侵入式方案和非侵入式方案对系统可维护性、可测试性和可扩展性的影响
- 阅读历史功能的设计与实现
- 掌握 Kafka 的使用,掌握如何运用消息队列来完成异步、解耦
- 抽象统一的消息发送和消费接口,适配 Kafka,并提供测试支持
- 掌握识别可异步执行的业务逻辑的小技巧
针对的用户痛点:
- 常见的阅读、点赞功能虽然能做出来,但是设计比较差,可扩展性也比较差,难以支撑高并发
- 在业务中不知道什么东西可以异步执行,什么东西可以解耦,也难以体会解耦和异步对系统的好处
- 在使用 Kafka(或者其它消息队列)的地方,代码总是特别难测试
实践练习:
- 实现常见的帖子阅读、收藏、点赞功能,以及收藏组功能
- 实现阅读历史功能
- 在本地环境中启动 Kafka 集群
- 使用工具查看 Kafka 收发消息的情况
- 设计一个统一的消息队列接口
- 优化点赞、阅读性能
详细内容:
- 设计并实现阅读、收藏、点赞功能
- 数据库表结构与索引设计
- 侵入式方案
- 解耦方案
- 性能优化方案
- 设计并实现阅读历史功能
- Kafka 入门
- Kafka 基本概念和架构设计:Broker、Partition、Consumer 等
- 抽象统一的消息模块,并为 Kafka 提供适配
- 集成测试使用消息队列的代码
- 职场刷亮点
- 为公司引入统一的消息队列接口,适配不同实现,并且提供测试支持
- 面试要点
第八周:监控、埋点和告警
教学目标:
- 掌握利用 Gin 和 GORM 的插件机制埋点的方法
- 掌握可观测性的概念
- 掌握在业务中埋点的技巧
- 掌握如何部署可观测性的相关组件,包括 Prometheus、Zipkin
- 掌握如何搭建一个统一的可观测性平台,并且集成 Grafana
- 掌握在 Grafana 上配置面板和告警的功能
- 不同场景下告警频率、告警方式的选择
- 集成第三方聊天系统(如钉钉),提供告警功能
针对的用户痛点:
- 平时在业务中,只会写代码,排除问题全靠猜,缺乏性能数据和链路数据
- 知道告警很重要,但是平时自己设置的告警,要么太频繁根本没人理,要么漏报误报
- 知道埋点很重要,但就是不知道在什么地方应该埋,什么地方不应该埋
- 不知道如何将数据进行可视化展示,不知道如何集成 Grafana
- 不知道如何利用 Gin 和 GORM 的 middleware 来接入可观测性
实践练习:
- 部署 Zipkin 和 Prometheus
- 部署 Grafana 并且设置 Prometheus 为数据源
- 为核心功能添加监控
- 利用 Gin 和 GORM 插件机制添加监控
- 手动在业务关键节点打点
- 在 Grafana 中配置面板和告警
- 集成钉钉,发送告警
详细内容:
- 可观测性的概念和入门
- logging
- metrics 与 Prometheus、Prometheus 查询语言
- tracing 原理与 Zipkin 入门
- 其它可观测性中间件简介
- 利用 Gin 和 GORM 的 middleware 机制添加监控
- 集成 Grafana,配置 Grafana 面板和告警
- 集成钉钉,发送告警
- 职场刷亮点
- 为公司搭建全面的可观测性平台
- 为自己的业务添加全面监控
- 面试要点
第九周: 分布式任务调度
教学目标:
- 掌握定时任务的设计和处理
- 掌握如何在分布式环境下调度定时任务
- 掌握热榜功能的设计和实现,理解常见的榜单模型
- 掌握优化热榜性能、提高可用性的技巧
- 掌握缓存预加载功能
针对的用户痛点:
- 平时工作中使用过很多定时任务,但对在分布式环境下如何在特定的节点上调度分布式任务缺乏理论和实践
- 面试定时任务或者分布式任务调度的时候,总是难以刷出亮点
- 缓存用法单一,没有尝试过本地缓存 + Redis 缓存的用法,或者用过,但不知道怎么解决一致性问题,不知道怎么刷出亮点
- 处理榜单业务的时候,总是被高并发问题击垮,或者可用性不强
实践练习:
- 设计并实现热榜功能
- 使用 Redis 全量缓存热榜数据
- 引入本地缓存进一步提高性能
- 解决本地缓存、Redis 缓存一致性和热榜更新的问题
- 设计并实现一个通用的本地定时任务模块
- 设计并实现一个基于 MySQL 的分布式任务调度模块
详细内容:
- 热榜功能的设计和实现
- 常见的热榜模型
- 热榜计算指标的时间衰减特性
- 实时计算热榜的难点
- 本地缓存使用
- 本地缓存控制容量
- 本地缓存淘汰策略
- 本地缓存与 Redis 缓存结合使用
- 本地缓存与热榜更新
- 定时任务的设计与实现
- 分布式任务调度系统的设计与实现
- 分布式任务调度系统要考虑的问题
- 基于 MySQL 的分布式任务调度系统
- 为热榜功能接入监控和告警
- 职场刷亮点
- 在公司内提供一个统一的分布式任务调度框架
- 面试要点
第十周:单体应用拆分为微服务应用
教学目标:
- 微服务架构入门
- 掌握 DDD
- 掌握 gRPC 和 protobuf
- 掌握单体应用拆分微服务应用的原则和技巧
- 掌握复杂系统的重构技巧
针对的用户痛点:
- 公司内部一直都是单体应用,只听过微服务架构,但是没有接触过
- 或者公司内部直接用的就是微服务应用,服务已经拆分好了,所以并不清楚一个单体应用是怎么拆分成微服务的
- 没有使用过 gRPC,或者对 gRPC 的了解流于表面
- 对于公司的历史系统很想重构,但是总是瞻前顾后,很怕出现问题
实践练习:
- 进一步完善测试,为系统重构做准备
- 实时演示单体应用拆分,并演示如何用测试验证拆分并没有影响正常的功能使用
- 用 gRPC 来作为服务间通信
详细内容:
- 服务拆分
- 拆分用户服务
- 拆分帖子服务
- 拆分热榜服务
- 拆分短信服务
- gRPC 入门
- protobuf 语法
- protoc 与 protobuf 插件
- gRPC import 与定位
- 常见 gRPC 使用问题
- 利用 gRPC 完成服务间通信
- 回归测试,验证服务拆分的正确性
- 职场刷亮点
- 在公司尝试拆分复杂单体应用:模块化、服务化
- 面试要点
第十一周 不停机数据迁移方案
教学目标:
- 掌握微服务与数据库一一对应的设计理念
- 掌握不停机数据迁移方案
- 掌握扩展 GORM 底层实现以支持双写的技巧
针对的用户痛点:
- 平时会遇到数据迁移的问题,但都无法做到不停机迁移,每次面试官问起都不知道该如何应对
- 完全不了解,或者只是听说过不停机的数据迁移方案,但没有实践过,不清楚其中细节
- 使用过 GORM 的很多功能,比如插件功能等,但更深一层次的功能就从来没用过
实践练习:
- 扩展 GORM 接口,支持数据库双写
- 设计并实现全量数据迁移方案
- 设计并实现全量数据校验方案,并优化性能
- 设计并实现增量数据校验方案
- 将单一的数据库拆分为每个微服务对应一个数据库
详细内容:
- 扩展 GORM 接口,提供双写支持
- 不停机数据库迁移方案
- 数据库全量数据迁移
- 数据库全量数据校验
- 数据库双写方案
- 数据库增量校验
- 数据库流量切换
- 业务层面校验数据迁移效果
- 职场刷亮点
- 统一的数据迁移方案与工具集
- 面试要点
第十二周:微服务研发之服务注册与发现
教学目标:
- 掌握服务注册与发现,能够在实践中根据实际需要选择合适的服务注册与发现中间件
- 掌握在 Kubernetes 容器内集成服务注册与发现的技巧
- 掌握在 gRPC 中接入服务注册与发现机制的技巧,了解其它微服务框架如 Kratos、go-zero 等接入服务注册与发现的关键 API
- 掌握微服务分组功能
- 掌握微服务可用性保障中的隔离使用技巧
针对的用户痛点:
- 听说过服务注册与发现,但是只知道大概,对于内部的各种细节缺乏了解
- 服务注册与发现作为微服务架构面试的必面题,每次面试都发挥不好
- 实际开发中使用了微服务架构,但公司早就决定了服务注册与发现的选型,难以知道他们决策的底层逻辑
- 在实际开发中使用 gRPC,不知道怎么接入自定义的服务注册与发现功能
- 在使用服务与注册发现时,遇到问题不知道该如何定位,也难以判断是服务注册过程中的问题,还是服务发现过程中的问题
实践练习:
- 为 gRPC 提供服务注册与发现的实现,提供基于 etcd 和 Kubernetes 的实现
- 演示在其它微服务框架如 Kratos、go-zero 中如何接入自定义的服务注册与发现策略
- 为 gRPC 提供分组功能
- 利用分组功能设计并实现隔离机制,提高系统可用性
详细内容:
- 服务注册与发现模型
- 演进过程
- IP 直连
- 基于 DNS 的服务发现
- 基于注册中心的服务注册与发现
- 基于注册中心的服务注册与发现
- 详细步骤
- 容错
- 注册中心崩溃
- 网络异常
- 基于 etcd 的 gRPC 服务注册与发现接入
- 基于 Kubernetes 的 gRPC 服务注册与发现接入
- 分组功能
- 利用分组功能设计隔离机制
- 职场刷亮点
- 为公司的核心业务提供隔离机制,保障可用性
- 面试要点
第十三周:微服务研发之负载均衡
教学目标:
- 掌握常见的负载均衡算法,以及如何在业务中选择合适的负载均衡算法
- 了解动态负载均衡算法
- 掌握使用一致性哈希来提高本地缓存命中率的技巧
- 掌握如何利用负载均衡和服务发现过程实现 fail-over 特性
- 掌握根据调用结果调整权重的技巧,并且设计兜底措施,防止权重调整引发系统崩溃
针对的用户痛点:
- 负载均衡是微服务架构必面题,但是没有办法面出亮点
- 在平时工作中,负载均衡就是简单使用轮询,没有机会接触到更高级的负载均衡策略
- 不知道怎么将负载均衡和其它功能结合在一起,进一步提高系统的可用性
实践练习:
- 在 gRPC 中接入各种负载均衡策略
- 演示其它微服务框架如 go-zero、Kratos 是如何使用负载均衡策略,并接入自己实现的负载均衡策略
- 根据调用结果动态调整权重,提高负载均衡准确性
- 结合负载均衡和服务发现,实现 fail-over 策略
详细内容:
- 负载均衡算法
- 静态负载均衡算法
- 轮询与加权轮询,以及平滑的加权轮询算法
- 随机与加权随机
- 哈希与一致性哈希
- 动态负载均衡算法
- 最快响应时间算法
- 最少连接数
- 最少活跃请求数
- 负载均衡算法选择
- 根据调用结果调整权重
- 利用哈希类负载均衡算法提高本地缓存命中率
- 在用户服务中使用该策略
- 设计并实现 fail-over 机制
- 为所有的服务接入负载均衡
- 职场刷亮点
- 为公司提供各种负载均衡算法实现
- 重构公司使用本地缓存的服务,使用哈希类算法做负载均衡
- 面试要点
第十四周 微服务研发之服务治理
教学目标:
- 掌握微服务治理的常见手段
- 掌握确定限流阈值的技巧
- 掌握全链路超时控制,知道如何设置合理的超时时间
- 掌握客户端治理
- 掌握微服务可观测性
针对的用户痛点:
- 理论上不了解微服务治理,每次面试官问高可用微服务架构或服务治理就回答不出来
- 实践中缺乏落地微服务治理的机会,总觉得微服务治理很简单,但一旦自己实现的时候,就崩溃了
- 调用第三方API(如微信) 的时候没有任何治理,服务本身可用性严重依赖于第三方 API,或者明明在第三方 API 有限流之类的限制的时候,自己这边还无脑发请求
- 接触过单体应用的监控和告警,但是没有接触过微服务的监控,不知道怎么打点
实践练习:
- 为 HTTP 接口添加限流
- 为服务调用添加熔断、限流和降级
- 在 gRPC 中接入各种限流中间件
- 结合降级与缓存的案例
- 演示全链路超时控制和普通的超时控制
- 为短信服务和微信 API 添加客户端治理
- 为数据库查询添加限流
- 为所有的微服务添加监控
详细内容:
- 服务治理
- 熔断
- 限流
- 令牌桶、漏桶、固定窗口、滑动窗口等算法
- 集群限流与单机限流
- 针对业务对象限流
- 限流阈值选取
- 降级
- 利用 gRPC Interceptor 接口实现服务治理
- 丰富微服务监控与告警
- 添加日志打点
- 添加 Prometheus 埋点
- 添加 OpenTelemetry 埋点
- 链路超时控制
- 链路元数据传递原理
- 超时时间设置
- 利用 Gin middleware 治理 HTTP 接口
- 利用 GORM middleware 治理 GORM 接口
- 职场刷亮点
- 为公司提供统一的治理类的 gRPC/Gin/GORM 插件
- 面试要点
第十五周 支付服务设计与实现
教学目标:
- 掌握打赏功能的设计与实现
- 掌握支付服务和账户服务的设计与实现
- 掌握对接微信支付 API 的方法与技巧
针对的用户痛点:
- 支付和账户是支付相关的核心系统,但是从来没有接触过,不知道这一类系统对一致性、可用性、稳定性和安全性的要求
- 没有使用过微信支付 API,不了解流程
实践练习:
- 为帖子添加打赏功能
- 设计并实现支付模块、账户模块
- 对接微信支付 API,并且提供测试支持
详细内容:
- 支持打赏
- 打赏金额记账
- 平台分成
- 提现
- 支付模块的设计与实现,并且提供测试支持
- 账户模块的设计与实现
- 对接微信支付 API
- 在对接微信登录 API 的基础上进一步重构和封装
- 构建统一的支付 API 抽象,并且提供微信支付 API 适配
- 提供测试支持
- 职场刷亮点
- 统一的支付接口抽象
- 面试要点
第十六周 评论服务、用户关系服务设计与实现
教学目标:
- 掌握评论服务的设计与实现
- 掌握数据库常见的树形结构的设计与实现
- 掌握用户关系服务的设计与实现,支持关注功能
- 掌握如何配置数据库读写分离机制,了解主从同步延迟会引发的问题
- 掌握阿里 TableStore 用法
针对的用户痛点:
- 看到很多平台都有这种关注功能,但是不知道功能背后的底层逻辑
- 公司的数据要么没有读写分离,要么读写机制是已经弄好的,所以不知道怎么配置,也不知道它的原理
- 日常业务中遇到了树形表结构设计,但是不知道怎么设计,或者没设计好但又不知道怎么优化
- TableStore 作为业界优秀实践,听说过但是没有用过
实践练习:
- 为数据库添加从库,支持读写分离
- 演示主从同步延迟可能带来的问题
- 设计并实现一个评论系统
- 练习常见的树形结构表结构设计与索引设计
- 重构热榜模型,引入评论作为因子
- 使用 TableStore 来存储用户关系数据
详细内容:
- 设计并实现一个评论系统
- 数据库树形结构设计
- 邻接表
- 分段式 path
- Nested Set
- 阿里 TableStore 入门
- 重构热榜模型
- 职场刷亮点
- 为公司提供统一的根据数据库数据重建整个树形结构的工具库
- 面试要点
第十七周 ElasticSearch 与搜索服务实现
教学目标:
- ElasticSearch 入门,掌握 ElasticSearch 索引设计和分片设计技巧
- 掌握使用 ElasticSearch 搭建搜索服务的技巧
- 掌握标签服务的设计与实现
- 掌握用 ElasticSearch 和标签优化搜索的技巧
- 掌握发布订阅模式
针对的用户痛点:
- ElasticSearch 作为面试热点,但却完全不了解
- 用了 ElasticSearch,但不知道怎么设计良好的索引、怎么优化已有的索引,也不知道怎么优化分片
- 知道 ElasticSearch 可以用来解决搜索问题,但是没有实践过,或者公司已经用了但是不清楚其中细节
- 很多业务都要用到标签功能,但是不知道怎么设计高性能的标签系统
实践练习:
- 搭建 ElasticSearch,练习修改 ElasticSearch 配置、练习命令行工具
- 为帖子增加搜索功能,尝试优化索引
- 为帖子增加标签功能,支持搜索
详细内容:
- ElasticSearch 入门
- ElasticSearch 基础知识
- ElasticSearch 索引设计
- ElasticSearch 数据模型和查询语言
- ElasticSearch 常见的性能优化技巧
- ElasticSearch 命令行工具
- 搜索服务入门,使用 ElasticSearch 搭建搜索服务
- 同步数据到 ElasticSearch
- 针对业务设计索引
- 测试与性能测试
- 设计并实现一个标签服务
- 数据库表结构设计
- 数据库索引设计
- 标签同步 ElasticSearch
- 在 ElasticSearch 中利用标签来优化搜索
- 职场刷亮点
- 在公司内部优化 ElasticSearch 索引
- 面试要点
第十八周 ELK 和 Canal 入门
教学目标:
- 掌握 ELK 架构搭建技巧
- 掌握 Canal 的部署和使用,掌握利用 Canal 监听 binlog 来同步数据到缓存、ElasticSearch、Kafka
- 掌握 refresh-ahead 的缓存模式
针对的用户痛点:
- 想要在公司引入 ELK 架构,但是不知道怎么入手
- 在尝试解决缓存一致性问题的时候,知道可以考虑监听 MySQL binlog 来更新数据,但是没有实践过
- 听说过 Canal,但是没有使用过,缺乏实践经验,面试也面不过去
实践练习:
- 搭建 ELK,为系统接入 ELK
- 搭建 Canal,利用 Canal 来监听 binlog
- 使用 Canal 更新 Redis 缓存
- 使用 Canal 同步帖子到 ElasticSearch
- 使用 Canal 改进数据迁移中的增量校验
- 利用 Canal 来发送消息
详细内容
- ELK 入门
- ELK 架构解析
- ELK 部署和使用技巧
- 为系统集成 ELK
- Canal 入门
- Canal 的配置和使用方法
- 搭建 Canal
- 利用 Canal 更新缓存
- 利用 Canal 同步数据到 ElasticSearch
- 利用 Canal 同步数据到 Kafka
- 利用 Canal 来重构增量校验逻辑
- 面试要点
第十九周 Feed 流设计与实现
教学目标:
- 掌握 Feed 流的常见思路,掌握推模型、拉模型和推拉结合的模型
- 了解常见的用户兴趣模型、内容推荐模型、内容分发策略
- 掌握 Feed 流性能优化的技巧
- 掌握压力测试的技巧和性能数据解读的方法
针对的用户痛点:
- Feed 流是一个非常高级的话题,面试中也经常被面到,但却很难答好
- Feed 流的设计和落地,性能问题非常关键,但却不知道怎么可以优化性能
- 平时在公司完全没有机会接触到压力测试相关的内容,或者接触到了也不知道怎么搞,甚至看到了压测的数据也不知道如何解读
实践练习:
- 设计并实现一个 Feed 流
- 基于推模型
- 基于拉模型
- 基于推拉模型
- 运行压力测试,测试系统的关键 API
详细内容:
- Feed 流设计与实现
- 读写不平衡问题
- 推模型、拉模型和推拉模型
- 架构设计
- 性能测试和优化
- 性能测试工具入门
- 性能测试环境准备
- 性能测试数据分析
- 性能问题定位与优化
- 职场刷亮点
- 为公司的核心业务执行压力测试
- 面试要点
第二十周 即时通讯 IM 服务设计与实现
教学目标:
- 掌握即时通讯的原理、架构设计
- 掌握 WebSocket 使用
- 掌握长连接的原理和使用技巧
- 掌握如何在 Web 系统中接入即时通讯,实现站内私聊功能
- 掌握 OpenIM 的使用
针对的用户痛点:
- 即时通讯运用越来越广泛,但即时通讯本身架构设计复杂、实现复杂,十分难以学习
- WebSocket 在面试中经常遇到,但是不了解原理,也缺乏实践
- 长连接可以说是面试必面内容,但是从来没使用过,或者公司用过,但不知道背后原理,也不知道中间难点
实践练习:
- 部署 OpenIM 服务器
- 在系统中利用 OpenIM 服务器,接入 Web 聊天功能
详细内容:
- 长连接原理、使用技巧
- WebSocket 原理、入门
- 即时通讯原理和架构设计
- 即时通讯核心组件及功能
- 即时通讯核心流程
- 即时通讯性能瓶颈和优化思路
- OpenIM 入门
- OpenIM 架构设计
- OpenIM 核心组件
- 部署 OpenIM Server
- 在系统中实现站内私聊功能
- 职场刷亮点
- 优化公司的 WebSocket
- 面试要点
第二十一周 课程总结复盘与面试指导
教学目标:
- 梳理整个课程的逻辑与知识体系
- 复盘整个课程的重点、难点内容
- 总结教学过程中比较高频的学员问题
- 给出评估自己学习成果的参考模型
针对的用户痛点:
- 跟完了课程但不知道自己究竟学得怎么样
- 学完后面的忘记了前面的知识点
- 学完之后还有很多问题,也对其他同学的学习经历感兴趣
详细内容:
- 梳理整个课程的知识体系
- 课程各个阶段的重点和难点
- 设计模式在课程中的应用
- 不同设计偏好和设计理念在课程中的体现
- DDD 和 TDD 在课程中的应用
- 课程中的最佳实践
- 评估课程中设计和实现的质量
- 学习中常见问题总结
- 能力评估模型
- 准确评估自己的学习状态,是否达成学习目标,以及还有哪些方面有待提高
- 后续学习和提高的建议
- 面试指导
- 如何将课程内容融入简历
- 如何用课程内容打造人设
- 如何在面试中引导面试官
- 如何复盘面试
项目介绍
从 0 到 1 实现一个企业级内容社交平台项目“小微书”,给你一套可复用的企业级源码,一个商业级的面试作品。
从功能性上来说包含:
- 用户服务:支持手机号码快捷登录,微信扫码登录
- 用户关系服务:支持关注,利用分库分表和 TableStore
- 发帖服务:制作库与线上库分离,利用 binlog 进行数据同步,支持打标签、点赞、收藏、打赏、评论功能
- 支付服务:设计并实现支付服务,对接微信支付 API
- 搜索服务:利用 ElasticSearch 搭建搜索服务,优化索引和查询性能
- 即时通讯:设计并实现站内聊天功能,深入了解高性能高可用 IM 架构
- Feed 流:分别实现推模型、拉模型和推拉模型,并进行总结对比
从非功能性上来说追求高性能、高可用和高可扩展性,以及总结最佳实践。
- 高性能:每一个服务都会考虑性能问题,引入 Go 基准测试、性能测试和压力测试,解读测试数据,并实践性能优化的方案。
- 高可用:考虑每个环节的容错,提供完善的服务治理。引入全方位的可观测性平台,及时发现问题并且告警。
- 高可扩展性:面向接口编程,结合依赖注入,做到每个服务都可以替换不同的实现或第三方依赖。
从项目管理上,覆盖需求分析、项目设计、服务开发、全方位测试、Kubernetes 部署等软件开发中的主要流程。
八大实操案例
案例一:设计并实现一个典型用户服务
- 掌握基本的用户服务设计与实现,掌握账密登录、手机验证码登录和扫码登录
- 掌握 SSO 的原理
- 掌握第三方平台对接技巧,对接微信平台和短信供应商
案例二:设计并实现一个发帖服务
- 掌握发帖服务的设计与实现,掌握常见的制作库与线上库分离的方案
- 掌握大文本存储的基本方案,掌握和搜索服务结合的方法
- 掌握 OSS 和 CDN 结合的方案
案例三:设计并搭建一个搜索服务
- 掌握搜索服务的设计与实现,理解搜索的架构设计
- 了解 ElasticSearch 的基本概念、功能和特点,包括数据存储、搜索算法、扩展性等
- 了解 ElasticSearch 的监控和性能优化方法,包括指标、工具和优化策略等,能够对 ElasticSearch 进行性能优化和故障排除
- 掌握 ElasticSearch 索引创建与优化的技巧
- 掌握利用 Canal 同步数据到 ElasticSearch 的方法
案例四:设计并实现一个 Feed 流
- 掌握 Feed 流的常见思路,掌握推模型、拉模型和推拉结合的模型,综合对比各种模型的优劣
- 掌握 Feed 流性能优化的技巧
- 掌握压力测试的技巧和性能数据解读的方法
案例五:设计并搭建一个即时通讯 IM 服务
- 掌握即时通讯的原理、架构设计
- 掌握 WebSocket 使用
- 掌握长连接的原理和使用技巧
- 掌握在 Web 系统中接入即时通讯,实现站内私聊功能
- 掌握 OpenIM 的使用
案例六:设计并实现典型的点赞与收藏功能
- 掌握常见的阅读、点赞、收藏功能的设计与实现
- 深入对比侵入式方案和非侵入式方案对系统的可维护性、可测试性和可扩展性的影响
- 阅读历史功能的设计与实现
- 抽象统一的消息发送和消费接口,适配 Kafka,并提供测试支持
- 掌握识别可异步可执行的业务逻辑小技巧
案例七:设计并搭建一个完整的监控与告警服务
- 日志分析工具:了解常用的日志分析工具,如 ELK 等,并掌握如何使用它们来收集、存储和处理日志数据
- 跟踪和追踪工具:了解常用的跟踪和追踪工具,如 Prometheus、Grafana、Istio 等,并掌握如何使用它们来收集、存储和分析应用程序的跟踪数据
- 度量和指标工具:了解常用的度量和指标工具,如 Prometheus、Grafana等,并掌握如何使用它们来收集、存储和分析系统指标和警报
- 可观测性监控和优化:了解如何对应用程序进行可观测性监控和优化,包括指标、阈值、告警、重试策略等,并掌握相关工具和解读数据的技巧
- 埋点:掌握在业务中埋点的策略与技巧
案例八:Kubernetes 部署实战
- Kubernetes 基本概念:了解 Kubernetes 的基本概念,如 Namespace、luster、Pod、Container、Deployment、Service 等
- Kubernetes 集群管理:掌握 Kubernetes 集群的创建、配置和管理,包括集群配置、节点管理、容量规划、负载均衡等
- Kubernetes 容器编排:了解 Kubernetes 支持的容器编排工具,如 Docker、Kubernetes Controller、Kubernetes Scheduler 等,并掌握如何使用它们
- Kubernetes 集群监控:了解 Kubernetes 集群的监控指标、监控工具和监控脚本,并能够使用它们对集群进行监控
- Kubernetes 扩展和插件:了解 Kubernetes 的扩展和插件,如 Ingress、Kubernetes Service、Deployment 等
欢迎来撩 : 汇总all