分布式 vs 微服务:别再傻傻分不清了
分布式系统是由多台计算机或多个节点组成的系统,各节点之间通过网络进行通信和协作,共同完成一个或多个共享的任务。核心点:分布式的各个节点目标是一致的,之所以要分布式只是为了有更好的能力,能更快、更高效地承接任务。// 分布式系统的例子:分布式计算// 任务:计算1-10000的累加和// 分布式拆分:节点1:计算1-2500的累加和 → 结果A节点2:计算2501-5000的累加和 → 结果B节点3
分布式 vs 微服务:别再傻傻分不清了 🤔
|
🌺The Begin🌺点点关注,收藏不迷路🌺
|
引言:一对容易混淆的"双胞胎"
在日常开发中,经常听到有人把"分布式"和"微服务"混为一谈:
- “我们系统要做微服务,所以要部署多台服务器”
- “分布式系统?就是微服务吧?”
其实它们是两个不同维度的概念!打个比方:
- 分布式 = 几个人一起搬一张大桌子(协作完成同一件事)
- 微服务 = 把大桌子拆成小桌子,每人管一张(拆分成独立单元)
一、核心定义:完全不同的维度 📚
1.1 什么是分布式系统?
分布式系统是由多台计算机或多个节点组成的系统,各节点之间通过网络进行通信和协作,共同完成一个或多个共享的任务。
核心点:分布式的各个节点目标是一致的,之所以要分布式只是为了有更好的能力,能更快、更高效地承接任务。
// 分布式系统的例子:分布式计算
// 任务:计算1-10000的累加和
// 分布式拆分:
节点1:计算1-2500的累加和 → 结果A
节点2:计算2501-5000的累加和 → 结果B
节点3:计算5001-7500的累加和 → 结果C
节点4:计算7501-10000的累加和 → 结果D
// 最终汇总:结果 = A + B + C + D
常见例子:
- 分布式文件系统(HDFS):一个大文件分成多块存在不同机器
- 分布式数据库(TiDB):一张表的数据分散在多台机器
- 分布式缓存(Redis Cluster):数据分片存储
1.2 什么是微服务?
微服务是一种服务的架构风格,它主要是为了把一个大而全的服务,拆分成多个可以独立、松耦合的服务单元,为了让这些服务单元可以独立部署、运行、管理。
核心点:每个服务有自己的独立业务边界,可以单独开发、部署、扩展。
// 微服务的例子:电商系统拆分
// 原来是一个大而全的电商应用
└── 电商系统.war
├── 用户模块
├── 商品模块
├── 订单模块
├── 支付模块
└── 库存模块
// 拆分成独立服务
服务A:用户服务(单独部署)→ 只处理用户相关
服务B:商品服务(单独部署)→ 只处理商品相关
服务C:订单服务(单独部署)→ 只处理订单相关
服务D:支付服务(单独部署)→ 只处理支付相关
服务E:库存服务(单独部署)→ 只处理库存相关
常见例子:
- 电商系统:拆分为用户、商品、订单、支付等独立服务
- 内容平台:拆分为内容、评论、用户、推荐等独立服务
- 支付系统:拆分为交易、账户、风控、对账等独立服务
二、核心区别:目标 vs 形态 🎯
2.1 对比表
| 维度 | 分布式系统 | 微服务架构 |
|---|---|---|
| 核心关注点 | 如何协作完成任务 | 如何拆分成独立单元 |
| 节点关系 | 分工合作,目标一致 | 独立自治,各司其职 |
| 数据存储 | 通常共享数据视图 | 独立数据库 |
| 部署方式 | 可以统一部署 | 独立部署 |
| 典型例子 | Hadoop、TiDB | Spring Cloud应用 |
| 本质属性 | 是一种"系统形态" | 是一种"架构风格" |
2.2 用一个例子说清楚
想象一个大型餐厅:
分布式系统的视角:
餐厅有很多厨师,每个厨师负责一部分菜品:
- 厨师A:切菜
- 厨师B:炒菜
- 厨师C:装盘
- 厨师D:摆盘
他们**分工协作**,共同完成一道菜的烹饪。
微服务的视角:
餐厅分成了多个独立窗口:
- 川菜窗口:独立厨房、独立厨师、独立菜单
- 粤菜窗口:独立厨房、独立厨师、独立菜单
- 湘菜窗口:独立厨房、独立厨师、独立菜单
每个窗口**独立经营**,但都属于同一家餐厅。
2.3 代码层面的区别
// 分布式系统的例子:分布式计算任务
public class DistributedTask {
// 一个任务拆分成多个子任务,分布式执行
public Result executeTask(List<Data> datas) {
// 1. 数据分片
List<List<Data>> shards = shardData(datas, 10);
// 2. 分布式执行(10个节点并行处理)
List<Future<PartialResult>> futures = new ArrayList<>();
for (List<Data> shard : shards) {
Future<PartialResult> future = executorService.submit(
() -> processShard(shard) // 每个节点处理一部分数据
);
futures.add(future);
}
// 3. 汇总结果
return mergeResults(futures);
}
private PartialResult processShard(List<Data> shard) {
// 所有节点执行相同的处理逻辑
// 只是处理的数据不同
}
}
// 微服务的例子:独立业务服务
// 用户服务 - 只处理用户相关
@RestController
@RequestMapping("/users")
public class UserService {
@Autowired
private UserRepository userRepository; // 独立数据库
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userRepository.findById(id);
}
// 所有方法都和用户相关
}
// 订单服务 - 只处理订单相关
@RestController
@RequestMapping("/orders")
public class OrderService {
@Autowired
private OrderRepository orderRepository; // 独立数据库
@PostMapping
public Order createOrder(@RequestBody OrderDTO dto) {
// 只处理订单创建逻辑
// 如果需要用户信息,调用用户服务
User user = userServiceClient.getUser(dto.getUserId());
// 继续订单处理
}
}
三、分布式系统的常见形态 🏗️
分布式系统可以有不同的架构风格,微服务只是其中一种。
3.1 分布式计算
例子:Hadoop MapReduce、Spark
3.2 分布式存储
// 分布式存储:数据分片存储
// 100GB的数据,分散在10台机器上
机器1:存储 0-10GB 的数据
机器2:存储 10-20GB 的数据
机器3:存储 20-30GB 的数据
...
机器10:存储 90-100GB 的数据
// 查询时,需要从多台机器读取数据
// 写入时,根据路由规则写到对应机器
例子:HDFS、TiDB、Elasticsearch
3.3 分布式缓存
// Redis Cluster 分片存储
// 根据key的hash值,决定存储到哪个节点
int slot = CRC16(key) % 16384;
if (slot >=0 && slot < 5460) {
// 存储到节点1
} else if (slot >=5460 && slot < 10922) {
// 存储到节点2
} else {
// 存储到节点3
}
3.4 微服务架构
// 微服务本质也是一种分布式系统
// 但它强调的是"业务拆分"而不是"任务拆分"
// 用户服务
@RestController
@RequestMapping("/users")
public class UserController {
// 独立的业务逻辑
}
// 订单服务
@RestController
@RequestMapping("/orders")
public class OrderController {
// 独立的业务逻辑
}
四、两者关系:维恩图 📊
关系总结:
- 微服务必然是分布式的:因为服务部署在不同节点
- 分布式不一定是微服务:可以是其他形态
- 微服务是一种特殊的分布式系统:专注于业务拆分
五、实际场景对比 🌰
5.1 电商大促场景
分布式视角:
// 处理10万个并发订单,需要分布式处理
// 订单处理是同一个逻辑,只是分摊到多台机器
机器1:处理前3.3万订单
机器2:处理中间3.3万订单
机器3:处理最后3.4万订单
微服务视角:
// 不同的业务逻辑拆分成不同服务
// 每个服务独立处理自己的业务
用户服务:处理用户登录、注册
商品服务:处理商品查询、库存
订单服务:处理订单创建、查询
支付服务:处理支付流程
5.2 数据库对比
| 场景 | 分布式系统 | 微服务 |
|---|---|---|
| 数据拆分维度 | 按数据量拆分 | 按业务拆分 |
| 数据关系 | 数据是一体的 | 数据是独立的 |
| 查询方式 | 可能需要跨节点查询 | 通常不跨服务查询 |
| 典型例子 | 分库分表 | 每个服务独立数据库 |
六、总结:别再混淆了! 🎯
6.1 一句话区分
分布式解决的是"怎么做"的问题(多机协作)
微服务解决的是"做什么"的问题(业务拆分)
6.2 记忆口诀
分布式,为能力,多机协作同目标
微服务,为解耦,独立拆分各业务
一个是手段,一个是风格
两者可结合,但非同一物
6.3 最终理解
- 如果问"为什么用多台机器?" → 可能是在谈分布式
- 如果问"为什么拆分成多个服务?" → 可能是在谈微服务
- 如果问"微服务为什么需要多台机器?" → 因为微服务本身就是分布式的一种
技术面试加分项:
“微服务架构本质上是一种特殊的分布式系统,但它更侧重于业务层面的拆分和解耦,而分布式系统更侧重于技术层面的协作和扩展。它们不是非此即彼的关系,而是不同维度的概念。”
(本文为架构设计系列文章,欢迎关注更多系统设计深度内容)

|
🌺The End🌺点点关注,收藏不迷路🌺
|
更多推荐




所有评论(0)