从零到亿级流量!一口气读懂互联网架构十几年的迭代之路:从单机到云原生全流程拆解
大家好,我是咪的Coding。
你有没有好奇过,你每天打开的微信,是如何在 433 天里完成从 0 到 1 亿用户的跨越?淘宝的双 11,是如何扛住每秒几十万的订单峰值,让你在零点疯狂下单却丝毫不卡?
当你第一次接触互联网技术,是不是被一堆名词搞得晕头转向:RPC、微服务、K8S、云原生…… 这些听起来高大上的概念,到底是凭空造出来的噱头,还是背后有什么必然的逻辑?
其实所有的架构演化,从来都不是技术人员的自嗨,而是业务推着技术,一步一步解决真实问题的过程。
今天,我们就把这些眼花缭乱的概念,拆解成一个服务的成长故事,带你一口气看懂,互联网架构是如何从一台小小的服务器,走到今天的千万级并发云原生时代的。
一、从无到有:单机时代的朴素起点
故事的起点,和所有创业故事一样,朴素得不能再朴素。
你有了一个想法,做了一个小网站,可能是一个个人博客,也可能是一个小电商的雏形。这时候你只有几百个用户,访问量低到可以忽略不计。
你买了一台服务器,把应用程序、数据库全都装了上去。所有的请求,都由这一台机器处理。这就是最基础的单机架构。

这个阶段,没有什么复杂的设计,能用就行。你要做的就是快速把产品跑起来,验证你的想法。就像微信最早的版本,只是一个简单的 IM 工具,团队只有几个人,一台服务器就足以支撑早期的几千个用户。
没人会在这个时候去想什么微服务、云原生,因为那完全是杀鸡用牛刀。对初创的你来说,最快上线,比什么都重要。
二、第一次拆分:应用与数据的分家
业务慢慢有了起色,用户多了起来。你发现,那台唯一的服务器,开始不够用了。
应用程序要处理请求、跑业务逻辑,数据库要存数据、做 IO 操作,它们俩开始抢 CPU、抢内存、抢磁盘。有时候数据库跑个慢查询,整个应用都卡了;有时候应用处理并发请求,数据库的查询都排起了队。
怎么办?很简单,加一台机器,把它们拆开。
应用服务器专门管业务,数据库服务器专门管存储。两者各司其职,互不干扰。这就是应用与数据库分离。

就这么简单的一步,系统的可用性一下就上去了。哪怕应用服务器出了问题,数据库还能正常工作;反过来也一样。你第一次尝到了拆分的甜头。
三、应对高并发:集群与负载均衡的诞生
好景不长,你的产品火了。用户量暴涨,单台应用服务器,就算把配置拉满,也扛不住了。
比如你的应用服务器,一秒最多能处理 100 个请求,现在突然来了 500 个,怎么办?
500 除以 100,等于 5。那就来 5 台服务器,部署一模一样的代码。这就是集群。
但新的问题来了:用户的请求,要发给哪一台服务器呢?总不能让用户自己选吧?
于是你加了一个中间层,它就像一个大堂经理,把进来的请求,均匀地分给后面的 5 台应用服务器。这就是负载均衡。

这下,系统的能力一下就上去了。以后用户再涨?简单,再加机器就行。这种横向加机器扩展能力的方式,你给它取名叫水平扩展。

更重要的是,哪怕其中一台服务器挂了,负载均衡会自动把它屏蔽掉,流量分给其他机器,用户根本感觉不到。这就是高可用。

你第一次发现,原来系统的能力,是可以通过加机器来无限放大的。
四、给数据库减负:缓存的魔法
扛住了并发,你又发现了新的瓶颈:数据库。
哪怕应用服务器加了一堆,所有的查询请求,最终还是要落到数据库上。大量的请求穿透到数据库,数据库的压力越来越大,慢慢又成了新的短板。
你研究了一下数据库的工作原理:应用发查询请求给数据库,数据库会先去自己的内存缓冲区找数据,找到了就直接返回,找不到才去磁盘折腾。而内存读比磁盘读,要快 1000 倍以上。
但数据库的内存缓冲区太小了,根本存不下所有的热数据。
那能不能把这个缓冲区单独拿出来,放大?
你灵机一动,搞了一个专门的缓存服务,把那些经常被访问的热数据,都放进去。用户来查询,先去缓存里找,找到了就直接返回,根本不用碰数据库。
为了把效果拉满,你甚至设计了三级缓存:
-
浏览器缓存:静态资源直接存在用户本地,根本不用发请求
-
应用本地缓存:常用的小数据,存在应用自己的内存里,拿起来最快
-
分布式缓存:所有应用共享的大缓存,存热点数据

这下,绝大多数请求,在缓存层就被拦住了,根本到不了数据库。查询速度从毫秒级,直接变成了微秒级。数据库的压力一下就暴跌。
甚至就算数据库临时挂了,缓存还能顶一阵子,系统照样能对外提供服务。
五、数据库的分工:读写分离
缓存解决了热点读的问题,但还有写请求,还有那些非热点的读请求,还是要打在数据库上。
你发现,数据库有个特点:写操作会锁行锁表,并发一高,就会排队。而读操作,其实不会互相阻塞。
而且互联网系统,大部分都是读多写少。比如电商,用户浏览商品的请求,远多于下单的请求。
那能不能给数据库分个工?
主库只负责写,从库只负责读。主库把数据同步给从库,保证数据一致。这就是读写分离。

因为实践证明,真实业务场景的读请求远多于写请求,所以你可以搞一主多从,所有的读请求,分摊到多个从库上。写请求只有主库一个,读压力一下就分散了。数据库读写互相阻塞的问题,彻底解决了。
六、应对海量数据:分库分表
系统跑了几年,数据量越来越大。你的订单表,存了上亿条数据;日志表,更是大到离谱。
单库单表,已经撑不住了。查询一个订单,要扫全表,慢到离谱。
这时候,你必须对数据库动手拆分了。这就是分库分表。
你用了两种拆分方式:
- 垂直分库:按业务把数据库拆开。用户相关的数据放用户库,商品放商品库,订单放订单库。它们互不干扰,一个库挂了,不影响其他的。

- 水平分表:一张太大的表,拆成多张小表。比如订单表,按用户 ID 哈希,拆成 100 张小表。这样每一张表的数据量,就都可控了。

配合数据库中间件,这些拆分对应用来说是透明的,你不用改大量的代码。
到这里,数据库从一个单点,变成了分布式的存储系统。存储和并发能力,终于可以无限扩展了。
七、全国用户的体验:CDN 与反向代理
这时候,你的用户已经遍布全国了。你发现,北方的用户访问你的网站,快得很;南方的用户,却慢得像蜗牛。
而且,你的应用服务器直接暴露在公网上,太危险了,很容易被攻击。
怎么办?你搞了两个新东西:
一个是CDN。你在全国铺了很多节点,把图片、JS、CSS 这些静态资源,提前放到离用户最近的节点。就像你家门口的快递站,用户不用跑到千里之外的中心机房,在家门口就能拿到数据。速度一下就起飞了。

另一个是反向代理。你把它放在用户和应用服务器中间。公网的请求,先到它这里,它再转发给内网的应用服务器。这样,用户根本看不到你真实的应用服务器地址,也就没法直接攻击了。它还能帮你做流量清洗、权限校验,一举多得。

八、复杂查询的破局:搜索引擎与 NoSQL
你以为这就完了?互联网的玩法越来越花,场景越来越复杂。
你发现,传统的关系型数据库,遇到模糊查询、全文搜索、多维统计,有点力不从心了。比如电商里搜商品,用户输入个关键词,你用LIKE去查,慢到死。
于是你又引入了两个新家伙:
一个是搜索引擎。它用倒排索引,把所有的关键词提前建好索引,用户搜的时候,秒级就能返回结果。不管是全文搜索,还是多维筛选,都能轻松搞定。
另一个是NoSQL 数据库。它专门存那些非结构化、半结构化的数据,比如用户的行为日志、个性化的配置。它天生就支持高并发、易扩展,比传统数据库灵活太多了。

到这里,你的系统,终于从只能做简单的增删改查,变成了能支持各种复杂的检索与分析。
九、业务膨胀的解药:分布式架构
这时候,你的小网站,已经长成了一个大平台。用户、商品、订单、支付…… 所有的功能,全都挤在一个应用里。这就是大家常说的巨石应用。

麻烦也跟着来了:
-
改一行用户相关的代码,要把整个应用全量发布,风险极大
-
几十个开发同时改代码,天天冲突,合并代码都要疯了
-
大促的时候,订单服务要扩容,你只能把整个应用一起加机器,大把的资源白白浪费
怎么办?很简单,继续拆!
你按照业务边界,把这个巨大的应用,一刀一刀切开。用户相关的功能,做成独立的用户系统;商品做成商品系统,订单做成订单系统。每个系统,单独部署、单独发布、单独扩容。谁也不影响谁。
这就是分布式架构。

就像微信的技术团队后来做的那样,他们把整个系统拆成了登录、消息、摇一摇、LBS 这些独立的模块,每个模块单独部署。这就是典型的 “大系统小做”,把一个庞然大物,拆成一个个小而美的服务。
十、服务间的沟通:RPC 与服务发现
拆完了,新的问题来了。
用户下单的时候,要查商品的库存,要扣用户的余额,要生成订单。这些功能,现在已经在不同的系统里了,它们之间怎么通讯?
于是你搞了个RPC 远程调用。它让跨机器的服务调用,就像调用本地代码一样简单。你不用管网络、不用管序列化,一行代码,就能调用另一个服务的接口。

但服务越来越多,相互调用的链路越来越复杂。我要调用用户服务,它的 IP 地址是什么?今天它扩容了,地址变了怎么办?
于是你搞了个总管:服务注册与发现中心。所有的服务,启动的时候,都来这里注册自己的地址。谁要调用谁,直接来这里问一声,就能拿到最新的地址。

这下,服务之间的通讯,终于顺畅了。
十一、解耦与削峰:消息队列的魔力
还有一个问题,让你头疼不已。
服务之间同步调用,一个卡住了,整条链路都跟着堵死。比如下单的时候,扣库存卡了,订单服务就等着,然后调用它的支付服务也等着,最后整个系统都堵了。流量一高,直接雪崩。
能不能让服务之间不用互相等待?
你搞了一个超大容量的智能收件箱:消息队列。

服务之间要通讯,不用等着对方立刻回复,把消息扔到队列里,就可以继续干自己的事了。谁要处理这个消息,什么时候有空,什么时候自己来拿。
这下,服务之间彻底解耦了。
就算某个服务临时挂了,消息也不会丢,等它恢复了,再慢慢处理。
更妙的是,遇到大促这种流量突增的场景,你可以把请求先存在队列里,然后按照系统的能力,慢慢消化。这就是削峰填谷。把瞬间的峰值,拉平成平稳的流量,系统再也不会被冲垮了。
十二、极致的拆分:微服务架构的到来
分布式架构用了几年,你又发现,拆得还不够细。
就拿用户系统来说,里面又装了登录、个人信息、会员、地址…… 还是一大坨。不同的团队,想用的技术栈还不一样,有的想用 Java,有的想用 Go,混在一个系统里,根本没法搞。

大促的时候,会员模块要扩容,结果你只能把整个用户系统一起加机器,钱和资源全浪费了。
怎么办?继续拆!
按照 “一个服务只干一件事” 的原则,你把系统拆得更细更小。登录做成单独的服务,会员做成单独的服务,支付做成单独的服务。每个小服务,只干一件事。
它们能独立开发、独立发布、独立扩容,想用什么技术栈就用什么,互不干扰。
这就是微服务架构。
这下可太灵活了!大促一来,订单、支付这几个最热的服务,直接加十倍机器抗流量,其他不忙的服务,完全不用动。资源一点不浪费。哪个服务出了 bug,就只影响这一个小功能,绝对不会拖垮整个网站。
几十个团队各管各的服务,互不打扰,开发效率直接起飞。
当然,有利就有挑战。服务一多,调用关系像蜘蛛网,出了问题,你都不知道是哪一步挂了。
于是你补上了配套的工具:
-
全链路追踪:把整个调用链路串起来,一眼就能定位问题在哪
-
限流、熔断降级:流量太大的时候,自动保护系统,防止连锁崩盘
-
服务治理:统一的监控、日志、权限,把几百个服务管得明明白白
把这些都配齐,你的系统,就成了大厂标准的微服务体系,抗住千万级、亿级流量,都不在话下。

微信的团队,其实早就践行了这个思路。他们把系统拆成了上百个小服务,每个服务可以独立迭代。他们甚至能做到每天 20 多次的后台变更,这在巨石应用时代,是根本不敢想的。
十三、运维的救赎:容器与 K8S
微服务是好用,可运维的同学,直接哭了。
服务越拆越细,从原来的几个应用,一下子变成了几百个微服务。部署运维,直接变成了噩梦。
每个服务上线,都要配环境、装依赖、调参数。稍微不一样,就出现了 “我电脑能跑,服务器跑不起来” 的玄学 bug。
大促前要紧急扩容几百台机器,一台台配环境,根本赶不上。大促结束要缩容,还得一台台清理,效率低到离谱。
怎么办?你又灵机一动:能不能把服务和它的运行环境,一起打包成一个密封的盒子?放到哪台服务器,都能直接跑?

于是你搞出了Docker 容器。
你把每个微服务的代码、依赖、配置、环境,全部打包成一个镜像。一次打包,到处运行。彻底解决了环境不一致的世纪难题。
可问题又来了,几百上千个容器,谁来管?
你请来了一个全能大管家:Kubernetes,简称 K8S。

它帮你调度所有的容器资源:流量高了,自动加容器;流量低了,自动缩容器;容器挂了,自动重启。全程不用你管。
运维同学终于不用再熬夜配环境了,他们终于能睡个安稳觉了。
十四、最终的进化:云原生时代
到这儿,你发现,就算有了 K8S,你还是得自己买服务器、租机房。为了大促,你要备一堆机器,平日的时候,这些机器全闲着,太浪费钱了。
于是你干脆把系统,搬到了云平台上。
云平台就像一个无限大的资源池。要多少 CPU、内存、带宽,随时申请、随时用,用完就释放,按需付费。底层的机房,对你来说,完全透明了。
你不用再关心服务器在哪,不用关心硬件怎么维护。你只需要关心你的业务就行。
这就是云原生。

你的架构,终于从一台小小的服务器,走到了今天的云原生时代。
总结:架构的本质,是问题驱动的成长
从单机到分布式,从微服务到云原生,这一路的演化,每一步都不是凭空出现的,每一步,都是为了解决前一步留下的问题。
这背后,其实藏着三个最核心的思维,不止适用于架构,更适用于我们每个人的学习与成长:
第一,没有最好的架构,只有最适合的。
初创公司,别一上来就搞微服务、搞 K8S,单机够用就好。就像我们学习,别一开始就去啃最高深的理论,先把基础的东西用起来,解决眼前的问题。业务推着架构走,问题推着学习走,这才是最健康的节奏。
第二,演化的本质,是用空间换时间,用复杂度换性能。
加机器、加组件、加分层,看起来系统越来越复杂,但我们换来了更高的性能、更大的容量。就像我们学习,提前整理笔记、搭建工具链,看起来多花了一点时间,但后续的效率,会提升十倍不止。所有的成长,都是用当下的投入,去换未来的可能性。
第三,永远围绕问题,而不是技术本身。
所有的技术,都是为了解决问题而生的。没有问题,就没有技术。就像我们学习知识,不是为了记住那些名词,而是为了解决我们遇到的问题。当你遇到了瓶颈,你自然会去学对应的工具,自然会去迭代你的能力。
这就是互联网架构的进化史诗,也是我们每个人成长的缩影。从最简单的开始,遇到问题,解决问题,一步步迭代,最终,你会发现,你已经走到了曾经不敢想象的高度。
感谢你看到这里,如果喜欢咪的Coding的话可以点个关注支持一下吧!也欢迎各位在评论区留言!
更多推荐
所有评论(0)