本文基于经典互联网架构演进故事,详细拆解了技术架构从单机应用逐步发展为云原生体系的完整过程。每个阶段的变化都由业务需求推动,解决了特定的性能、可用性或维护性问题。
参考视频:【互联网架构就这?1个故事讲清楚】 https://www.bilibili.com/video/BV1M15Q6eEhL/?share_source=copy_web\&vd_source=ac463602dd8d0886e2a38fe9ce293aea
一、 架构演进全景速览
| 演进阶段 | 核心目标 / 解决的问题 | 引入的关键技术/组件 | 技术栈选型举例 |
|---|---|---|---|
| 1. 单机架构 | 快速搭建应用,验证商业模式 | LAMP 技术栈 | Linux + Apache + MySQL + PHP |
| 2. 应用与数据分离 | 解决资源争抢,提升基础性能与可用性 | 应用服务器 + 数据库服务器 | Tomcat + 独立 MySQL |
| 3. 应用服务器集群 | 应对高并发,实现水平扩展和高可用 | 负载均衡、集群 | Nginx + Tomcat 集群 |
| 4. 数据库读写分离 | 解决读写阻塞,提升数据库并发能力 | 主从复制、读写分离中间件 | MySQL 主从 + ShardingSphere |
| 5. 引入多级缓存 | 将查询从毫秒级优化到微秒级,降低数据库压力 | 浏览器缓存、本地缓存、分布式缓存 | Caffeine + Redis + CDN |
| 6. 分库分表 | 突破单库单表容量瓶颈,实现海量存储 | 垂直分库、水平分表、数据库中间件 | ShardingSphere + MySQL |
| 7. 引入CDN和反向代理 | 加速跨地域访问,增强系统安全性 | CDN、反向代理 | 阿里云CDN + Nginx |
| 8. 引入搜索引擎和NoSQL | 实现复杂查询,应对多样化数据结构 | 搜索引擎、NoSQL 数据库 | Elasticsearch + MongoDB |
| 9. 分布式服务架构 | 解决单体应用维护难题,实现模块独立部署 | RPC、注册中心、消息队列 | Dubbo + Zookeeper + RocketMQ |
| 10. 微服务架构 | 细粒度拆分,支持独立交付和极致弹性 | API 网关、全链路追踪、熔断器 | Spring Cloud + Sentinel |
| 11. 容器化与云原生 | 解决微服务运维复杂性,实现自动化弹性 | 容器、容器编排、云平台 | Docker + Kubernetes |
二、 演进路线图
#mermaid-svg-KPv8A5gbeqwCm2by{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KPv8A5gbeqwCm2by .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KPv8A5gbeqwCm2by .error-icon{fill:#552222;}#mermaid-svg-KPv8A5gbeqwCm2by .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KPv8A5gbeqwCm2by .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KPv8A5gbeqwCm2by .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KPv8A5gbeqwCm2by .marker.cross{stroke:#333333;}#mermaid-svg-KPv8A5gbeqwCm2by svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KPv8A5gbeqwCm2by p{margin:0;}#mermaid-svg-KPv8A5gbeqwCm2by .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KPv8A5gbeqwCm2by .cluster-label text{fill:#333;}#mermaid-svg-KPv8A5gbeqwCm2by .cluster-label span{color:#333;}#mermaid-svg-KPv8A5gbeqwCm2by .cluster-label span p{background-color:transparent;}#mermaid-svg-KPv8A5gbeqwCm2by .label text,#mermaid-svg-KPv8A5gbeqwCm2by span{fill:#333;color:#333;}#mermaid-svg-KPv8A5gbeqwCm2by .node rect,#mermaid-svg-KPv8A5gbeqwCm2by .node circle,#mermaid-svg-KPv8A5gbeqwCm2by .node ellipse,#mermaid-svg-KPv8A5gbeqwCm2by .node polygon,#mermaid-svg-KPv8A5gbeqwCm2by .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KPv8A5gbeqwCm2by .rough-node .label text,#mermaid-svg-KPv8A5gbeqwCm2by .node .label text,#mermaid-svg-KPv8A5gbeqwCm2by .image-shape .label,#mermaid-svg-KPv8A5gbeqwCm2by .icon-shape .label{text-anchor:middle;}#mermaid-svg-KPv8A5gbeqwCm2by .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KPv8A5gbeqwCm2by .rough-node .label,#mermaid-svg-KPv8A5gbeqwCm2by .node .label,#mermaid-svg-KPv8A5gbeqwCm2by .image-shape .label,#mermaid-svg-KPv8A5gbeqwCm2by .icon-shape .label{text-align:center;}#mermaid-svg-KPv8A5gbeqwCm2by .node.clickable{cursor:pointer;}#mermaid-svg-KPv8A5gbeqwCm2by .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KPv8A5gbeqwCm2by .arrowheadPath{fill:#333333;}#mermaid-svg-KPv8A5gbeqwCm2by .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KPv8A5gbeqwCm2by .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KPv8A5gbeqwCm2by .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KPv8A5gbeqwCm2by .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KPv8A5gbeqwCm2by .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KPv8A5gbeqwCm2by .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KPv8A5gbeqwCm2by .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KPv8A5gbeqwCm2by .cluster text{fill:#333;}#mermaid-svg-KPv8A5gbeqwCm2by .cluster span{color:#333;}#mermaid-svg-KPv8A5gbeqwCm2by div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KPv8A5gbeqwCm2by .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KPv8A5gbeqwCm2by rect.text{fill:none;stroke-width:0;}#mermaid-svg-KPv8A5gbeqwCm2by .icon-shape,#mermaid-svg-KPv8A5gbeqwCm2by .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KPv8A5gbeqwCm2by .icon-shape p,#mermaid-svg-KPv8A5gbeqwCm2by .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KPv8A5gbeqwCm2by .icon-shape .label rect,#mermaid-svg-KPv8A5gbeqwCm2by .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KPv8A5gbeqwCm2by .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KPv8A5gbeqwCm2by .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KPv8A5gbeqwCm2by :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 单机架构
应用 + 数据库
应用与数据分离
引入缓存
应用服务器集群
数据库读写分离
CDN与反向代理
分库分表
分布式服务架构
微服务架构
容器化与云原生
三、 各阶段深度解析
1. 单机架构
互联网产品"从0到1"阶段的必然选择。所有应用、数据库、文件存储都部署在同一台服务器上。
- 核心目标:快速上线,验证商业想法。
- 经典技术 :一套 LAMP 环境即可完成搭建。
- 原则:单机够用就好,拒绝过度设计。
2. 应用与数据分离
流量稍有增长,应用和数据库争抢 CPU、内存、磁盘 I/O,导致整体性能急剧下降。
- 做法:将应用服务器和数据库服务器物理分离。
- 收益:两者各司其职,释放资源,同时服务可用性得到提升。
3. 应用服务器集群
单台应用服务器处理能力到达极限,无法通过垂直升级无限提升。
- 做法 :通过增加服务器实现水平扩展 。
- 负载均衡:Nginx / HAProxy 将请求均匀分发到集群所有节点。
- 高可用:单节点故障时自动摘除,流量切换至健康节点。
- 核心问题:如何解决 session 共享(通常引入分布式 session 方案)。
4. 数据库读写分离
集群化后,大量读请求直接将数据库压力拉满。绝大多数互联网场景都是"读多写少"。
- 做法:部署主库(负责写)与从库(负责读),通过主从复制保持数据同步。
- 好处:写入不受读请求影响,读取可横向扩展从库数量。
- 挑战:主从延迟带来的短暂不一致,需要在业务上做一定妥协。
5. 多级缓存
大量重复的读请求仍然会穿透到数据库,而内存读取速度远快于磁盘。
- 做法 :在数据库前构建多层缓存体系。
- 浏览器缓存:缓存静态资源。
- 应用本地缓存(如 Caffeine):减少进程外调用。
- 分布式缓存(如 Redis):集群共享,应对海量数据。
- 效果:热点数据读取从毫秒级降至微秒级,数据库压力骤降。
6. 分库分表
系统运行多年后,单库单表数据量过大,即使所有优化都用尽,写入也会成为瓶颈。
- 垂直分库:按业务将不同表拆分到不同数据库(如用户库、订单库)。
- 水平分表:将一张大表按一定规则(如哈希取模)拆成多张结构相同的小表,分散存储。
- 工具:ShardingSphere、MyCat 等中间件屏蔽分片细节。
7. CDN 与反向代理
用户遍布全国,物理距离导致访问延迟;且系统直接暴露公网风险极高。
- CDN:将静态资源缓存到离用户最近的边缘节点,智能 DNS 返回最近节点 IP。
- 反向代理:Nginx 等组件作为内网屏障,提供安全防护、流量清洗、SSL 卸载等功能。
- 收益:加速静态资源加载,隐藏真实后端服务器。
8. 搜索引擎与 NoSQL
关系型数据库在模糊查询、全文搜索、海量非结构化数据处理上表现不佳。
- 搜索引擎(Elasticsearch):基于倒排索引实现近乎实时的全文检索,适合商品搜索、日志分析。
- NoSQL(MongoDB, HBase):灵活的数据模型,高扩展性,适用于用户行为、社交动态等场景。
- 思路:让专业的工具做专业的事,不强行用关系型数据库处理所有需求。
9. 分布式服务架构
业务不断膨胀,单体"巨石"应用导致代码冲突、发布耦合、无法按需扩容。
- 做法:按业务边界将系统拆分为多个独立服务(用户服务、订单服务等)。
- 核心组件 :
- RPC 框架(Dubbo, gRPC):实现高效的远程服务调用。
- 注册中心(Zookeeper, Nacos):管理服务的动态地址,实现服务发现。
- 消息队列(RocketMQ, Kafka):异步解耦,削峰填谷,保证最终一致性。
- 收益:各服务可独立开发、独立部署、独立扩容。
10. 微服务架构
分布式服务运行一段时间后,会发现部分服务内部仍然高度耦合,需要进一步拆分。
- 做法:遵循"单一职责",拆分至更小粒度,每个服务可以有自己的数据库、技术栈。
- 治理挑战 :服务数量激增,必须建立健全的治理体系。
- API 网关:统一入口,处理认证、限流、路由。
- 全链路追踪(SkyWalking, Jaeger):快速定位慢调用的根因。
- 熔断降级(Sentinel):防止单点故障引发连锁雪崩。
- 关键转变:从代码层面的复用转变为服务层面的复用。
11. 容器化与云原生
成百上千个微服务的手动部署、环境不一致、资源利用率低等问题变得难以忍受。
- 容器化(Docker):将应用及其依赖打包为标准化镜像,实现"一次构建,到处运行"。
- 容器编排(Kubernetes):自动化调度、扩缩容、自愈,是分布式操作系统的内核。
- 云平台:利用云的弹性资源,实现按需分配、自动伸缩,将运维工作进一步托管。
- 最终形态:开发人员只需关注代码,由 CI/CD 流水线和云平台完成交付与运维。
四、 架构演进的核心思维
-
没有银弹,只有最合适的架构
架构演进是被业务逼出来的,初创团队不应盲目追求微服务或云原生。
-
本质是"空间换时间,复杂度换性能"
缓存用空间换时间,服务拆分用复杂度换可扩展性。每一次演进都有代价,需要权衡取舍。
-
始终围绕五大目标设计
- 高性能:缓存、异步、并行处理。
- 高可用:冗余、故障转移、熔断降级。
- 可伸缩:水平扩展、分库分表。
- 可扩展:模块化、服务化,便于新增功能。
- 安全性:反向代理隔离、网关鉴权、数据加密。
从一台服务器到全球分布的云原生容器集群,这套演进脉络是互联网技术发展的缩影。理解它,就能更好地定位系统现状,预判技术瓶颈,并做出理性的架构决策。