图解系统设计: 五分钟从单体架构到微服务(上)

为了在情人节前让你的在线花店火速上线,你和团队选择了最熟悉、最快的单体架构。

项目进展神速,网站如期上线,成功抓住了第一波渴望浪漫的顾客。

然而,甜蜜的烦恼接踵而至...

随着用户暴增,尤其是在七夕、双十一这样的大促节点,网站频繁卡顿、下单失败,甚至整个应用都挂了,客服电话被打爆。

你的团队意识到,那个曾让你们引以为傲的"速度",如今正成为业务发展的巨大瓶颈。

1. 什么是单体架构?

你的在线花店的所有功能------用户管理、商品展示、购物车、订单处理------都被精心打包在一个应用里。

这就像一个肯德基全家桶。

所有美食(功能)都在一个桶里,你不用费心去想该单点些什么。

一手交钱(开发),一手拿桶(部署),直接开吃(上线),非常方便。

1.1 单体架构的优点

  • 开发简单:所有代码都在一个项目里,IDE打开就是所有的源码,没有复杂的分布式环境要操心。

  • 测试直接:想做个端到端测试?启动应用,跑就完事了,不用模拟一堆外部服务。

  • 部署方便:打个包(比如一个WAR或JAR文件),往服务器上一扔,简单直接,不用考虑依赖情况。

1.2 单体架构的缺点

  • 技术栈固化:想给订单模块换个最新的Java 21?对不起,整个应用都得跟着升级,风险极高。

  • 新人上手难:一个新人入职,面对几十万行代码的"史前巨兽",可能花一个月都理不清逻辑,改个bug心惊胆战。

  • 可靠性差:最致命的"一损俱损"。购物车模块的一个内存泄漏,就可能让整个花店网站全部瘫痪。

  • 扩展性受限:双十一"秒杀"活动流量巨大,你想只给商品模块加服务器?没门,你必须把整个应用再复制一份,造成巨大浪费。

2. 单体架构的"进化之路"

在线花店迎来了双十一大促,流量是平时的10倍!你和你的团队必须在不动大手术的前提下,让这个单体程序扛住史无前例的压力。

2.1 垂直扩容 (Vertical Scaling)

这是最简单粗暴的一招:给服务器加配置。

这就像你觉得家里的旧电脑打游戏卡,直接给它换上顶配的CPU、更大的内存和更快的SSD。

优点:立竿见影,操作简单。

  • 缺点:最顶级的服务器也扛不住无限的流量,而且你还是只有一个"篮子",鸡蛋都在里面,风险极高。

2.2 水平扩展 (Horizontal Scaling)

一台服务器扛不住,那就多来几台!

这好比一家门店忙不过来,那就索性在旁边再开几家一模一样的分店。

为了让顾客能自动去到最不拥挤的店,门口还需要一个聪明的"调度员"------负载均衡器(Load Balancer)。

负载均衡器(Load Balancer) 是一种网络设备或软件组件。

它的核心功能是将客户端请求均匀分配到多个后端服务器,避免单一服务器过载,从而提高系统的可用性、性能和扩展性。

它位于客户端与服务器集群之间,充当 "流量调度器" 的角色。

但这里有个核心前提:你的应用必须是 无状态(Stateless) 的。

「思考题」: 为什么水平扩展要求应用是无状态的?如果你的应用是有状态的(比如用户登录信息存在服务器内存里),水平扩展会遇到什么问题?

2.3 数据库优化

应用服务器通过"人海战术"撑住了,但所有压力最终都给到了数据库,它的连接数和磁盘I/O开始疯狂报警。

2.3.1. 读写分离

如果CEO(主库)实在太忙,就需要雇几个助理(读库)。

CEO只负责做决策、签合同(写数据),而助理们则负责对外沟通、查询信息(读数据)。

助理们会定期跟CEO同步最新的信息。

2.3.2 数据库分片 (Sharding)

当数据量大到单个主库都存不下时,就得考虑将数据库分片了。

数据库分片将数据表按行分割成多个分区(称为逻辑分片),每个分片存储唯一数据并分布在不同的数据库节点(称为物理分片)。

所有分片共同构成完整数据集,但彼此不共享数据或资源。因此,数据库分片也有局限性:

一个管理着全国人口的超大户籍档案室(单库),现在按身份证号的省份代码(分片键)拆分成了34个独立的省级档案室(分片库)。

查询某个省的人(特定分片查询)会变得飞快,但如果要查全国所有叫"张伟"的人(跨分片查询),那就非常麻烦了。

2.4 缓存和消息队列

  1. 缓存 (Caching)*

为服务加一个缓存,就像是把最常用的工具(热点数据,如首页商品)放在手边的工具箱(Redis缓存)里,不用每次都跑回几里地外的大仓库(数据库)去取。

推荐阅读 腾讯面试官: 如何使用 Redis? 五分钟学会

「2. 消息队列 (Message Queues)」

举个餐厅的点餐流程的例子来解释消息队列。

你在前台下单(应用接收请求)后,拿到一个叫号器就可以去旁边玩手机了。

后厨(后台服务)会按照订单顺序慢慢做,做好了你的叫号器就会响。

这完美地解决了高峰期所有顾客都堵在点餐口的尴尬。

推荐阅读 图解消息队列

  1. 总结

本文从在线花店场景出发,介绍单体架构如全家桶般的便捷与开发简单等优点,也指出其技术栈固化等缺点。

本文还解析垂直扩容等优化手段,虽能解一时之困,但技术债务等问题为微服务架构登场埋下伏笔,下期将揭秘拆分之道,记得关注。

「下期剧透:」

《图解系统设计: 五分钟从单体架构到微服务(下)》将解锁这些硬核内容:

  • 微服务架构(Microservice Architecture)

  • 优雅升级架构的绞杀者模式(Strangler Fig Pattern)

相关推荐
mudtools2 小时前
.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档
后端·c#
文心快码BaiduComate2 小时前
“一人即团队”——一句话驱动智能体团队
前端·后端·程序员
bobz9652 小时前
kubeovn with metallb:service externalTraffcLocal
后端
小枫编程2 小时前
Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置
前端·spring boot·后端
送秋三十五2 小时前
spring源码分析————ListableBeanFactory
java·后端·spring
Livingbody2 小时前
【PaddleOCR】基于PaddleOCR V5 最新框架实现车牌识别
后端
float_六七3 小时前
Spring事务注解@Transactional核心机制详解
java·后端·spring
王维志3 小时前
LiteDB详解
数据库·后端·mongodb·sqlite·c#·json·database
半凡梦秋3 小时前
Springboot多线程操作事务
后端