SpringCloud面试题 - 分布式和微服务有什么区别?


1. 基本概念

1.1 分布式系统

分布式系统是由多台计算机通过网络连接组成的系统,这些计算机协同工作以完成共同的任务。分布式系统的核心特点是透明性,即用户无需关心系统内部的分布细节。

客户端
服务节点1
服务节点2
服务节点3
数据库集群

1.2 微服务架构

微服务是一种架构风格,它将单个应用程序开发为一组小型服务,每个服务运行在自己的进程中,服务之间通过轻量级机制(通常是HTTP API)通信。

客户端
API网关
用户服务
订单服务
支付服务
用户数据库
订单数据库
支付数据库

2. 主要区别

特性 分布式系统 微服务架构
设计目标 提高系统整体性能和可靠性 提高开发效率和系统可维护性
粒度 较粗,按功能或模块划分 较细,按业务能力划分
技术栈 通常统一 可以多样化
数据管理 通常共享数据库 每个服务有自己的数据库
通信方式 多种方式(RPC、消息队列等) 通常使用HTTP/REST
部署 可能需要整体部署 可以独立部署

3. 代码示例对比

3.1 分布式系统示例(Java)

// 订单服务接口
public interface OrderService {
    Order createOrder(OrderRequest request);
}

// 远程服务实现(使用RPC)
public class RemoteOrderService implements OrderService {
    private final OrderServiceClient client;
    
    public RemoteOrderService(String host, int port) {
        this.client = new OrderServiceClient(host, port);
    }
    
    @Override
    public Order createOrder(OrderRequest request) {
        return client.createOrder(request);
    }
}

// 客户端使用
public class OrderClient {
    public static void main(String[] args) {
        OrderService orderService = new RemoteOrderService("order.service.host", 8080);
        Order order = orderService.createOrder(new OrderRequest(...));
        System.out.println("Order created: " + order);
    }
}

3.2 微服务示例(Spring Boot)

// 用户服务Controller
@RestController
@RequestMapping("/users")
public class UserController {
    
    @Autowired
    private UserRepository userRepository;
    
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userRepository.save(user);
        return ResponseEntity.ok(savedUser);
    }
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return userRepository.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }
}

// 订单服务调用用户服务(通过Feign客户端)
@FeignClient(name = "user-service", url = "${user.service.url}")
public interface UserServiceClient {
    
    @GetMapping("/users/{id}")
    User getUser(@PathVariable("id") Long userId);
}

@Service
public class OrderService {
    
    @Autowired
    private UserServiceClient userServiceClient;
    
    public Order createOrder(OrderRequest request) {
        // 调用用户服务验证用户
        User user = userServiceClient.getUser(request.getUserId());
        if (user == null) {
            throw new IllegalArgumentException("User not found");
        }
        // 创建订单逻辑...
    }
}

4. 如何选择

4.1 适合分布式系统的场景

  1. 需要处理大规模计算或数据
  2. 系统组件需要高可用性
  3. 需要地理分布式的部署

4.2 适合微服务的场景

  1. 大型复杂应用程序需要持续交付
  2. 团队需要独立开发和部署能力
  3. 需要使用不同的技术栈
  4. 需要更好的可扩展性
需要构建新系统?
系统复杂度
考虑逐步迁移
微服务
单体或简单分布式
识别边界上下文
逐步拆分为微服务

5. 总结

分布式系统更关注系统层面的分布,解决的是如何将计算和存储分散到多台机器上;而微服务更关注应用架构的分解,解决的是如何将复杂应用拆分为可独立开发部署的小型服务。

在实践中,微服务架构通常是建立在分布式系统之上的,两者可以结合使用。理解它们的区别有助于我们在系统设计时做出更合适的选择。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐