分布式、Spring Boot微服务、垂直拆分、水平拆分、分库分表详解及关系梳理
- 一、概念解析
-
- [1️⃣ 分布式(Distributed System)](#1️⃣ 分布式(Distributed System))
-
- [📌 定义](#📌 定义)
- [🔧 核心特征](#🔧 核心特征)
- [🌰 典型实现](#🌰 典型实现)
- [2️⃣ Spring Boot 微服务(Microservices)](#2️⃣ Spring Boot 微服务(Microservices))
-
- [📌 定义](#📌 定义)
- [🔧 技术特点](#🔧 技术特点)
- [🌰 典型场景](#🌰 典型场景)
- [3️⃣ 垂直拆分(Vertical Splitting)](#3️⃣ 垂直拆分(Vertical Splitting))
-
- [📌 定义](#📌 定义)
- [🔧 两种形式](#🔧 两种形式)
- [🌰 典型场景](#🌰 典型场景)
- [4️⃣ 水平拆分(Horizontal Splitting)](#4️⃣ 水平拆分(Horizontal Splitting))
-
- [📌 定义](#📌 定义)
- [🔧 两种形式](#🔧 两种形式)
- [🌰 典型场景](#🌰 典型场景)
- [5️⃣ 分库分表(Database Sharding)](#5️⃣ 分库分表(Database Sharding))
-
- [📌 定义](#📌 定义)
- [🔧 技术实现](#🔧 技术实现)
- [🌰 典型配置(ShardingSphere)](#🌰 典型配置(ShardingSphere))
- 二、五者之间的关系梳理
-
- [🔄 整体关系图](#🔄 整体关系图)
- [🔗 详细关系说明](#🔗 详细关系说明)
-
- [1. Spring Boot微服务 vs 分布式](#1. Spring Boot微服务 vs 分布式)
- [2. 垂直拆分 vs 微服务](#2. 垂直拆分 vs 微服务)
- [3. 水平拆分 vs 分库分表](#3. 水平拆分 vs 分库分表)
- [4. 垂直拆分 vs 水平拆分](#4. 垂直拆分 vs 水平拆分)
- [5. **分布式 vs 所有概念**](#5. 分布式 vs 所有概念)
- 三、实际案例--电商系统演进路径
-
- 阶段1:单体架构
- 阶段2:垂直拆分(微服务化)
- 阶段3:水平拆分(分库分表)
- [🌰 最终架构](#🌰 最终架构)
- 四、对比表
- 五、结论
下面我将从概念定义、技术原理、应用场景、相互关系四个维度,系统性地为您解析这五个核心概念,并用清晰的逻辑图展示它们之间的联系。
一、概念解析
1️⃣ 分布式(Distributed System)
📌 定义
分布式系统是由多个独立节点(计算机/服务)通过网络连接,协同完成任务的系统。这些节点共享资源、交换信息,对用户呈现为一个【统一的整体】。
🔧 核心特征
- 数据分散存储:数据分布在多个物理节点上(实际项目上,很多情况下会用一台物理机,多台虚拟机)。
- 计算并行处理:任务可并行执行,提高吞吐量。
- 高可用性:部分节点故障不影响整体服务。
- 透明性:用户无需感知底层分布式细节。
🌰 典型实现
- 分布式数据库(如TiDB)
- 分布式文件系统(如HDFS)
- 分布式缓存(如Redis Cluster)
- 微服务架构本身就是分布式系统
💡 关键点 :分布式是 【部署方式】 的概念,解决的是 系统规模和可靠性 问题。
2️⃣ Spring Boot 微服务(Microservices)
📌 定义
Spring Boot 微服务是一种 【架构风格】 ,将单体应用拆分为一组小型、独立部署的服务,每个服务运行在自己的进程(对于Java来说就是一个jvm进程)中,通过轻量级通信机制(如HTTP/REST)进行协作。
🔧 技术特点
- 独立性:每个微服务可独立开发、测试、部署、扩展。
- 技术异构性:不同服务可用不同技术栈(如Java + Python)。
- 去中心化治理:每个服务管理自己的数据库和业务逻辑。
- 弹性设计:支持容错、熔断、限流等机制。
🌰 典型场景
- 电商系统拆分为:用户服务、商品服务、订单服务、支付服务等。
- 每个服务有自己的数据库,通过API网关统一对外提供服务。
💡 关键点 :微服务是 【架构层面】 的概念,解决的是 应用复杂度 问题。
3️⃣ 垂直拆分(Vertical Splitting)
📌 定义
垂直拆分是 按业务功能 将系统或数据库进行划分,不同模块处理不同业务领域。
🔧 两种形式
| 类型 | 说明 | 示例 |
|---|---|---|
| 应用层垂直拆分 | 将单体应用按业务功能拆分为多个微服务 | 用户模块 → 用户服务 订单模块 → 订单服务 |
| 数据库垂直拆分 | 将单个数据库按业务表拆分为多个数据库 | 用户表 → user_db 订单表 → order_db |
🌰 典型场景
- 单体电商应用 → 拆分为用户服务(user_db)、商品服务(product_db)、订单服务(order_db)。
- 每个服务只访问自己的数据库,实现 业务解耦。
💡 关键点 :垂直拆分解决的是 业务复杂度 和 团队协作 问题。
4️⃣ 水平拆分(Horizontal Splitting)
📌 定义
水平拆分是 按数据维度(如ID范围、哈希值)将同一业务的数据分散到多个存储节点。
🔧 两种形式
| 类型 | 说明 | 示例 |
|---|---|---|
| 应用层水平拆分 | 同一服务部署多个实例,处理不同数据分片 | 订单服务实例1处理ID 1-1000 订单服务实例2处理ID 1001-2000 |
| 数据库水平拆分 | 同一业务表的数据按规则分散到多个数据库 | 订单表按用户ID哈希 ID%2=0 → order_db_0 ID%2=1 → order_db_1 |
🌰 典型场景
- 用户表有1亿条记录 → 按用户ID哈希分散到10个数据库。
- 每个数据库只存储1000万条记录,解决 单表性能瓶颈。
💡 关键点 :水平拆分解决的是 数据量过大 和 性能瓶颈 问题。
5️⃣ 分库分表(Database Sharding)
📌 定义
分库分表是 【数据库水平拆分的具体实现技术】,通过中间件将数据分散到多个数据库(分库)和多个表(分表)中。
🔧 技术实现
- 分库:将数据分散到多个物理数据库实例。
- 分表:将单表数据分散到同一数据库的多个表中。
- 常用中间件:ShardingSphere、MyCat。
🌰 典型配置(ShardingSphere)
yaml
# 按用户ID分片
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..3}
tableStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: table_inline
💡 关键点 :分库分表是 技术手段 ,专门解决 数据库单点性能瓶颈 问题。
二、五者之间的关系梳理
🔄 整体关系图
分布式系统(顶层概念)
│
├── 应用层分布式
│ └── Spring Boot微服务架构
│ ├── 垂直拆分(按业务功能拆分服务)
│ └── 水平拆分(同一服务多实例部署)
│
└── 数据层分布式
├── 垂直拆分(按业务表拆分数据库)
└── 水平拆分(分库分表)
└── 分库分表(具体技术实现)
🔗 详细关系说明
1. Spring Boot微服务 vs 分布式
- 包含关系 :Spring Boot微服务架构是 分布式系统的一种实现形式。
- 微服务必然是分布式的,但分布式系统不一定是微服务(如Hadoop集群)。
2. 垂直拆分 vs 微服务
- 实现关系 :垂直拆分是 实现微服务架构的核心手段。
- 微服务 = 应用层垂直拆分 + 数据库垂直拆分。
- 每个微服务对应一个业务领域的垂直切分。
3. 水平拆分 vs 分库分表
- 包含关系 :分库分表是 数据库水平拆分的具体技术实现。
- 水平拆分是 概念 ,分库分表是 工具。
4. 垂直拆分 vs 水平拆分
-
互补关系:
- 垂直拆分 解决 业务复杂度(不同业务用不同服务/数据库)。
- 水平拆分 解决 数据量问题(同一业务数据量太大时拆分)。
-
典型演进路径:
单体应用 → 垂直拆分(微服务化) → 某个微服务数据量过大 → 对该微服务进行水平拆分(分库分表)
5. 分布式 vs 所有概念
- 顶层概念 :分布式是所有这些技术的 共同目标。
- 分布式 = 应用分布式 + 数据分布式
- 应用分布式 → 微服务 + 水平扩展
- 数据分布式 → 垂直拆分 + 水平拆分
三、实际案例--电商系统演进路径
阶段1:单体架构
单体应用(所有业务代码)
└── 单一数据库(user_table, product_table, order_table...)
阶段2:垂直拆分(微服务化)
用户服务(Spring Boot) → user_db
商品服务(Spring Boot) → product_db
订单服务(Spring Boot) → order_db
支付服务(Spring Boot) → payment_db
✅ 这是微服务架构,也是分布式系统的第一步
阶段3:水平拆分(分库分表)
订单服务(Spring Boot)
├── order_db_0(存储用户ID % 2 = 0 的订单)
├── order_db_1(存储用户ID % 2 = 1 的订单)
└── 使用ShardingSphere(sharding-jdbc)作为分库分表中间件。
✅ 这是数据库水平拆分,解决订单数据量过大的问题
🌰 最终架构
分布式系统
├── 应用层:4个Spring Boot微服务(垂直拆分)
└── 数据层:
├── user_db, product_db(垂直拆分)
└── order_db_0, order_db_1(水平拆分 + 分库分表)
四、对比表
| 概念 | 层面 | 解决问题 | 关系定位 |
|---|---|---|---|
| 分布式 | 系统架构 | 系统规模、可靠性、性能 | 顶层概念,包含其他所有 |
| Spring Boot微服务 | 应用架构 | 业务复杂度、团队协作 | 分布式的一种实现 |
| 垂直拆分 | 设计方法 | 业务解耦、模块化 | 微服务的核心实现手段 |
| 水平拆分 | 设计方法 | 数据量过大、性能瓶颈 | 分库分表的理论基础 |
| 分库分表 | 技术实现 | 数据库单点性能瓶颈 | 水平拆分的具体工具 |
五、结论
- 分布式是目标,其他都是实现手段。
- 微服务 = 垂直拆分的应用层实现。
- 分库分表 = 水平拆分的数据层实现。
- 完整的分布式系统通常同时包含垂直拆分和水平拆分。
- 演进顺序:单体 → 垂直拆分(微服务) → 水平拆分(分库分表)。
🎯 最佳实践:先做垂直拆分(微服务化),再对数据量大的服务做水平拆分(分库分表),这样既能解决业务复杂度,又能解决性能瓶颈。