Day 1 / 30 · 模块 M1
Day 1 · 认知日

微服务架构认知
+ 环境准备

今天是认知日,不写一行微服务代码,但要解决一个根本问题:你到底为什么要学微服务? 答不清这个,后面学每个组件都会觉得"这不就是加个依赖吗"。

1.5 小时 3 个核心概念 2 个动手任务 5 道检测题
1

单体架构及其痛点

先理解"痛",才知道微服务为什么存在。

所有功能打包进一个进程、一个部署包。
生活类比 · 大饭店
一栋「大饭店」:后厨、点餐台、收银台、保洁、保安全在一栋楼里。炉灶炸了要整栋楼停业装修;想给烧烤区换新设备,得整栋楼关门重新装修。
技术结构
// 一个 Spring Boot 工程里塞下所有功能 mall-app/ ├─ controller/ UserController · ProductController · OrderController ├─ service/ UserService · ProductService · OrderService └─ 共享同一个数据库连接池
它不是坏东西

团队小、业务简单时,单体是最优解:开发快、调试方便、没有网络开销。别神化微服务

但它长大后会疼
痛点具体表现
代码膨胀几百人改一个仓库,merge 冲突天天打
部署耦合改一行代码 → 重新部署整个系统
扩展浪费只有"下单"要扩容,却把整个系统复制 10 份
技术锁死想给一个模块换 Go/Rust?做不到
故障扩散一个 OOM,整个系统全挂
标志性案例:某电商大促时"商品搜索"接口 CPU 飙满,本该只死搜索,结果连"下单""支付"全超时——一个慢服务拖死全家。单体最大的痛:没有隔离带
2

微服务架构

同样的需求,换个组织方式。

按业务能力把单体拆成多个独立部署的服务,每个服务独占自己的数据库。
生活类比 · 美食街
不做大饭店,改做「美食街」:每个摊位独立经营,自己有炉灶(独立数据库)、自己招人。烤串摊爆火 → 只给它加人手(独立扩容);奶茶摊坏了 → 烤串摊照卖(故障隔离)。游客不用记每个摊位坐标——门口有导览牌(网关)和实时招牌(注册中心)。

大饭店 / 单体

所有功能挤在一个进程
  • 一个故障全盘崩
  • 整体重新部署
  • 无法独立扩容
  • 共享一个数据库

美食街 / 微服务

按业务拆成独立服务
  • 故障互相隔离
  • 各自独立部署上线
  • 按需独立扩容
  • 数据各自独占
三个定义性特征(判断是不是微服务)
特征
按业务能力拆用户 / 商品 / 订单 各一个服务controller / service / dao 各一个 ✗
独立部署每个服务单独上线改一个要全量发版
数据隔离每个服务独占自己的库所有服务连同一个库
代价(务必认清)
  • 系统复杂度↑:要管一堆服务的发现、配置、调用、监控
  • 网络调用↑:原来本地方法,现在走 HTTP,有延迟和故障
  • 数据一致性↓:原来一个事务,现在跨库了
今天最重要的一句话:微服务不是"更高级",而是"为长大了的系统准备的拆分策略"。Netflix 当年也是单体,一次数据库故障宕机 3 天,才被迫转向微服务。理解痛点 → 再学技术。
3

Spring Cloud 全家桶地图

治理"一堆微服务"的工具箱——每个组件 = 美食街的一个市政设施。

服务怎么发现、怎么配置、怎么调用、怎么抗故障,它都给你现成的组件。
三块关系(很多人搞混)
Spring Boot → 做单个服务(地基) Spring Cloud → 治理组件的「接口标准」(Spring 官方定规范) Spring Cloud Alibaba → 阿里的「具体实现」(Nacos/Sentinel/Seata)
全家桶地图(本项目要学的标 ★)
实时招牌
Nacos 注册中心 ★
服务启动自动登记,调用方自动找到
公告栏
Nacos 配置中心 ★
配置集中管理,动态刷新
导览牌
Gateway 网关 ★
统一入口、路由、鉴权、限流
内部对讲机
OpenFeign ★
声明式跨服务调用
分流员
LoadBalancer ★
多实例间分流
保险丝
Sentinel ★
熔断降级限流,防雪崩
财务对账
Seata (AT) ★
跨库数据一致
邮筒
RabbitMQ ★
异步解耦、事件驱动
GPS 轨迹
Zipkin ★
一次请求经过哪些服务
集装箱
Docker + Compose ★
一键启动整套环境
为什么用它:没有 Spring Cloud,每个团队都要自己写心跳、负载均衡算法、熔断状态机。它把这些"踩过无数坑"的逻辑做成了加个依赖就能用的组件——让你专注业务,治理逻辑用现成的。

今日任务(动手做,约 50 分钟)

代码不动 = 没学会。今天先把地基打好。

1

检查开发环境(20 分钟)

在终端逐条验证,缺什么装什么(Docker Desktop 一条龙搞定 Docker + Compose;JDK 17 用 Temurin)。

java -version→ 17.x
mvn -version→ 3.8+
docker --version→ 2x.x
docker compose version→ v2.x
2

画一张微服务电商架构图(30 分钟)

基于"美食街"类比,画出含 3 业务服务(user/product/order)+ 5 治理组件(Nacos/Gateway/RabbitMQ/Seata/Zipkin)的架构,标注用户请求完整路径,每个组件写一句话职责。

👤 用户
Gateway
↓ 路由分发
user-service
product-service
order-service
Nacos
Seata
RabbitMQ
Zipkin
↑ 把空白处填全,每个组件标上职责 → 及格作业

工具任选:手画拍照 / draw.io / Excalidraw / Mermaid。写到 02_case_studies/architecture-diagram.md

📋 查看 Mermaid 起手模板(复制来改) graph TB U[用户] --> GW[ ___ ] GW --> US[user-service] GW --> PS[ ___ ] GW --> OS[ ___ ] US -.-> N[ ___ ] OS -->| ___ | US OS -.->|Seata| PS

今日检测题(5 道)

先自己做,别翻上面。答错不可怕,我会判断你错在哪一类。

选择题 · 1 分
1. 关于单体架构,下面说法正确的是?
选择题 · 1 分
2. 下列哪一项不是微服务的核心特征?
选择题 · 1 分
3. 关于 Spring Cloud,正确的是?
概念解释 · 自评 1 分
4. 为什么"搜索接口被刷爆"会导致单体系统整体瘫痪,而微服务能避免?
参考思路:单体里所有功能跑在同一个进程,共享 CPU/内存/线程池。搜索接口把资源耗尽,下单/支付就抢不到资源而超时——没有隔离带。微服务把每个业务拆成独立进程,搜索服务挂了,订单服务进程不受影响,照常工作。关键词:进程隔离、资源隔离。
场景应用 · 自评 1 分
5. 团队 3 人做一个新电商系统,技术负责人问你"现在该用单体还是微服务",你怎么回答?(建议 + 至少 2 条理由 + 何时改变)
参考思路:建议先用单体。理由:① 团队只有 3 人,微服务的运维复杂度(注册/配置/监控/部署)会拖垮交付速度;② 业务边界还不清晰,过早拆分容易拆错、频繁返工;③ 单体开发快、调试方便,适合快速验证。何时改变:当团队扩张到 8+ 人、代码量膨胀到 merge 困难、或某模块需要独立扩容(如搜索)时,再拆。
选择题自动判分(满分 3)
— / 3