外观
微服务架构设计原则
约 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();
}
}
记住:微服务不是银弹,要根据团队规模和业务复杂度合理选择架构!