第一周
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 服务注册与发现接入

分组功能

利用分组功能设计隔离机制

职场刷亮点

为公司的核心业务提供隔离机制,保障可用性

面试要点

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。