分布式 vs 微服务:别再傻傻分不清了
分布式 vs 微服务:别再傻傻分不清了 🤔
🌺The Begin🌺点点关注,收藏不迷路🌺 |
引言:一对容易混淆的"双胞胎"
在日常开发中,经常听到有人把"分布式"和"微服务"混为一谈:
- “我们系统要做微服务,所以要部署多台服务器”
- “分布式系统?就是微服务吧?”
其实它们是两个不同维度的概念!打个比方:
- 分布式 = 几个人一起搬一张大桌子(协作完成同一件事)
- 微服务 = 把大桌子拆成小桌子,每人管一张(拆分成独立单元)
微服务架构
用户请求
API网关
订单服务
独立业务
用户服务
独立业务
商品服务
独立业务
分布式系统
任务
节点1
处理部分任务
节点2
处理部分任务
节点3
处理部分任务
结果整合
一、核心定义:完全不同的维度 📚
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 代码层面的区别
// 分布式系统的例子:分布式计算任务publicclassDistributedTask{// 一个任务拆分成多个子任务,分布式执行publicResultexecuteTask(List<Data> datas){// 1. 数据分片List<List<Data>> shards =shardData(datas,10);// 2. 分布式执行(10个节点并行处理)List<Future<PartialResult>> futures =newArrayList<>();for(List<Data> shard : shards){Future<PartialResult> future = executorService.submit(()->processShard(shard)// 每个节点处理一部分数据); futures.add(future);}// 3. 汇总结果returnmergeResults(futures);}privatePartialResultprocessShard(List<Data> shard){// 所有节点执行相同的处理逻辑// 只是处理的数据不同}}// 微服务的例子:独立业务服务// 用户服务 - 只处理用户相关@RestController@RequestMapping("/users")publicclassUserService{@AutowiredprivateUserRepository userRepository;// 独立数据库@GetMapping("/{id}")publicUsergetUser(@PathVariableLong id){return userRepository.findById(id);}// 所有方法都和用户相关}// 订单服务 - 只处理订单相关 @RestController@RequestMapping("/orders")publicclassOrderService{@AutowiredprivateOrderRepository orderRepository;// 独立数据库@PostMappingpublicOrdercreateOrder(@RequestBodyOrderDTO dto){// 只处理订单创建逻辑// 如果需要用户信息,调用用户服务User user = userServiceClient.getUser(dto.getUserId());// 继续订单处理}}三、分布式系统的常见形态 🏗️
分布式系统可以有不同的架构风格,微服务只是其中一种。
3.1 分布式计算
大数据计算任务
节点1
Map阶段
节点2
Map阶段
节点3
Map阶段
节点4
Reduce阶段
最终结果
例子: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}elseif(slot >=5460&& slot <10922){// 存储到节点2}else{// 存储到节点3}3.4 微服务架构
// 微服务本质也是一种分布式系统// 但它强调的是"业务拆分"而不是"任务拆分"// 用户服务@RestController@RequestMapping("/users")publicclassUserController{// 独立的业务逻辑}// 订单服务 @RestController@RequestMapping("/orders")publicclassOrderController{// 独立的业务逻辑}四、两者关系:维恩图 📊
分布式系统
分布式计算
如Hadoop
分布式存储
如HDFS
分布式缓存
如Redis Cluster
微服务架构
关系总结:
- 微服务必然是分布式的:因为服务部署在不同节点
- 分布式不一定是微服务:可以是其他形态
- 微服务是一种特殊的分布式系统:专注于业务拆分
五、实际场景对比 🌰
5.1 电商大促场景
分布式视角:
// 处理10万个并发订单,需要分布式处理// 订单处理是同一个逻辑,只是分摊到多台机器 机器1:处理前3.3万订单 机器2:处理中间3.3万订单 机器3:处理最后3.4万订单 微服务视角:
// 不同的业务逻辑拆分成不同服务// 每个服务独立处理自己的业务 用户服务:处理用户登录、注册 商品服务:处理商品查询、库存 订单服务:处理订单创建、查询 支付服务:处理支付流程 5.2 数据库对比
| 场景 | 分布式系统 | 微服务 |
|---|---|---|
| 数据拆分维度 | 按数据量拆分 | 按业务拆分 |
| 数据关系 | 数据是一体的 | 数据是独立的 |
| 查询方式 | 可能需要跨节点查询 | 通常不跨服务查询 |
| 典型例子 | 分库分表 | 每个服务独立数据库 |
六、总结:别再混淆了! 🎯
6.1 一句话区分
分布式解决的是"怎么做"的问题(多机协作)
微服务解决的是"做什么"的问题(业务拆分)
6.2 记忆口诀
分布式,为能力,多机协作同目标 微服务,为解耦,独立拆分各业务 一个是手段,一个是风格 两者可结合,但非同一物 6.3 最终理解
- 如果问"为什么用多台机器?" → 可能是在谈分布式
- 如果问"为什么拆分成多个服务?" → 可能是在谈微服务
- 如果问"微服务为什么需要多台机器?" → 因为微服务本身就是分布式的一种
技术面试加分项:
“微服务架构本质上是一种特殊的分布式系统,但它更侧重于业务层面的拆分和解耦,而分布式系统更侧重于技术层面的协作和扩展。它们不是非此即彼的关系,而是不同维度的概念。”
(本文为架构设计系列文章,欢迎关注更多系统设计深度内容)
🌺The End🌺点点关注,收藏不迷路🌺 |