Skip to content

微服务架构设计原则

约 447 字大约 1 分钟

2025-09-07

探讨微服务架构的核心设计原则,帮助团队构建可扩展、可维护的分布式系统。

🎯 核心原则

1. 单一职责原则

每个微服务应该专注于单一业务能力:

# 服务划分示例
user-service:
  responsibilities:
    - 用户注册/登录
    - 用户信息管理
    - 用户权限验证

order-service:
  responsibilities:
    - 订单创建/修改
    - 订单状态管理
    - 订单查询统计

2. 数据库独立性

┌─────────────────┐    ┌─────────────────┐
│   User Service  │    │  Order Service  │
├─────────────────┤    ├─────────────────┤
│   User DB       │    │   Order DB      │
└─────────────────┘    └─────────────────┘

3. API设计

// RESTful API设计
@RestController
@RequestMapping("/api/v1/orders")
public class OrderController {
    
    @GetMapping("/{orderId}")
    public ResponseEntity<Order> getOrder(@PathVariable String orderId) {
        return ResponseEntity.ok(orderService.findById(orderId));
    }
    
    @PostMapping
    public ResponseEntity<Order> createOrder(@RequestBody CreateOrderRequest request) {
        Order order = orderService.createOrder(request);
        return ResponseEntity.status(HttpStatus.CREATED).body(order);
    }
}

🔧 服务间通信

1. 同步通信

// 使用Feign Client
@FeignClient(name = "user-service")
public interface UserServiceClient {
    
    @GetMapping("/api/v1/users/{userId}")
    UserDto getUserById(@PathVariable String userId);
}

2. 异步通信

// 事件驱动架构
@EventListener
public class OrderEventHandler {
    
    @Async
    public void handleOrderCreated(OrderCreatedEvent event) {
        // 发送邮件通知
        emailService.sendOrderConfirmation(event.getOrder());
        
        // 更新库存
        inventoryService.reserveItems(event.getOrderItems());
    }
}

🚀 部署策略

1. 容器化部署

FROM openjdk:11-jre-slim

COPY target/user-service.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

2. 服务发现

# Kubernetes Service
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
    - port: 80
      targetPort: 8080

📊 监控与治理

1. 分布式链路追踪

@RestController
public class UserController {
    
    @GetMapping("/users/{userId}")
    @NewSpan("get-user")
    public User getUser(@PathVariable String userId) {
        return userService.findById(userId);
    }
}

2. 熔断器模式

@Component
public class UserServiceClient {
    
    @HystrixCommand(fallbackMethod = "getUserFallback")
    public User getUser(String userId) {
        return restTemplate.getForObject("/users/" + userId, User.class);
    }
    
    public User getUserFallback(String userId) {
        return User.builder()
                  .id(userId)
                  .name("默认用户")
                  .build();
    }
}

记住:微服务不是银弹,要根据团队规模和业务复杂度合理选择架构!