扩展性设计
扩展性设计是系统架构的核心,决定了系统能否应对业务增长。
📋 核心要素
- 水平扩展:通过增加服务器数量扩展
- 垂直扩展:通过提升服务器性能扩展
- 无状态设计:服务无状态,便于扩展
- 微服务架构:服务拆分,独立扩展
🎯 扩展方式对比
水平扩展 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);
}
}🎯 微服务架构
微服务架构演进:
微服务架构示例: