Skip to content

扩展性设计 ​

扩展性设计是系统架构的核心,决定了系统能否应对业务增长。

📋 核心要素 ​

  • 水平扩展:通过增加服务器数量扩展
  • 垂直扩展:通过提升服务器性能扩展
  • 无状态设计:服务无状态,便于扩展
  • 微服务架构:服务拆分,独立扩展

🎯 扩展方式对比 ​

水平扩展 vs 垂直扩展 ​

扩展方式对比:

水平扩展(Scale Out):

优点:

  • ✅ 扩展性好,理论上可以无限扩展
  • ✅ 成本相对较低
  • ✅ 可以实现高可用

缺点:

  • ❌ 需要负载均衡
  • ❌ 数据同步复杂
  • ❌ 网络开销增加

垂直扩展(Scale Up):

优点:

  • ✅ 实现简单,不需要修改架构
  • ✅ 性能提升明显
  • ✅ 无网络开销

缺点:

  • ❌ 成本高(硬件升级成本)
  • ❌ 扩展性有限(单机性能有上限)
  • ❌ 单点故障风险

🎯 无状态设计 ​

无状态 vs 有状态:

无状态设计示例:

java
/**
 * ❌ 有状态服务 - 不推荐
 */
@RestController
public class StatefulController {
    private Map<String, UserSession> sessions = new HashMap<>();  // 存储在内存中
    
    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody LoginRequest request) {
        UserSession session = new UserSession(request.getUsername());
        sessions.put(session.getId(), session);  // 状态存储在服务器内存
        return ResponseEntity.ok(session.getId());
    }
    
    @GetMapping("/profile")
    public ResponseEntity<UserProfile> getProfile(@RequestParam String sessionId) {
        UserSession session = sessions.get(sessionId);  // 只能在这台服务器上找到
        if (session == null) {
            return ResponseEntity.status(401).build();
        }
        return ResponseEntity.ok(session.getUserProfile());
    }
}

/**
 * ✅ 无状态服务 - 推荐
 */
@RestController
public class StatelessController {
    @Autowired
    private RedisTemplate<String, UserSession> redisTemplate;  // 使用外部存储
    
    @Autowired
    private JwtTokenProvider tokenProvider;
    
    @PostMapping("/login")
    public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) {
        // 验证用户
        User user = userService.authenticate(request);
        
        // 生成JWT Token(无状态)
        String token = tokenProvider.generateToken(user);
        
        // 将用户信息存储到Redis(可选,用于快速查询)
        UserSession session = new UserSession(user);
        redisTemplate.opsForValue().set("session:" + user.getId(), session, 30, TimeUnit.MINUTES);
        
        return ResponseEntity.ok(new LoginResponse(token));
    }
    
    @GetMapping("/profile")
    public ResponseEntity<UserProfile> getProfile(@RequestHeader("Authorization") String token) {
        // 从Token中获取用户信息(无状态验证)
        if (!tokenProvider.validateToken(token)) {
            return ResponseEntity.status(401).build();
        }
        
        Long userId = tokenProvider.getUserIdFromToken(token);
        UserProfile profile = userService.getUserProfile(userId);
        return ResponseEntity.ok(profile);
    }
}

🎯 微服务架构 ​

微服务架构演进:

微服务架构示例:


上一章节:基本理论概览
下一章节:可用性设计
返回目录:系统架构能力