大一下学期
本学期主要内容是:学习各类常用中间件,包括但不限于Redis,Kafka,etcd等。学习分布式系统开发运维,主要包括微服务,分布式锁,分布式事务,K8S/K3S等。
week1 泛型, 反射, context
泛型与反射
- 泛型声明,类型约束,泛型函数与结构体
- 常见使用场景
context
- 学习context的基本用法和基本类型
- 了解context底层实现
拓展学习
- 底层编程unsafe包的使用
- cgo的使用
任务:
- 使用泛型编写一个泛型栈实现能够对各种元素的出栈入栈
- 自己实现一个json.Marshal(),选做json.Unmarshal()
- 使用context和channel做一个简单的定时任务管理后端系统(具体任务形式自己定义)
要求:
- 暴露服务
- 使用http进行任务的增删改查
week2 测试与CI/CD
测试是软件开发中相当重要的一环,尤其是在DevOps协同工作中占据了非常重要的地位,这一部分经常被开发者忽略,但是却是代码开发的重要部分
测试
- 测试的基本概念(白箱测试,黑箱测试,单元测试,集成测试,模拟测试等)
- 经典测试方法(表格驱动测试,假设测试等)
- 学习编写go测试文件:xx_test.go(testify或者gomock库的使用)
- 了解什么叫mock对象
CI/CD
- 了解什么叫CI/CD
- 学习github action的使用
拓展学习
- 了解什么是DevOps
任务:
- 对mini后端的某一个模块(比如service中的某个多分支方法)进行测试
要求:
- 测试分支覆盖率达到90%以上
- 基于github action完成一套完整的CI/CD工作流
要求:
- 编写测试样例,并对你的整个mini后端的某个几个接口进行集成测试
- 实现自动化测试
- 实现自动化部署(选做)
week3 Redis与缓存
缓存
- 缓存意义
- 缓存使用场景
- 缓存策略
- BASE理论
Redis
- redis基本数据类型(hash,set,zset,string,list)的区别和使用场景
- 熟悉Redis基本命令
- 了解Redis高速的原因
学习资料
redis | redis基础 |
---|---|
Redis 管理工具 | Tiny RDM |
redis深度历险(非常值得一看的好书) | 暂时无法在飞书文档外展示此内容 |
任务
- 选取mini中的一个模块添加缓存,并测试优化了多少性能(思考你的项目什么地方需要缓存)
- 利用redis实现一个定时任务管理系统
要求:
- 使用redis进行数据存储
- 使用channel实现定时检查任务是否应当发布
- 构建一个http后端应用,能够实现对任务的增删改查
拓展学习:
- Go cache比较一下和redis的区别,思考什么时候用go cache更加合适
- redis分布式锁的使用
- lua脚本的使用
week4 MongoDB和PG-JSONB
MongoDB
- Nosql基本概念以及mongdb和关系型数据库的区别
- 使用MongoDBCompass进行管理
- 学习mongo-driver库的使用(可以了解下ODM与ORM的区别)
PostgreSQL
- 了解mysql与pg之间的区别
- 学习jsonb功能的原理和使用
- 使用gorm进行相关操作
拓展学习
- 学习mysql逻辑架构和innoDB实现原理
任务:
- 使用 MongoDB 和 PostgreSQL 分别实现一个简单的通用帖子后端服务
基础功能要求:
- 能够发布主帖子,包括标题、内容、作者等基础信息。
- 支持对主帖子的回复,并能够在回复中 @某个回复,形成嵌套的评论结构。
- 支持个性化拓展字段,能够灵活增加如图片、标签、位置等自定义字段。
- 提供 API 接口进行帖子和评论的增删改查。
数据模型设计:
- MongoDB:使用嵌套文档来表示主帖子及其评论。
- PostgreSQL:使用 JSONB 字段来存储个性化拓展字段,同时通过表关联来实现评论嵌套。
- 测试两种实现方案的性能差异 (选做)
性能测试要求:
- 发布帖子性能:测试连续发布 1000 篇帖子所需时间。
- 查询单个帖子及其全部评论的性能。
- 增加评论的性能,测试每个帖子下添加 100 条评论的时间。
- 对个性化拓展字段的查询和更新性能。
- 并发测试,模拟 100 个并发用户同时对帖子进行发布和评论操作。
数据规模:
- 测试数据生成脚本,生成 1000 篇帖子,每篇帖子包含 10-20 条评论。
- 个性化拓展字段随机生成,字段数量 3-5 个。
week5 消息队列Kafka
KafKa
- 了解Kafka基本实现原理
- 了解Kafka核心概念:broker,topic,partion,producer,consumer等
- 使用docker安装启用了Kraft的kafka
Sarama
- 研究Sarama包的API,达到能够不查资料实现一整套生产和消费链的水平
拓展学习
- 了解feed流的概念,以及推模型和拉模型的区别
- 了解一下Kafka和RocketMQ/RabbitMQ的区别
任务:
- 实现一个简单的消费者和生产者并实现批量消费
week6 Sarama实战与CAP原理
CAP理论
- CAP 理论的基本概念
- 为什么 CAP 不能同时满足三者?
- CAP 理论的实际应用(AP、CP、CA 组合的现实意义)
任务:
- BiliBili UP主视频更新实时提醒系统设计
要求:
- 用户可以订阅多个UP
- 当订阅的UP更新视频后应当对用户进行消息推送(发送Email)
- 使用爬虫实时监控制定UP的视频
- 使用kafka对消息进行生产和消费实现限流,最终消息存到数据库里面
- 暴露一个接口让用户可以获取数据(思考使用推模型还是拉模型并给出自己的理由)
注意:
- 爬虫重试频率不要太高防止被限流(10s~30s尝试一次即可)
week7 DDD理论
可能是学了这么久后端接触的最玄之又玄的概念,DDD其实没有严格的范式,它更贴近一种设计理念而不是架构,只有基于DDD的架构,而没有DDD架构
基本概念:
- 领域模型( Domain Model )
- 实体(Entity)
- 值对象(Value Object)
- 聚合根(Aggregate Root)
重要思想:
- 充血模型和失血模型
- 限界上下文(Bounded Context)
- 事件驱动(Event Driver)
- 仓储模式(Repository Pattern)
经典划分层次:
- 应用层(Application Layer)
- 领域层(Domain Layer)
- 基础设施层(Infrastructure Layer)
- 接口层(Interface Layer)
任务:
- 学习并理解kratos的基本架构,要求能够做到与DDD核心概念进行对应。
week8 微服务理论入门
微服务基本概念
- 服务拆分的原则?
- 什么时候适合拆分成微服务?
- 服务划分原则:单一职责原则等
Gateway 与 BFF
- 核心区别是什么?
- 分别有什么实现方案?
注册中心:etcd
- 了解不同注册中心的CAP的区别
- etcd 基本原理(分布式 KV 存储、Raft 协议)
- 微服务注册与发现(服务心跳、故障摘除)
配置中心
- 为什么需要配置中心(集中管理 vs. 本地配置文件)
- 如何使用etcd作为配置中心?
- 配置动态刷新机制,热更新
任务:
建议每个服务都只有一两个文件,有一个最简单的功能就可以,不要花大量时间在写各种层次划分上
- 写一个最简单的微服务
要求:
- 使用注册中心
- 使用配置中心进行集中配置
- 使用Gateway进行转发
- 涉及至少3个服务包括Gateway->A,B ; A->B的交叉调用
go
[API Gateway]
|
----------------
| |
[A 服务] [B 服务]
|
[B 服务]
1
2
3
4
5
6
7
2
3
4
5
6
7
week9 集群化运维
如果说Docker是云原生的门槛,那么Kubernetes就是云原生架构的核心
云原生下的服务架构
了解以下概念和它们的存在意义
K8S:
任务:
- 使用k8s集群部署上一周你编写的微服务
要求:
- 在本地使用docker或者VM虚拟机(VMBox等)启动至少两个linux虚拟机作为节点
- linux发行版本选相同的以避免cgroup的适配问题
- 如果使用VM需要手动处理内存分配问题,k8s建议每个节点分配2G及以上不然内存不够启动
- k8s集群搭建复杂度非常高,可以选择k3s或者使用kubeadm来搭建(对于k8s新手建议用k3s,喜欢挑战极限的话可以试试别的方案)
- 简单描述下你的服务分片策略
- 画一个云原生下的项目架构图(能有多详细就有多详细,可选任务)
要求:
- 主要在后端部分进行细化,可以从服务和服务内部架构等多个层级进行详细描述
拓展任务:
- 学习docker和k8s的底层架构设计,可以看看入门的书籍
week10 分布式锁
redis分布式锁
任务
- 木犀外卖秒杀系统1.0
现在黑马程序员找到了你,让你去实现一个go版本的苍穹外卖,你为了证明自己是IT黑马,英勇无畏的接下了这个任务
要求:
- 编写一个简单的秒杀系统,暴露两个路由
go
post /kill //用于秒杀商品
post /register //用于注册账号
1
2
2
- 在k8s集群上部署10个副本
- 数据库有三个表,一个存储商品id和剩余数量,一个存储商品具体情况(主要是金额),最后一个存储用户的账户余额(默认每个人初始都有一定钱)
- 使用压测工具例如(vegeta)进行测试
week11 分布式事务
事务
- 什么是事务?
- ACID四大特性
DTM
- 什么是分布式事务,有什么使用场景?
- 核心概念包括但不限于幂等性,事务模型(重点关注TCC,Saga)
- 了解dtm库的使用
拓展学习:
任务
- 木犀秒杀系统2.0
由于你做出来的秒杀系统好评如潮,被京东外卖,美团,饿了么等广大电商平台积极采用,在巨大的流量冲击下你的服务崩塌了,黑马程序员希望你能够出一个微服务的版本,让他们能够更好投入云原生的怀抱。
要求:
- 将商品服务和支付服务分离,包含至少三个服务gateway,pay,item
- 在gateway中使用分布式锁+事务来完成商品秒杀的控制
week12 搜索引擎
ElasticSearch
- elasticsearch核心概念,使用场景,基础语法
- 搜索业务实现逻辑
拓展学习:
- 利用canal实现mysql,es读写分离
任务
- 木犀秒杀系统3.0
你的系统写的太过完美,导致各大商家都打算迁移到你的系统上去,现在需要接入各大商家原本的数据库并实现商品的搜索功能
要求:
爬取任意商家的一定数量商品信息(不少于3000个)
将爬取的数据写入es
能够根据商品名称和描述进行全文搜索
week13 限流策略与流量兜底
限流策略:
- 令牌桶限流
- 滑动窗口限流
流量兜底:
- 流量降级(降级的策略有哪些?)
- singleFight
拓展任务
- 使用go语言编写一个简单的网关,具备基本的限流能力,可以参考nginx,caddy,Envoy等常见网关
参考资料
redis令牌桶限流库 | redis_rate |
---|---|
sync仓库 | sync |
开源网关参考 | https://github.com/alibaba/higress |
任务:
- 木犀秒杀系统4.0
恭喜你,你的秒杀系统已经被几乎所有电商企业采用。为了迎接即将到来的618,黑马程序员再次请你出山为秒杀系统增加限流措施
要求:
- 增加限流中间件LimitMiddleware实现对流量的限流(限流对象可以自己选择,合理即可)
- 增加获取商品列表的接口同时为这个接口增加singlefight
- 为商品秒杀中因为分布式锁长时间等待的用户进行流量降级
大一下期末任务
任务
基于本学期所学提交一个微服务的基本模板
要求如下:
- 符合DDD设计理念
- 符合微服务设计理念
- 至少包括注册中心,配置中心,数据库等
- 上传到github仓库