$ cat ~/articles/115 _

互联网架构演变过程

作者:jaifire 2026-06-24 20:01 0 阅读

一口气地讲通互联网架构所有高频名词,看似眼花缭乱,概念扎堆。 拆解核心逻辑,它其实就是一套不断补短板、解决新问题的迭代闭环。 下面你只需要清空大脑,听我给你讲个故事。

单机架构

故事的起点非常朴素:你刚做了一个小网站,用户没几个,访问量极低。就怎么简单怎么来嘛,一台服务器上面装了应用程序和数据库,用一套开源的 Nginx 技术就可以迅速搞定。你给它取名叫单机架构

应用与数据库分离

业务慢慢有了起色,用户多了一点,单机扛不住了:应用和数据库经常抢资源。怎么办? 很简单嘛,加机器!把应用和数据库拆开:应用服务器专门处理请求,数据库服务器专门存数据,做 IO 操作。 两者各司其职,互不干扰,可用性也提升了。

集群、负载均衡与高可用

但好景不长,用户又暴涨了,单台应用服务器处理不过来,数据库也扛不住大量查询。到这里,故事进入高潮:高并发来了!

  • 单台应用服务器就算配置拉满也有上限,比如一台只能扛 100 个请求,来了 500 个请求咋办呢?500 ÷ 100 = 5 嘛,那就来 5 台服务器,部署一模一样的代码。你给它取名叫集群
  • 还有问题:流量怎么分配到每台服务器呢?于是你发明了一个中间层,它能将请求均匀地分配到每台应用服务器。你给它取名叫负载均衡
  • 扛不住就加机器,你给它取名叫水平扩展
  • 一台挂了可以自动屏蔽流量,其他来顶上,保证系统不会崩,你给它取名叫高可用

缓存

应用扛住了,但新问题又随之而来:大量请求打到数据库,数据库成为新瓶颈。 于是爱钻研的你研究起应用查询数据库的原理:

  • 应用先发查询请求给数据库,数据库内部就会先去内存缓冲区找数据,如果找到了就直接返回,没找到呢,就去磁盘一顿折腾,找出来再给到内存缓冲区,最后返回给应用。
  • 你还发现:从内存缓冲区去读比从磁盘要快 1000 倍以上。那能不能都去内存缓冲区读呢?不行,因为它太小了,根本不够用,跟你的手机内存一样小。
  • 那怎么办呢?于是你灵机一动:我直接把内存缓冲区单独出来放大呗!经常被访问的热数据我都放上去,来这里快速查,也不用去数据库。你给它取名叫缓存
  • 你设计了三层缓存:浏览器缓存应用服务器本地缓存分布式缓存。用户每次请求先从浏览器缓存找,没有就去本地缓存找,再来个分布式缓存,最后才到数据库。
  • 这时候绝大多数请求在缓存层就被拦住,根本到不了数据库。由于缓存是在内存中,查询速度从毫秒计变成微秒计,数据库压力也暴跌。就算数据库挂了,缓存还能顶一阵子,可用性也提升了。

这里说明一下:数据库中只存原始表数据,而三层缓存是,什么快、什么常用就缓存什么,不只是存数据库里的东西,还存页面、接口结果、静态资源、计算结果等,一切能提高访问效率的,简直无所不用其极。

数据库读写分离

缓存解决了热数据,但写请求和非热数据还是要打数据库。

  • 而且数据库有个特点:读并不慢,但多写会锁行锁表,并发一高就排队。但能不能给数据库分工呢?
  • 于是你让主库负责写从库负责读,通过数据同步来保证主从数据一致。你给它取名叫读写分离
  • 现实中互联网系统读多写少,所以可以一主多从,读压力一下就分担了,数据库读写互相阻塞的问题彻底解决了。

分库分表

还没完。 系统跑了几年,数据量越来越大,订单表、日志表越来越大,单库单表撑不住了。这时候必须对数据库进一步拆分。你给它取名叫分库分表

  • 按业务拆——用户库、商品库、订单库互不干扰,你给它取名叫垂直分库
  • 一张大表拆成多张小表,比如按 UID 哈希分成多张表,分散压力,配合数据库中间件对应用透明,也不用改大量代码,你给它取名叫水平分表

到这里,数据库层面从单点变成分布式,扩展和并发能力可以无限扩展。

CDN 与反向代理

后来你的系统用户遍布全国,有人访问快,有人访问慢得像蜗牛,而且应用服务器直接暴露在公网太危险,容易被攻击。于是你发明了两个新玩意:

  • 一个在全国铺了很多节点,静态资源提前放到了离用户最近的节点,就像你家门口的快递站,用户不用每次跑到中心机房,而是通过域名解析获取到最近的节点 IP 去取数据,速度直接起飞,你给它取名叫CDN
  • 另一个玩意儿呢,你给它放在用户和应用中间,公网请求先到它,再转给内网应用服务器,你给它取名叫反向代理,它隐藏了真实应用服务器,可以防止被攻击,还能做流量清洗、权限校验,简直一举多得。

补充:负载均衡与反向代理,底层都是请求转发,载体是同一个服务(如 Nginx),二者只是业务目标不同:

  1. 反向代理:对外提供统一入口,替客户端访问内网后端,隐藏真实服务地址。即使后端只有一台服务器,也可以用反向代理。
  2. 负载均衡:将海量请求分摊到多台后端节点,避免单台服务器压力过高,实现集群扩容。只有存在多台后端时,才会用到负载均衡。

搜索引擎与 NoSQL

互联网玩法越来越花,场景越来越复杂,传统数据库遇到模糊查询、全文搜索、多维统计有点力不从心。 比如电商搜商品、新闻热搜,用 LIKE 慢到死啊!于是你发明了两个玩意儿:

  • 一个利用倒排索引让搜索秒级响应,你给它取名叫搜索引擎
  • 一个专门存非结构化数据,而且支持高并发、易扩展,你给它取名叫NoSQL 数据库。 终于,系统从只能简单增删改查,变成支持复杂检索与分析。

分布式架构与微服务

分析越做越大,应用层面又有新问题。 我用两台应用主机的例子来说明:你的网站从一个小电商长成了集用户、商品、订单于一体的大平台,所有功能代码全挤在一个应用里,长成了大家常说的巨石应用。 麻烦也跟着来了:

  • 改一行用户相关的代码要全量发布整个应用;
  • 多个开发同时改代码天天冲突不断;想给订单服务加机器扛流量只能整个应用一起扩容,大把资源白白浪费。怎么办?

很简单吧,拆!你按照业务边界把这个长大的应用一刀一刀切开:

  • 用户相关的功能做成独立的用户系统,商品、订单也分成一个个独立的小系统,每个系统单独部署、单独发布、单独扩容,谁也不影响谁。你取名叫分布式架构

可拆完新问题又来了:

  • 用户下单的时候要查商品库存、要生成订单,这系统都分开了,相互之间怎么调用、怎么通讯呢?
  • 于是你又发明了个新玩意,它让跨机器的服务调用像调本地代码一样简单,你给它取名叫 RPC(远程过程调用)

但服务越来越多,相互调用的链路越来越复杂,快速找到目标去调用成难题。

  • 于是你发明了一个总管,它管着所有服务的地址,新增的服务都来它这里注册,谁要调用谁直接来这儿找就行,然后直接去调用。你给它取名叫服务注册与发现中心

还有一个问题也让你头疼不已:

  • 服务之间相互调用、相互等待,一个服务卡住整条链路都跟着阻塞,流量一高了就血崩了。怎么办?
  • 能不能不让服务之间相互等待呢?

于是你发明了一个超大容量的智能收件箱:

  • 服务之间不用死死等着对方立刻回复,把消息扔进去就可以继续干自己的事,谁要谁到时自己来拿消息就行。你给它取名叫消息队列
  • 这下服务之间彻底解耦,互不拖累。就算某个服务临时挂了,消息也不会丢,等它恢复了再慢慢处理。
  • 遇到流量突增,还能先把请求存起来,按系统人力慢慢消化,你给它取名叫削峰填谷

分布式架构用了几年,你又发现新问题了:

  • 拆是拆了,但拆的还不够细。就拿用户系统来说,里面又装登录、又装个人信息、又装会员、又装地址,还是一大坨,不够清爽。
  • 不同团队想用的技术不一样,有的想用 Java,有的想用 Go,在一个系统里根本没法搞。
  • 会员模块大促又扩容,结果只能把整个用户系统一起加机器,钱和资源全浪费了。

怎么办?很简单吧,继续拆!按照一个服务只干一件事的原则,把系统拆得更细更小:

  • 登录做成单独服务,会员、支付做成单独服务……每个小服务只干一件事,它们能独立开发、独立发布、独立扩容,想用什么技术栈就用什么,互不干扰。你给这套更极致的架构取名叫微服务架构

这下可太灵活了:

  • 大促以来,订单、支付这几个最热的服务直接加 10 倍机器扛流量,其他不忙的服务完全不用动,资源一点不浪费。
  • 哪个服务出 bug 就只影响这一个小功能,绝对不会拖垮整个网站。
  • 几支团队各管各的服务,互不打扰,开发效率直接起飞。

当然,有利就有挑战:

  • 服务一多,调用关系像蜘蛛网,出问题找不到在哪。
  • 于是你加上全链路追踪,一眼定位慢服务。
  • 流量太大怕被冲垮、怕系统崩盘,于是你加上限流、熔断、降级,自动保护系统。
  • 服务太多不好管,于是你做了服务治理:统一监控、日志、权限,全部都安排得明明白白。

把这些都配齐,你的系统就变成了大厂标准的微服务体系,扛住千万级并发流量都不在话下。

容器化与 Kubernetes

微服务是真好用,可运维同学直接哭了:

  • 服务越拆越细,从原来几个应用一下子变成几百个微服务部署,运维直接变成噩梦。
  • 每个服务上线都要配环境、装依赖、调参数,稍微不一样就出现“我电脑能跑,服务器跑不起来”的玄学 Bug。
  • 大促前要紧急扩容几百台机器,一台台配环境根本打不上,大促结束要缩容还得一台台清理,效率低到离谱。

怎么办?很简单吧,你又灵机一动:

  • 能不能把服务和他需要的运行环境一起打包成一个密封盒子,放到哪台服务器都能直接跑?

于是你又发明了一个新玩意儿:

  • 不用再配环境,把每个微服务的代码、依赖、配置、环境全部打包成一个镜像,一次打包,到处运行,彻底解决了环境不一致的世纪难题。你给它取名叫 Docker 容器。于是架构就成了这样。

可问题又来了:几百上千个容器,谁来帮你管呢?

  • 于是你又请来个全能大管家,他来安排容器资源和扩缩容。你给它取名叫 Kubernetes(简称 K8s)
  • 流量高了自动加容器,流量低了自动缩容器,容器挂了自动重启,全程不用你管。

云原生

你发现就算有了 K8s,还是得自己买服务器、租机房,为了大促备一些机器,平时全闲着,太浪费钱。

  • 于是你直接把系统搬到了云平台。云平台就像一个无限大的资源池,要多少 CPU、内存、带宽,随时申请随时用,用完就释放,按需付费。
  • 最后,你的架构彻底进入了新的时代,你给它取名叫云原生
  • 从最开始一台小服务器,到如今弹性、自动化、高可用、能无限扩展的现代化架构,不管业务怎么长、流量怎么爆,它都能稳稳扛住。

最后,故事总结:

  • 单机架构:解决从零搭建。
  • 应用与数据库分离:解决资源争抢。
  • 应用集群加负载均衡:解决高并发。
  • 加上缓存:解决查询性能,减轻数据库压力。
  • 数据库读写分离:解决读写阻塞。
  • 分库分表加分布式数据库:解决海量存储。
  • CDN 加反向代理:解决访问速度、系统安全。
  • 搜索引擎加 NoSQL:解决复杂查询。
  • 业务拆分加分布式架构:解决业务膨胀,便于维护。
  • 微服务架构:解决弹性协作,极致弹性。
  • 容器化加云平台:解决运维成本,自动化。

架构设计启发:

  1. 没有最好的架构,只有最适合业务的架构。 初创公司别上来就微服务,单体够用就好,业务推着架构走。
  2. 架构演进的本质:用空间换时间,用复杂度换性能。 加机器、加组件、加分层,都是为了扛住更大的流量、更高并发。
  3. 永远围绕五大目标:高性能、高可用、可伸缩、可扩展、够安全。