◆ 视频内容总结

从单机到云原生:分布式架构的九步演进

一段面向后端开发者的架构演进教学视频。它不讲具体框架,只讲一件事:当业务压力一层层加上来,架构该怎么一步步被逼出来,以及每一步到底解决了什么。

时长 12 分 44 秒 来源 视频号 AGv7cP6mkf 类型 手绘架构图讲解
视频来源与版权声明
视频号
jiagoushiaq
原作者
架构师阿Q
原视频
https://weixin.qq.com/sph/AGv7cP6mkf
时长
12 分 44 秒

架构不是设计出来的,是被业务压力逼出来的 —— 九步演进链,每一步都由一个具体痛点触发。

内容说明:本页为第三方二次整理与解读,非原作者发布。原视频版权归原作者及原平台所有;本页仅作技术学习与行业洞察引用,并已保留完整原始链接以便溯源。如原作者认为引用不当,可通过上方链接联系下架。
▶ 原视频 · 从单机到云原生:分布式架构的九步演进另开窗口播放 / 下载

01一句话核心

整段视频其实只论证了一件事。

架构不是设计出来的,是被业务压力逼出来的。每一步演进都由一个具体的痛点触发 —— 先是扛不住并发,再是数据库被压垮,然后是安全风险、扩展成本、运维成本 —— 每解决一个,就立刻换来下一个问题。理解了这个链条,比记住任何一张架构图都重要。

业务压力 架构复杂度 单机 集群 缓存 读写分离 分库分表 网关/CDN 微服务 容器化 搜索/NoSQL 每向右一步 = 多付出一点复杂度,换更高一档的承载力
图 0 · 全景 —— 横轴是时间/演进方向,两条曲线一起涨:压力推着架构往前走,而每一步的复杂度都是上一场的账单

02九步演进链

按视频顺序,每一步都标注了「触发它的问题」和「引入的技术」。

STEP 1

单机架构

起点:用户少,一台机器上应用 + 数据库就够了。

少量用户 一台服务器 应用程序 数据库 资源争抢 CPU / 内存 / IO 互相拖垮 这一格的问题 · 应用和数据库抢同一份 资源,互相拖慢 · 一台机器挂了全挂 · 只能整机扩容
图 1 · 单机架构 —— 应用与数据库同处一台机器,资源共享是它唯一也致命的软肋

解决问题:从零搭建 —— 成本最低,先跑起来。

单机部署应用与数据库同机
STEP 2

用户暴涨 → 水平拆机

用户量涨上来后,一台机器变成 5 台、10 台,但谁来分发流量成了新问题。

海量用户 负载均衡 流量分摊 故障自动屏蔽 应用 1 应用 2 应用 3 应用 4 应用 5 应用集群(无状态,可无限横向加机器) 数据库 全部流量仍压向同一个 DB
图 2 · 应用集群 + 负载均衡 —— 应用层扛住了,但压力全部下沉到数据库,成为下一个瓶颈

解决问题:应用集群 + 负载均衡 —— 可以自动屏蔽单台故障、自动分摊流量。

负载均衡无状态横向扩容
STEP 3

缓存登场

机器加多了,请求全压到数据库,数据库内存根本不够用。

应用服务器(进程内) 应用 A 应用 B 应用 C ① 本地缓存 L1(进程内 · 纳秒级) Redis 分布式缓存 L2 微秒级 数据库 访问路径 命中 L1/L2 直接返回 · 不碰数据库 全部未命中 才回落到数据库 ms → μs 量级跃迁
图 3 · 多级缓存 —— 先查进程内 L1,再查 Redis L2,最后才落到数据库;数据库只接真正需要持久化的数据

解决问题:多级缓存 —— 本地缓存 + 分布式缓存 Redis,单次访问从 ms → μs 量级。

本地缓存Redis查询性能 / 数据库压力
STEP 4

读写分离

写操作挡住了读操作,读写互相阻塞。

应用服务器 读写请求都从这里进来 写 读 Master 只负责写 Slave 只负责读 数据同步 效果 写不再阻塞读 读吞吐横向扩展 代价:短暂延迟
图 4 · 读写分离 —— 主库只写、从库只读,读写互不阻塞;代价是同步带来的短暂数据延迟

解决问题:Master / Slave 主从 —— 从库只负责读,主库只负责写。

数据库读写分离读写阻塞
STEP 5

分库分表

单库即使读写分离也撑不住海量数据存储。

数据库中间件 应用(无感知) 用户库 sh1 user_01 · user_02 商品库 sh2 product_01 订单库 sh3 order_01 · order_02 用户从库 ×3 商品从库 ×2 订单从库 ×5 中间件承担:分片路由 · 跨库聚合 · 扩容迁移 · 主从切换 —— 这些复杂度全部收敛在一层,上层应用不用改
图 5 · 分库分表 + 数据库中间件 —— 按业务域垂直拆库,再按数据量水平分片,中间件消化全部路由复杂度

解决问题:分库分表 + 数据库中间件 —— 路由、扩容、跨库查询都交给中间件,应用无感。

数据库中间件分库分表
STEP 6

反向代理 + CDN

业务铺到广州 / 上海 / 北京多地后,太危险、容易被攻击。

广州用户 上海用户 北京用户 公网 CDN 静态资源就近分发 反向代理 流量清洗 · 权限校验 恶意流量在这里被拦下 真实应用服务器 应用 1 应用 2 IP 不暴露 这一层买到了什么 · 访问速度 —— CDN 把静态资源推到离用户最近的地方 · 系统安全 —— 真实服务器地址不暴露,攻击流量在入口就被清洗、鉴权、限流
图 6 · CDN + 反向代理 —— 多地部署后的必需层:入口统一收口,恶意流量在到达应用之前就被拦掉

解决问题:反向代理 + CDN —— 流量清洗、权限校验、静态资源就近分发。

反向代理CDN访问速度 / 系统安全
STEP 7

微服务拆分

想给「订单」单独加机器扛流量,但在单体里做不到 —— 只能整机扩容,大材小用。

反向代理 微服务集群 · 各自独立部署 / 发布 / 扩容 商品服务 用户服务 订单服务 支付服务 登录服务 会员服务 ×4 实例(单独扩容) 服务注册与发现中心 RPC 自动选址 消息队列 异步消费 · 削峰 服务治理 限流熔断降级 Redis · 搜索 · NoSQL 分库分表 · 数据库中间件
图 7 · 微服务拆分 —— 按业务边界拆开,各自独立扩缩容;注册中心解决「找谁」,消息队列解决「别堵住」

解决问题:单独部署 / 单独发布 / 单独扩容 —— 按业务边界拆成用户、商品、订单、支付、登录、会员等独立服务;配合服务注册与发现中心(RPC 自动选址)、消息队列(异步消费、削峰)。

服务注册与发现消息队列服务治理
STEP 8

容器化 → Kubernetes

服务拆到几百上千个后,配环境、装依赖、调参数成了灾难,稍微不一致就跑不起来。

传统部署 运行环境 运行环境 运行环境 运行环境 运行环境 运行环境 版本不一致 → 环境问题 → 跑不起来 打包 容器化部署 Docker 引擎 · 镜像即运行环境 商品 用户 订单 支付 登录 会员 放哪台服务器都能直接跑 Kubernetes —— 容器编排 / 自动调度 / 自愈 / 弹性伸缩
图 8 · Docker + Kubernetes —— 容器解决「环境一致」,K8s 解决「几百上千个容器怎么管」

解决问题:Docker 引擎(连运行环境一起打包,放哪都能跑)→ Kubernetes(容器编排、云平台)。

DockerKubernetes容器 / 集群 / 限流熔断降级
STEP 9

搜索引擎 + NoSQL

数据量大了以后,复杂查询和模糊查询越来越难做。

应用 MySQL 关系型 · 精确查询 · 事务 存结构化数据 ElasticSearch 倒排索引 · 模糊 / 全文 复杂查询搬到这里 MongoDB NoSQL · 半结构化 灵活字段 · 大文档 倒排索引做了什么 正向:ID → 内容 只能按 ID 找 倒排:内容 → ID 所以能按内容找 数据怎么同步过去 MySQL 是唯一真实来源(source of truth) 通过 binlog / 消息队列同步到 ES 与 Mongo 扩展 ≠ 替换:关系库仍留在体系里,只是不再承担它不擅长的查询
图 9 · 搜索引擎 + NoSQL —— 不是替换关系库,而是把关系库不擅长的复杂/模糊查询分流出去

解决问题:ElasticSearch 倒排索引(专门存非结构化/半结构化数据)+ NoSQL(MongoDB) —— 把复杂查询从关系库里挪出来。

ElasticSearchMongoDB复杂查询

03架构 ↔ 问题的对照表

视频结尾给出的原表,建议收藏 —— 这是「遇到什么问题就上什么技术」的速查索引。

架构解决的问题
单机架构从零搭建
应用与数据分离资源争抢
应用集群 + 负载均衡高并发
多级缓存查询性能、数据库压力
数据库读写分离数据库读写阻塞
分库分表 + 分布式数据库海量数据存储
CDN + 反向代理访问速度、系统安全
搜索引擎 + NoSQL复杂查询

04三句架构师的核心思维

视频的落点。三句话,等于整段内容的压缩包。

没有最好的架构,只有最适合业务的架构

架构没有普适的最优解,只有和当前业务规模、团队能力、预算匹配的那个解。过度设计比架构平庸更贵。

演进的本质:空间换时间,复杂度换性能

每引入一个中间件(缓存、分库分表、服务治理),都是用更多的机器和更复杂的心智负担,换取更高的吞吐。每一次交换都必须算得清才值得做。

永远围绕五大目标:高性能、高可用、可伸缩、可扩展、够安全

「够安全」这个词很妙 —— 不是绝对安全,而是成本收益下的合理水位。任何架构决策最终都要回到这五条上做检验。

05关键概念速查

视频里出现的名词,用一句话说清它到底解决什么。

负载均衡把请求分摊到多台机器,并自动屏蔽掉挂掉的节点。
多级缓存进程内本地缓存挡最热的读,Redis 挡跨进程的读,只有都未命中才落到数据库。
读写分离写走主库、读走从库,用数据同步的短暂延迟换取读吞吐。
数据库中间件把分库分表的路由、扩容、跨库聚合藏在中间件里,上层应用无感。
反向代理统一入口,做流量清洗、鉴权、限流,把真实应用服务器藏到后面。
服务注册与发现服务上线时把自己注册到中心,调用方按名字找地址,不用硬编码 IP。
消息队列把同步调用改成异步消费,天然削峰,也能在下游挂掉时先存住请求。
倒排索引ElasticSearch 的核心:从「按 ID 找内容」变成「按内容找 ID」,让复杂查询跑得动。

06对到领锁 LMC 平台上

顺手做个映射 —— 这套演进链和 LMC 的三端设计能对上不少。

演进链在 LMC 上的对应关系

不是要现在就全上,而是标明「哪一层现在在哪一格」。

服务底座入口(鉴权 / 限流 / 多租户路由) ≈ STEP 6 反向代理 L 系统 服务底座 / 运维 C 系统 门店端 / 业务操作 M 系统 集团品牌端 / 看板 ≈ STEP 7 微服务(但按「使用者角色」切,而非业务域) 实施顺序:L → C → M 多租户隔离:Group → Brand → Project ≈ STEP 5 分库分表(提前做)
图 10 · LMC 现状定位 —— 三端拆分落在 STEP 7,多租户隔离相当于把 STEP 5 提前了
流量入口
视频 STEP 6 的 CDN + 反向代理 对应 LMC 的服务底座入口。考虑到 LMC 是一键私有化部署、客户部署在酒店内网,CDN 这层退化为客户侧网关,反向代理(鉴权 / 限流 / 多租户路由)这层是必须有的。
业务拆分
视频 STEP 7 的微服务,对应 LMC 的 L / C / M 三端。三端本质是按使用者角色切,比按业务域切更早发生 —— 这意味着 LMC 天然规避了「服务拆太细」这个坑:设备固件、梯控门禁这些业务域的拆分应该留在三端内部做,不要外泄成跨端调用。
多租户
视频里完全没覆盖的一块,但恰好是 LMC 的核心难点。Group → Brand → Project 的层级隔离,本质是把「分库分表」提前做了 —— 在业务量还没到之前就用逻辑隔离换掉了后期分库的迁移成本。这是视频那句「没有最好的架构」的直接应用。
缓存
STEP 3 的多级缓存对 LMC 同样成立,且优先级更高:设备状态、位置标识这类高频读、低频写的数据,天然适合本地缓存 + Redis 的两级结构。
位置标识
视频反复强调「相同位置标识 → 验证权限一定相同」,这个不变式和「同一个 master 数据各处引用」是同一种思路 —— 把一致性的判断收敛到一个点上,比在每个消费方各自校验要可靠得多。
私有化交付
STEP 8 的 Docker / Kubernetes 对 LMC 是差异化优势:竞品要上门逐台装,LMC 把整套东西打包成镜像,一键拉起。这个差距正好卡在「够安全 + 好运维」这两条上。
内容总结自视频号链接 weixin.qq.com/sph/AGv7cP6mkf · 全 38 帧逐帧核对