🌺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 代码层面的区别

// 分布式系统的例子:分布式计算任务
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 分布式计算

大数据计算任务

节点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
} else if (slot >=5460 && slot < 10922) {
    // 存储到节点2
} else {
    // 存储到节点3
}

3.4 微服务架构

// 微服务本质也是一种分布式系统
// 但它强调的是"业务拆分"而不是"任务拆分"

// 用户服务
@RestController
@RequestMapping("/users")
public class UserController {
    // 独立的业务逻辑
}

// 订单服务  
@RestController
@RequestMapping("/orders")
public class OrderController {
    // 独立的业务逻辑
}

四、两者关系:维恩图 📊

分布式系统

分布式计算
如Hadoop

分布式存储
如HDFS

分布式缓存
如Redis Cluster

微服务架构

关系总结

  1. 微服务必然是分布式的:因为服务部署在不同节点
  2. 分布式不一定是微服务:可以是其他形态
  3. 微服务是一种特殊的分布式系统:专注于业务拆分

五、实际场景对比 🌰

5.1 电商大促场景

分布式视角

// 处理10万个并发订单,需要分布式处理
// 订单处理是同一个逻辑,只是分摊到多台机器
机器1:处理前3.3万订单
机器2:处理中间3.3万订单  
机器3:处理最后3.4万订单

微服务视角

// 不同的业务逻辑拆分成不同服务
// 每个服务独立处理自己的业务
用户服务:处理用户登录、注册
商品服务:处理商品查询、库存
订单服务:处理订单创建、查询
支付服务:处理支付流程

5.2 数据库对比

场景 分布式系统 微服务
数据拆分维度 按数据量拆分 按业务拆分
数据关系 数据是一体的 数据是独立的
查询方式 可能需要跨节点查询 通常不跨服务查询
典型例子 分库分表 每个服务独立数据库

六、总结:别再混淆了! 🎯

6.1 一句话区分

分布式解决的是"怎么做"的问题(多机协作)

微服务解决的是"做什么"的问题(业务拆分)

6.2 记忆口诀

分布式,为能力,多机协作同目标
微服务,为解耦,独立拆分各业务
一个是手段,一个是风格
两者可结合,但非同一物

6.3 最终理解

  • 如果问"为什么用多台机器?" → 可能是在谈分布式
  • 如果问"为什么拆分成多个服务?" → 可能是在谈微服务
  • 如果问"微服务为什么需要多台机器?" → 因为微服务本身就是分布式的一种

技术面试加分项

“微服务架构本质上是一种特殊的分布式系统,但它更侧重于业务层面的拆分和解耦,而分布式系统更侧重于技术层面的协作和扩展。它们不是非此即彼的关系,而是不同维度的概念。”


(本文为架构设计系列文章,欢迎关注更多系统设计深度内容)

在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐