从单机到分布式:互联网系统架构演进全流程

前言

任何大型互联网平台都不是一步建成分布式架构,而是伴随着用户流量、数据量的增长,一步步迭代优化而来。从最原始的单机小系统,到具备 CDN、多级缓存、分库分表、搜索引擎、消息队列、微服务的成熟分布式架构,每一次架构升级,都是为了解决当下业务暴露出的性能、容量、高可用瓶颈。本文结合架构发展以及对应图解,梳理系统架构迭代的全过程

一、第一代:单机架构 ------ 小型初创系统最简方案

架构形态

一套服务器内部同时部署应用程序 + 数据库,所有业务代码、数据存储全部挤在同一台机器。

适用场景

初创小项目、内部管理系统、用户量极少的小型网站,日访问量几百~几千。

优势

  1. 部署简单,运维成本极低,一台机器即可完成全部功能;
  2. 开发调试便捷,无跨服务器网络调用,开发效率高。

致命痛点

  1. 资源争抢:应用服务 CPU、内存、磁盘 IO 会和数据库抢占硬件资源,一旦业务请求暴涨,数据库读写阻塞,整个系统直接卡死;
  2. 无扩容能力:单台机器硬件上限固定,CPU、硬盘、内存无法无限升级;
  3. 单点故障:服务器宕机,应用、数据库同时瘫痪,服务完全不可用。

二、第二代:应用与数据库物理分离 ------ 解耦软硬件资源

架构形态

拆分为两台独立服务器:

  • 应用服务器:只运行业务代码,负责接收请求、执行业务逻辑;
  • 数据库服务器:单独部署 MySQL,只负责数据存储、磁盘 IO 读写。 两者通过内网网络通信。

解决了什么问题

彻底解决单机架构中应用与数据库争抢硬件资源的问题,数据库 IO 压力不会拖垮业务服务,两者硬件可独立升级。

遗留瓶颈

  1. 应用服务依旧是单点,高并发下 CPU、内存打满直接宕机;
  2. 数据库仍为单实例,海量查询场景下磁盘读写缓慢,无法承载大流量;
  3. 单点故障问题没有解决,应用服务器宕机则全网无法访问。

三、第三代:应用集群化 ------ 水平扩容提升并发承载

架构形态

部署多台一模一样的应用服务器组成应用集群,多台机器同时对外提供业务服务,数据库依旧单实例独立部署。

优化价值

实现应用层水平扩容,流量上涨时只需要新增应用服务器即可分担请求,突破单台机器性能上限。

新暴露的问题

用户请求如何分发到多台应用服务器?某一台应用机器宕机后,如何保证用户不受影响?数据库单点瓶颈依旧存在,所有请求最终都会打向数据库。

四、第四代:引入负载均衡,集群实现高可用

架构升级点

在应用集群最前端新增负载均衡组件(Nginx / 云负载均衡),所有用户请求先经过负载均衡,再转发至后端应用节点。

两大核心能力

  1. 流量均分:轮询、权重、IP 哈希等策略,将用户请求均匀分配给集群内所有应用服务器,充分利用多机性能;
  2. 故障自动屏蔽(高可用):负载均衡实时探测后端节点健康状态,若某一台应用服务器宕机,自动不再向故障节点转发请求,剩余正常机器承接全部流量,用户无感知。

当前架构短板

应用层瓶颈解决,但数据库成为全新性能瓶颈:大量读请求穿透到 MySQL 磁盘,磁盘 IO 速度远低于内存,数据库查询耗时飙升,并发量高时直接拖垮整个系统。

五、第五代:多级缓存体系 ------ 拦截热点请求,减轻数据库压力

架构新增多层缓存:

  1. 浏览器本地缓存:静态图片、页面资源缓存在用户客户端,无需访问后端服务器;
  2. 应用本地缓存(JVM 缓存):每台应用服务器内存缓存热点数据,本机请求直接读取内存,无需跨服务;
  3. 分布式缓存 Redis:独立部署 Redis 集群,全局共享热点数据,解决应用本地缓存数据不一致、容量有限问题。

核心收益

绝大多数读请求被拦截在缓存层,查询耗时从毫秒级降至微秒级,大幅减少数据库访问次数;即使数据库短暂故障,缓存仍能支撑基础业务访问。

剩余瓶颈

缓存只能优化读请求,海量写入、大批量数据查询依旧会冲击数据库;单库单表数据量持续上涨后,查询、写入性能持续衰减。

六、第六代:数据库一主多从读写分离 ------ 拆分读写压力

数据库层改造

搭建 MySQL 主从集群:

  1. Master 主库:仅负责写操作(新增、修改、删除数据),数据实时同步到所有从库;
  2. Slave 从库:全部承接读请求,多台从库水平扩展,分担海量查询流量。

解决的问题

读写请求物理隔离,写操作不再与大批量读操作争抢数据库资源;读流量增长时新增从库即可扩容,大幅提升数据库查询吞吐量。

现存痛点

  1. 单库容量上限:所有业务数据仍存储在同一个主库,单表数据量达到千万级后,索引、查询性能断崖式下跌;
  2. 业务耦合:用户、商品、订单等业务表混在同一个库,某一个业务频繁操作会影响全库性能。

七、第七代:分库分表 + 数据库中间件 ------ 数据库层水平扩容

两层拆分方案

  1. 垂直分库:按业务模块拆分数据库,用户库、商品库、订单库独立部署,业务之间资源隔离,互不干扰;
  2. 水平分表:单业务数据量过大时,将一张大表拆分为数十、上百张子表,分散存储在多组数据库实例。

配套组件:数据库中间件

Sharding-JDBC、MyCat 等中间件屏蔽底层分库分表细节,业务代码无需感知多库多表,像操作单库一样执行 SQL,自动完成路由、聚合、分页等逻辑。

架构收益

数据库彻底摆脱单实例容量限制,支持存储百亿级数据,数据库层完成水平扩容。

八、第八代:接入 CDN、反向代理,完善流量网关层

1. CDN 加速静态资源

全国多节点 CDN 网络,图片、视频、静态页面等资源就近分发至用户,跨地域访问延迟大幅降低,减少源站应用服务器流量消耗。

2. 反向代理网关层

在负载均衡前端新增反向代理网关,统一承接全网流量,实现前置能力:

  • 流量清洗:拦截 CC 攻击、恶意爬虫、非法 IP;
  • 统一权限校验、登录鉴权、接口限流;
  • 请求路由、统一日志、跨域处理。

价值

网关层统一收敛通用基础能力,业务应用无需重复开发鉴权、防攻击逻辑,同时保护后端应用集群不被恶意流量冲击。

九、第九代:异构存储补齐 ------ 搜索引擎 + NoSQL 数据库

1. ElasticSearch 搜索引擎

针对商品检索、全文模糊搜索、复杂多条件查询场景:MySQL 模糊查询效率极低,将文本类数据同步至 ES 构建倒排索引,实现毫秒级全文检索,释放数据库复杂查询压力。

2. MongoDB 非关系型数据库

针对非结构化、半结构化数据(用户评论、商品详情富文本、行为日志):关系型 MySQL 存储这类数据扩展性差,MongoDB 灵活文档模型完美适配,减轻主库存储压力。 至此,系统具备关系库、缓存、搜索引擎、NoSQL多类型存储,不同业务数据匹配最优存储方案。

十、第十代:单体瓶颈爆发,架构演进至微服务体系

1. 单体集群架构的致命缺陷

前面所有架构阶段,业务代码全部打包在一套单体应用中,随着业务迭代会出现无法解决的痛点:

  1. 代码臃肿耦合:几十万行代码揉在一个工程,订单、用户、支付代码互相依赖,改一处功能要全量回归;
  2. 发布风险极高:微小改动也要重启整个应用,线上发布故障会导致全站不可用;
  3. 扩容资源浪费:订单流量暴涨时,只能整体扩容整套应用,用户、商品模块同步占用机器资源;
  4. 团队协作冲突:多开发团队共用一个代码仓库,代码合并冲突频繁,迭代效率极低;
  5. 技术栈无法差异化:支付服务需要安全加密、商品服务需要检索优化,单体只能统一一套技术栈。

2. 微服务核心改造:垂直拆分业务

把庞大的单体应用,按照业务域拆分为独立、自治的微小服务,每个服务只负责单一业务:

  • 用户服务:用户注册、登录、信息管理、权限;
  • 商品服务:商品上下架、库存、分类、价格;
  • 订单服务:下单、支付、售后、物流;
  • 营销服务:优惠券、秒杀、活动;
  • 支付服务:对接第三方支付、账单、退款;

每个微服务拥有独立代码仓库、独立数据库、独立部署集群,互不干扰,可以单独开发、单独测试、单独扩容、单独发布。

3. 微服务核心配套组件全解

(1)服务注册与发现中心(Nacos/Eureka/Consul)
  • 作用:所有微服务启动后,主动将自身 IP、端口、服务名称注册到注册中心;服务调用方从注册中心拉取可用服务节点列表,实现自动发现,无需硬编码 IP 地址。
  • 能力:健康检测,自动下线宕机服务节点;支持动态配置中心,统一管理全服务配置文件。
  • 流程:服务启动注册 → 调用方拉取服务列表 → 负载均衡调用 → 宕机节点自动剔除。
(2)API 网关(Spring Cloud Gateway)

承接原反向代理全部能力,同时适配微服务路由:

  1. 统一入口:外部请求只能通过网关访问微服务,屏蔽内部服务地址;
  2. 动态路由:根据 URL 路径转发至对应微服务(/order/** 转发订单服务,/user/** 转发用户服务);
  3. 统一管控:限流、熔断、鉴权、日志、跨域、灰度发布、接口加密全部收拢在网关层。
(3)远程调用组件(OpenFeign/Dubbo)

解决微服务之间跨机器调用问题:

  • HTTP 调用:OpenFeign 基于 RESTful 接口,轻量易调试,适合互联网业务;
  • RPC 调用:Dubbo 高性能二进制协议,低延迟,适合内部高频服务交互; 自带负载均衡、重试、超时控制,简化跨服务通信开发。
(4)消息队列(RocketMQ/Kafka)------ 微服务异步解耦核心

同步调用会造成服务强依赖,链路过长容易超时雪崩,消息队列实现异步化:

  1. 解耦:下单成功后,发送消息至队列,短信、积分、物流服务异步消费消息,主下单流程无需等待下游执行;
  2. 削峰填谷:秒杀、大促瞬时流量涌入,消息队列缓冲请求,消费端匀速处理,避免瞬间打垮订单、库存服务;
  3. 数据同步:MySQL 数据变更后发送 binlog 消息,同步更新 Redis 缓存、ES 搜索引擎、MongoDB,保证多存储数据最终一致;
  4. 事务可靠:通过事务消息保证下单、扣库存、扣款原子性,避免数据不一致。
(5)分布式事务组件(Seata)

微服务拆分后,一个业务操作会跨多个数据库(下单要操作订单库、库存库、支付库),本地事务失效,Seata 提供 AT/TCC/SAGA 方案,保证跨服务数据一致性。

(6)服务治理:熔断、限流、降级(Sentinel/Hystrix)

解决微服务雪崩问题:如果商品服务宕机,大量订单服务调用商品接口会堆积线程,拖垮整个订单服务,通过熔断降级:

  • 熔断:下游服务失败率过高,直接切断调用,快速返回兜底数据;
  • 限流:限制单服务每秒最大请求量,防止突发流量打垮服务;
  • 降级:大促时临时关闭非核心功能(商品详情推荐、历史订单),保障下单核心链路可用。
(7)分布式链路追踪(SkyWalking/Pinpoint)

微服务调用链路极长,一次用户请求会经过网关→订单→商品→支付→库存,链路追踪记录每一步耗时、异常,快速定位线上慢查询、报错节点。

4. 完整微服务分层架构

  1. 接入层:CDN + API 网关(流量管控、路由)
  2. 缓存层:浏览器缓存 + JVM 本地缓存 + Redis 分布式缓存集群
  3. 微服务业务层:注册中心管理的独立微服务集群(用户 / 商品 / 订单 / 支付等)
  4. 中间件层:消息队列、分布式事务、链路追踪、配置中心
  5. 存储层
    • 关系库:MySQL 一主多从 + 分库分表 + Sharding 中间件
    • 缓存:Redis 集群
    • 检索:ElasticSearch
    • 非结构化:MongoDB

5. 微服务架构优势

  1. 独立迭代:每个服务独立开发、发布,更新商品服务不会影响订单、支付;
  2. 精准扩容:大促只扩容订单、库存服务,无需扩容全部服务,节省服务器成本;
  3. 技术栈灵活:支付服务用安全框架,检索服务偏重 ES,各服务可按需选型;
  4. 故障隔离:营销服务宕机,不会影响下单核心业务,故障范围收敛;
  5. 团队解耦:不同团队维护独立服务,代码仓库隔离,减少协作冲突。

6. 微服务带来的新成本与挑战

  1. 运维复杂度飙升:数十个服务、配套中间件(注册中心、MQ、网关)需要持续维护;
  2. 分布式问题:分布式事务、服务调用超时、数据一致性、链路排查难度提升;
  3. 开发门槛提高:需要掌握远程调用、熔断、消息队列等分布式技术;
  4. 测试成本增加:联调需要启动整套服务集群,本地环境搭建复杂。
相关推荐
搬砖柯3 小时前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
折哥的程序人生 · 物流技术专研3 小时前
Java面试通关⑭:分布式理论与架构全集
分布式·微服务·校招·分布式事务·cap·java面试·最终一致性
格子软件15 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
圣殿骑士-Khtangc16 小时前
分布式事务解决方案全景:从 2PC 到 Saga,每种方案的适用场景与落地要点
系统架构
涛声依旧-底层原理研究所17 小时前
Agent 长任务可靠性设计:实现暂停、恢复、续跑与崩溃重启的完整方案
人工智能·python·系统架构
-dzk-19 小时前
【系统架构设计师】案例分析篇
开发语言·数据结构·python·算法·架构·系统架构·架构设计
Evand J1 天前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn
格子软件1 天前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
2301_801184751 天前
kafka-zookeeper
分布式·zookeeper·kafka