微服务拆分策略:DDD 驱动设计原则 DDD 领域驱动设计 战略设计 识别限界上下文 识别聚合根 战术设计 值对象(Value Object) 实体(Entity) 拆分策略 按业务能力拆分 用户服务 订单服务 按领域拆分 订单域 服务通信 同步通信(REST) 异步通信(消息队列) 事件驱动架构 数据管理 每个服务一个数据库 yaml Order Service spring: datasource: url: jdbc:postgresql://localhost:5432/orderdb username: orderuser password: orderpass jpa: hibernate: ddl-auto: update show-sql: false sql --
// 限界上下文:用户上下文 @ContextSpec public class UserContext { @Context private String currentUserId; @Context private Set<String> permissions; @Context private String tenantId; }
// 聚合根:用户 @AggregateRoot public class User { @Embedded private UserId userId; @Embedded private UserName name; @Email @Embedded EmailAddress email; @OneToMany(mappedBy = "user") private Set<Order> orders; public void addOrder(Order order) { this.orders.add(order); } }
public class Money { private final BigDecimal amount; private final Currency currency; private Money(BigDecimal amount, Currency currency) { this.amount = amount; this.currency = currency; } public Money add(Money other) { if (other == null || other.currency != this.currency) { throw new IllegalArgumentException("Currency mismatch"); } return new Money(this.amount.add(other.amount), this.currency); } }
@Entity @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Embedded private OrderId orderId; @ManyToOne @JoinColumn(name = "user_id") private User user; @Embedded OrderStatus status; @Embedded ShippingInfo shippingInfo; @OneToMany(mappedBy = "order") private List<OrderItem> items; }
# 拆分原则 服务应该: - 单一职责 - 高内聚低耦合 - 独立部署 - 拥有独立的数据存储
@Service public class UserService { @Autowired private UserRepository userRepository; public User findById(UserId userId) { return userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException(userId)); } public User create(User user) { return userRepository.save(user); } }
@Service public class OrderService { @Autowired private OrderRepository orderRepository; @Autowired private UserService userService; public Order createOrder(OrderRequest request) { User user = userService.findById(request.getUserId()); Order order = new Order(user, request); return orderRepository.save(order); } }
@Domain public class Order { public Order place(OrderCommand command) { // 业务逻辑 OrderId orderId = command.getOrderId(); UserId userId = command.getUserId(); // 验证订单 validateOrder(command); // 创建订单 Order order = new Order(userId, orderId); // 发布领域事件 publishOrderCreated(order); return order; } private void validateOrder(OrderCommand command) { // 业务规则验证 if (command.getTotalAmount().isNegative()) { throw new InvalidOrderException("金额不能为负"); } } }
@Service public class OrderController { @Autowired private ProductService productService; @PostMapping("/orders/{order}/items") @ResponseStatus(HttpStatus.CREATED) ItemInfo addItem(@PathVariable("order") Order order, @RequestBody AddItemRequest request) { // 调用商品服务 Product product = productService.getProduct(request.getProductId()); // 添加订单项 order.addItem(request.getProductId(), request.getQuantity()); return ItemInfo.of(product); } }
@Component public class OrderEventPublisher { @Autowired ApplicationEventPublisher eventPublisher; public void publishOrderCreated(Order order) { OrderCreatedEvent event = new OrderCreatedEvent(order); eventPublisher.publishEvent(event); } } @Component class InventoryService { @EventListener void handleOrderCreated(OrderCreatedEvent event) { // 库存扣减 inventoryService.deduct(event.getOrderId(), event.getItems()); } }
``yaml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/order_db
username: order_user
password: order_pass
jpa:
hibernate:
ddl-auto: update
show-sql: false
### 2. 共享数据库(需要精心设计) ```sql -- 按前缀分离表 CREATE TABLE users ( id BIGSERIAL PRIMARY KEY, username VARCHAR(50), ... ); CREATE TABLE orders ( id BIGSERIAL PRIMARY KEY, user_id BIGINT, ... FOREIGN KEY (user_id) REFERENCES users(id) );
// Saga 模式 @SagaOrchestration( saga = "OrderCreationSaga" ) public class OrderCreationSaga { @SagaStep(name = "createOrder", compensate = "deleteOrder") OrderCreated createOrder(CreateOrderCommand command) { // 创建订单 Order order = orderService.create(command); return new OrderCreated(order.getId()); } @SagaStep(name = "reserveInventory", compensate = "releaseInventory") Void reserveInventory(OrderCreated event) { inventoryService.reserve(event.getOrderId(), event.getItems()); } @SagaStep(name = "processPayment", compensate = "refundPayment") Void processPayment(OrderCreated event) { paymentService.charge(event.getUserId(), event.getAmount()); } }
微服务拆分要点:
从单体到微服务,平滑演进!