ๅฏๆ ้ข๏ผDDD้ขๅ้ฉฑๅจ่ฎพ่ฎก + ๅบทๅจๅฎๅพ๏ผๆ้ ๅฎ็พๅพฎๆๅกๆถๆ๏ผ๐ฏ
๐ฌ ๅผๅบ๏ผๆ่ฟๆฏไธๆ๏ผ
ๅไฝๅบ็จ็็
ๆ็ตๅๅนณๅฐ็ๆผ่ฟๅฒ๏ผ
็ฌฌ1ๅนด๏ผๅไธๆ๏ผ๏ผ
ๅไฝๅบ็จ๏ผไธไธชwarๅ
ไปฃ็ ้๏ผ5ไธ่ก
ๅผๅ๏ผ3ไบบ
้จ็ฝฒ๏ผ1ๅฐๆๅกๅจ
โ
็ฎๅใๅฟซ้
็ฌฌ3ๅนด๏ผๆ้ฟๆ๏ผ๏ผ
ไปฃ็ ้๏ผ50ไธ่ก
ๅผๅ๏ผ30ไบบ
้จ็ฝฒ๏ผ10ๅฐๆๅกๅจ
โ ็็นๅบ็ฐ๏ผ
โโโ ไปฃ็ ่ฆๅไธฅ้
โโโ ้จ็ฝฒๆ
ข๏ผ30ๅ้๏ผ
โโโ ๆนไธ่กไปฃ็ ๏ผๅ
จ้ๅๅธ
โโโ ๅข้ๅไฝๅฐ้พ
โโโ ็ณป็ป็ปๅธธๅฎๆบ
็ฌฌ5ๅนด๏ผ็ๅๆ๏ผ๏ผ
ไปฃ็ ้๏ผ200ไธ่ก
ๅผๅ๏ผ100ไบบ
โ ๅไฝๅบ็จ็ๅฉๆขฆ๏ผ
โโโ ๅฏๅจ้่ฆ10ๅ้
โโโ ๆนbugๅผๅๆฐbug
โโโ ๆ ๆณๆๆฏๅ็บง
โโโ ๆฐๆฎๅบๆไธบ็ถ้ข
โโโ ไธๆข้ๆ
่งฃๅณๆนๆก๏ผๅพฎๆๅกๆๅ๏ผ
ๆๅ็ๆๆ
้่ฏฏ็ๆๅ๏ผ
ๆๅๅ๏ผไธไธชๅคงๆณฅ็
ๆๅๅ๏ผNไธชๅฐๆณฅ็
้ฎ้ข๏ผ
โโโ ๆๅก่พน็ๆททไนฑ
โโโ ๆๅก้ด่ฐ็จ้ข็น
โโโ ๆฐๆฎไธ่ดๆง้ฎ้ข
โโโ ๅๅธๅผไบๅกๅคๆ
โโโ ่ฟ็ปดๆๆฌๆดๅข
ๆญฃ็กฎ็ๆๅ๏ผ
ๆๅๅ๏ผไธไธชๅคงๆณฅ็
ๆๅๅ๏ผNไธช็ฌ็ซ็ใๅ
่็ๆๅก
็น็น๏ผ
โโโ ๆๅก่พน็ๆธ
ๆฐ
โโโ ๆๅก้ดไฝ่ฆๅ
โโโ ็ฌ็ซ้จ็ฝฒๅๅธ
โโโ ๆฐๆฎ่ชๆฒป
โโโ ่่ดฃๅไธ
๐ ๆ ธๅฟๅๅ
1๏ธโฃ ๅไธ่่ดฃๅๅ๏ผSRP๏ผ
ๆฏไธชๆๅกๅชๅไธไปถไบ๏ผๅนถไธๅๅฅฝ
โ ้่ฏฏ็คบไพ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็จๆทๆๅก โ
โ โโโ ็จๆท็ฎก็ โ
โ โโโ ่ฎขๅ็ฎก็ โ
โ โโโ ๅๅ็ฎก็ โ
โ โโโ ๆฏไป็ฎก็ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
่่ดฃๅคชๅค๏ผ่ฆๅไธฅ้๏ผ
โ
ๆญฃ็กฎ็คบไพ๏ผ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ ็จๆทๆๅก โ โ ่ฎขๅๆๅก โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ ๅๅๆๅก โ โ ๆฏไปๆๅก โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
ๆฏไธชๆๅก่่ดฃๅไธ๏ผ
2๏ธโฃ ้ซๅ ่ใไฝ่ฆๅ
้ซๅ
่๏ผ
็ธๅ
ณ็ๅ่ฝ่้ๅจไธไธชๆๅกๅ
ไพๅฆ๏ผ่ฎขๅๆๅก
โโโ ๅๅปบ่ฎขๅ โ
้ซๅบฆ็ธๅ
ณ
โโโ ๆฅ่ฏข่ฎขๅ โ
้ซๅบฆ็ธๅ
ณ
โโโ ๅๆถ่ฎขๅ โ
้ซๅบฆ็ธๅ
ณ
โโโ ่ฎขๅ็ป่ฎก โ
้ซๅบฆ็ธๅ
ณ
ไฝ่ฆๅ๏ผ
ๆๅกไน้ดไพ่ตๅฐฝๅฏ่ฝๅฐ
โ ้่ฏฏ๏ผ
่ฎขๅๆๅก โ ็จๆทๆๅก โ ๅๅๆๅก โ ๅบๅญๆๅก โ ไปทๆ ผๆๅก
้พๅผ่ฐ็จ๏ผ่ฆๅไธฅ้
โ
ๆญฃ็กฎ๏ผ
่ฎขๅๆๅก โ ็จๆทๆๅก
โ ๅๅๆๅก
โ ๅบๅญๆๅก
ๅนถ่ก่ฐ็จ๏ผ้ไฝ่ฆๅ
3๏ธโฃ ไธๅก้ฉฑๅจ๏ผ่้ๆๆฏ้ฉฑๅจ
โ ๆๆฏ้ฉฑๅจ๏ผ้่ฏฏ๏ผ๏ผ
โโโ Controllerๆๅก
โโโ Serviceๆๅก
โโโ DAOๆๅก
โโโ ็ผๅญๆๅก
ๆๆๆฏๅฑๆๅ๏ผๆฏซๆ ๆไน๏ผ
โ
ไธๅก้ฉฑๅจ๏ผๆญฃ็กฎ๏ผ๏ผ
โโโ ็จๆทๆๅก๏ผUser Domain๏ผ
โโโ ่ฎขๅๆๅก๏ผOrder Domain๏ผ
โโโ ๅๅๆๅก๏ผProduct Domain๏ผ
โโโ ๆฏไปๆๅก๏ผPayment Domain๏ผ
ๆไธๅก้ขๅๆๅ๏ผ
๐ฏ DDD้ขๅ้ฉฑๅจ่ฎพ่ฎก
DDDๆ ธๅฟๆฆๅฟต
DDD๏ผDomain-Driven Design๏ผ:
้ขๅ้ฉฑๅจ่ฎพ่ฎก๏ผๅพฎๆๅกๆๅ็็่ฎบๅบ็ก
ๆ ธๅฟๆฆๅฟต๏ผ
1. ้ขๅ๏ผDomain๏ผ๏ผไธๅก่ๅด
2. ๅญๅ๏ผSubdomain๏ผ๏ผไธๅก็ปๅ
3. ้็ไธไธๆ๏ผBounded Context๏ผ๏ผๅพฎๆๅก่พน็
4. ่ๅ๏ผAggregate๏ผ๏ผๆฐๆฎๅ่กไธบ็้ๅ
5. ๅฎไฝ๏ผEntity๏ผ๏ผๆๅฏไธๆ ่ฏ็ๅฏน่ฑก
6. ๅผๅฏน่ฑก๏ผValue Object๏ผ๏ผๆ ๆ ่ฏ็ๅฏน่ฑก
็ตๅ็ณป็ปDDDๅๆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็ตๅ็ณป็ป๏ผDomain๏ผ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโดโโโโโโโโโโ
โ โ
โโโโโโโโโผโโโโโโ โโโโโโโโผโโโโโโโ
โ ๆ ธๅฟๅ โ โ ๆฏๆๅ โ
โ (Core) โ โ (Supporting)โ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ โ
โโโโโโโดโโโโโโ โโโโโโโดโโโโโโ
โ โ โ โ
่ฎขๅๅ ๅๅๅ ็จๆทๅ ๆฏไปๅ
(Order) (Product) (User) (Payment)
่ฏๅซ้็ไธไธๆ
/**
* ่ฎขๅ้็ไธไธๆ
*/
// Order่ๅๆ น
@Entity
public class Order {
private Long id; // ๅฎไฝๆ ่ฏ
private Long userId; // ็จๆทๅผ็จ๏ผๅชๅญID๏ผ
private List<OrderItem> items;// ่ฎขๅ้กน๏ผ่ๅๅ
้จ๏ผ
private OrderStatus status; // ่ฎขๅ็ถๆ
private BigDecimal totalAmount;
// ้ขๅ่กไธบ
public void create() { } // ๅๅปบ่ฎขๅ
public void pay() { } // ๆฏไป่ฎขๅ
public void cancel() { } // ๅๆถ่ฎขๅ
public void ship() { } // ๅ่ดง
}
// OrderItemๅผๅฏน่ฑก๏ผๅฑไบOrder่ๅ๏ผ
@Embeddable
public class OrderItem {
private Long productId; // ๅๅๅผ็จ
private String productName; // ๅๅๅ็งฐๅฟซ็
ง
private BigDecimal price; // ไปทๆ ผๅฟซ็
ง
private Integer quantity; // ๆฐ้
}
/**
* ๅๅ้็ไธไธๆ
*/
@Entity
public class Product {
private Long id;
private String name;
private String description;
private BigDecimal price;
private Integer stock;
// ้ขๅ่กไธบ
public void updateStock(int delta) { }
public void updatePrice(BigDecimal newPrice) { }
}
/**
* ็จๆท้็ไธไธๆ
*/
@Entity
public class User {
private Long id;
private String username;
private String email;
private String phone;
// ้ขๅ่กไธบ
public void register() { }
public void updateProfile() { }
}
้็ไธไธๆๆ ๅฐ
โโโโโโโโโโโโโโโโ
โ ่ฎขๅไธไธๆ โ
โ โโโโโโโโโโ โ โโโโโโโโโโโโโโโโ
โ โ Order โ โโโโโโโถโ ็จๆทไธไธๆ โ
โ โโโโโโโโโโ โ U โ โโโโโโโโโโ โ
โ โ โ โ โ User โ โ
โ โ โ โ โโโโโโโโโโ โ
โ โโโโโผโโโโโ โ โโโโโโโโโโโโโโโโ
โ โOrderItemโ โ
โ โโโโโโฌโโโโ โ โโโโโโโโโโโโโโโโ
โ โ โโโโโโโถโ ๅๅไธไธๆ โ
โโโโโโโโโผโโโโโโโ P โ โโโโโโโโโโ โ
โ โ โProduct โ โ
โโโโโโโโโโโโโโถโ โโโโโโโโโโ โ
โโโโโโโโโโโโโโโโ
ๆ ๅฐๅ
ณ็ณป๏ผ
U: Upstream๏ผไธๆธธ๏ผ
P: Partner๏ผๅไฝไผไผด๏ผ
่ฎขๅไธไธๆ๏ผ
- ไพ่ต็จๆทไธไธๆ๏ผ่ทๅ็จๆทไฟกๆฏ๏ผ
- ไพ่ตๅๅไธไธๆ๏ผ่ทๅๅๅไฟกๆฏ๏ผ
- ไฝๅชๅญๅจๅผ็จID๏ผไธๅญๅจๅฎๆดๆฐๆฎ
๐ช ๆๅๆนๆณ
ๆนๆณ1๏ผๆไธๅก่ฝๅๆๅ โญโญโญโญโญ
่ฏๅซไธๅก่ฝๅ๏ผBusiness Capability๏ผ
็ตๅ็ณป็ป็ไธๅก่ฝๅ๏ผ
1. ็จๆท็ฎก็
โโโ ๆณจๅ็ปๅฝ
โโโ ไธชไบบไฟกๆฏ
โโโ ๅฐๅ็ฎก็
2. ๅๅ็ฎก็
โโโ ๅๅๅฑ็คบ
โโโ ๅ็ฑป็ฎก็
โโโ ๅบๅญ็ฎก็
3. ่ฎขๅ็ฎก็
โโโ ไธๅ
โโโ ๆฏไป
โโโ ๅ่ดง
4. ่ฅ้็ฎก็
โโโ ไผๆ ๅธ
โโโ ไฟ้ๆดปๅจ
โโโ ็งฏๅ็ณป็ป
ๅฏนๅบ็ๅพฎๆๅก๏ผ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ ็จๆทๆๅก โ โ ๅๅๆๅก โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ ่ฎขๅๆๅก โ โ ่ฅ้ๆๅก โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
ไปฃ็ ็คบไพ๏ผ
/**
* ็จๆทๆๅก
*/
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/register")
public Result register(@RequestBody RegisterRequest request) {
// ็จๆทๆณจๅ
}
@PostMapping("/login")
public Result login(@RequestBody LoginRequest request) {
// ็จๆท็ปๅฝ
}
@GetMapping("/{userId}")
public Result<User> getUser(@PathVariable Long userId) {
// ่ทๅ็จๆทไฟกๆฏ
}
}
/**
* ๅๅๆๅก
*/
@RestController
@RequestMapping("/product")
public class ProductController {
@GetMapping("/{productId}")
public Result<Product> getProduct(@PathVariable Long productId) {
// ่ทๅๅๅ่ฏฆๆ
}
@PostMapping("/deductStock")
public Result deductStock(@RequestBody StockRequest request) {
// ๆฃๅๅบๅญ
}
}
/**
* ่ฎขๅๆๅก๏ผ็ปๅๅ
ถไปๆๅก๏ผ
*/
@Service
public class OrderService {
@Autowired
private UserServiceClient userServiceClient;
@Autowired
private ProductServiceClient productServiceClient;
/**
* ๅๅปบ่ฎขๅ
*/
@Transactional
public Order createOrder(CreateOrderRequest request) {
Long userId = request.getUserId();
List<OrderItem> items = request.getItems();
// 1. ่ฐ็จ็จๆทๆๅก๏ผ้ช่ฏ็จๆท
User user = userServiceClient.getUser(userId);
if (user == null) {
throw new BusinessException("็จๆทไธๅญๅจ");
}
// 2. ่ฐ็จๅๅๆๅก๏ผ้ช่ฏๅๅๅๅบๅญ
for (OrderItem item : items) {
Product product = productServiceClient.getProduct(item.getProductId());
if (product == null) {
throw new BusinessException("ๅๅไธๅญๅจ");
}
if (product.getStock() < item.getQuantity()) {
throw new BusinessException("ๅบๅญไธ่ถณ");
}
}
// 3. ๅๅปบ่ฎขๅ
Order order = new Order();
order.setUserId(userId);
order.setItems(items);
order.setStatus(OrderStatus.CREATED);
order.calculateTotalAmount();
orderRepository.save(order);
// 4. ๆฃๅๅบๅญ๏ผๅ้MQๆถๆฏ๏ผ
for (OrderItem item : items) {
stockMQProducer.send(new StockDeductMessage(
item.getProductId(),
item.getQuantity()
));
}
return order;
}
}
ๆนๆณ2๏ผๆๆฐๆฎๆๆๆๆๅ
ๅๅ๏ผๆฏไธชๆๅกๆฅๆ่ชๅทฑ็ๆฐๆฎๅบ
โ ้่ฏฏ๏ผๅ
ฑไบซๆฐๆฎๅบ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ ็จๆทๆๅก โ โ ่ฎขๅๆๅก โ
โโโโโโโฌโโโโโ โโโโโโโฌโโโโโ
โ โ
โโโโโโโโฌโโโโโโโ
โ
โโโโโโผโโโโโ
โ MySQL โ
โ (ๅ
ฑไบซ) โ
โโโโโโโโโโโ
้ฎ้ข๏ผ
- ๆฐๆฎ่ฆๅ
- ๆ ๆณ็ฌ็ซๆผๅ
- ๆฉๅฑๅฐ้พ
โ
ๆญฃ็กฎ๏ผๆฐๆฎๅบๅ็ฆป
โโโโโโโโโโโโ โโโโโโโโโโโโ
โ ็จๆทๆๅก โ โ ่ฎขๅๆๅก โ
โโโโโโโฌโโโโโ โโโโโโโฌโโโโโ
โ โ
โโโโโโโผโโโโโ โโโโโโโผโโโโโ
โ User DB โ โ Order DB โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
ไผ็น๏ผ
- ๆฐๆฎ่ชๆฒป
- ็ฌ็ซๆผๅ
- ๆไบๆฉๅฑ
ๆฐๆฎๅไฝ็ญ็ฅ๏ผ
/**
* ่ฎขๅ่กจ่ฎพ่ฎก๏ผๆฐๆฎๅไฝ๏ผ
*/
@Entity
@Table(name = "orders")
public class Order {
@Id
private Long id;
// ็จๆทไฟกๆฏ๏ผๅไฝ๏ผ
private Long userId;
private String username; // ๅไฝ๏ผไธๅๆถ็็จๆทๅ
private String userPhone; // ๅไฝ๏ผไธๅๆถ็ๆๆบๅท
private String deliveryAddress; // ๅไฝ๏ผๆถ่ดงๅฐๅ
// ๅๅไฟกๆฏ๏ผๅไฝ๏ผ
@OneToMany(cascade = CascadeType.ALL)
private List<OrderItem> items;
private OrderStatus status;
private BigDecimal totalAmount;
private Date createTime;
}
@Entity
@Table(name = "order_items")
public class OrderItem {
@Id
private Long id;
private Long orderId;
// ๅๅไฟกๆฏ๏ผๅไฝ๏ผๅฟซ็
ง๏ผ
private Long productId;
private String productName; // ๅไฝ๏ผไธๅๆถ็ๅๅๅ
private BigDecimal price; // ๅไฝ๏ผไธๅๆถ็ไปทๆ ผ
private String productImage; // ๅไฝ๏ผๅๅๅพ็
private Integer quantity;
private BigDecimal subtotal;
}
/**
* ไธบไปไน่ฆๅไฝ๏ผ
*
* 1. ๅๅฒๅฟซ็
ง๏ผ็จๆท/ๅๅไฟกๆฏไผๅๅ๏ผ่ฎขๅ้่ฆไฟ็ไธๅๆถ็็ถๆ
* 2. ๅๅฐไพ่ต๏ผ้ฟๅ
ๆฅ่ฏข่ฎขๅๆถ้ข็น่ฐ็จๅ
ถไปๆๅก
* 3. ๆง่ฝไผๅ๏ผๆฌๅฐๆฅ่ฏขๆฏ่ฟ็จ่ฐ็จๅฟซๅพๅค
*/
ๆนๆณ3๏ผๆๅข้็ปๆๆๅ๏ผๅบทๅจๅฎๅพ๏ผ
ๅบทๅจๅฎๅพ๏ผConway's Law๏ผ๏ผ
็ณป็ป็ๆถๆๅๆ ไบ็ป็ป็ๆฒ้็ปๆ
ไพๅญ๏ผ
็ตๅๅ
ฌๅธ็ๅข้็ปๆ๏ผ
โโโ ็จๆทๅข้๏ผ10ไบบ๏ผ
โโโ ๅๅๅข้๏ผ15ไบบ๏ผ
โโโ ่ฎขๅๅข้๏ผ20ไบบ๏ผ
โโโ ๆฏไปๅข้๏ผ8ไบบ๏ผ
ๅฏนๅบ็ๅพฎๆๅกๆถๆ๏ผ
โโโ ็จๆทๆๅก๏ผ็จๆทๅข้่ด่ดฃ๏ผ
โโโ ๅๅๆๅก๏ผๅๅๅข้่ด่ดฃ๏ผ
โโโ ่ฎขๅๆๅก๏ผ่ฎขๅๅข้่ด่ดฃ๏ผ
โโโ ๆฏไปๆๅก๏ผๆฏไปๅข้่ด่ดฃ๏ผ
ไผ็น๏ผ
- ๅข้่ชๆฒป
- ่่ดฃๆธ
ๆฐ
- ๆฒ้้กบ็
- ๅฟซ้่ฟญไปฃ
ๆนๆณ4๏ผๆๅๅ้ข็ๆๅ
ๅๅ๏ผๅๅ้ข็ไธๅ็ๅ่ฝๅ็ฆป
้ซ้ขๅๅ๏ผ่ฅ้ๆดปๅจใๆจ่็ฎๆณ
ไฝ้ขๅๅ๏ผ็จๆทๅบ็กไฟกๆฏใ่ฎขๅๆ ธๅฟๆต็จ
ๆๅ็ญ็ฅ๏ผ
โโโโโโโโโโโโโโโ
โ ๆ ธๅฟๆๅก โ ๅๅ้ข็ไฝ๏ผ็จณๅฎ
โ (็จณๅฎ) โ ไพๅฆ๏ผ็จๆทใ่ฎขๅ
โโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโ
โ ่ฅ้ๆๅก โ ๅๅ้ข็้ซ๏ผ็ตๆดป
โ (็ตๆดป) โ ไพๅฆ๏ผไฟ้ใๆจ่
โโโโโโโโโโโโโโโ
ๅฅฝๅค๏ผ
- ๆ ธๅฟๆๅก็จณๅฎ๏ผไธๅๅฝฑๅ
- ่ฅ้ๆๅกๅฏไปฅ้ข็นๅๅธ
- ้ไฝ้ฃ้ฉ
๐จ ๅฎๆๆกไพ๏ผ็ตๅ็ณป็ปๆๅ
ๆๅๅ๏ผๅไฝๅบ็จ๏ผ
็ตๅๅไฝๅบ็จ๏ผ
โโโ controller
โ โโโ UserController
โ โโโ ProductController
โ โโโ OrderController
โ โโโ PaymentController
โโโ service
โ โโโ UserService
โ โโโ ProductService
โ โโโ OrderService
โ โโโ PaymentService
โโโ dao
โ โโโ UserMapper
โ โโโ ProductMapper
โ โโโ OrderMapper
โ โโโ PaymentMapper
โโโ model
โโโ User
โโโ Product
โโโ Order
โโโ Payment
้ฎ้ข๏ผ
- ไปฃ็ ่ฆๅไธฅ้
- ๅ
จ้้จ็ฝฒ
- ๆฐๆฎๅบๅ็น
- ๆ ๆณ็ฌ็ซๆฉๅฑ
ๆๅๅ๏ผๅพฎๆๅกๆถๆ๏ผ
ๅพฎๆๅกๆถๆ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ API็ฝๅ
ณ โ
โ (่ทฏ็ฑใ้ๆตใ้ดๆ) โ
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโดโโโโโฌโโโโโโโโโฌโโโโโโโโโ
โ โ โ โ
โโโโโผโโโโโ โโโผโโโโโ โโโผโโโโโ โโโผโโโโโ
โ็จๆทๆๅกโ โๅๅ โ โ่ฎขๅ โ โๆฏไป โ
โ โ โๆๅก โ โๆๅก โ โๆๅก โ
โโโโโฌโโโโโ โโโฌโโโโโ โโโฌโโโโโ โโโฌโโโโโ
โ โ โ โ
โโโโโผโโโโโ โโโผโโโโโ โโโผโโโโโ โโโผโโโโโ
โUser DB โ โProductโ โOrder โ โPaymentโ
โ โ โ DB โ โ DB โ โ DB โ
โโโโโโโโโโ โโโโโโโโ โโโโโโโโ โโโโโโโโ
โโโโโโโโโโโโโโโโโโ
โ ๆถๆฏ้ๅMQ โ
โ (ๅผๆญฅ้ไฟก) โ
โโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโ
โ ้
็ฝฎไธญๅฟ โ
โ (็ปไธ้
็ฝฎ) โ
โโโโโโโโโโโโโโโโโโ
ๆๅกๆธ ๅ๏ผ
# ็จๆทๆๅก
user-service:
port: 8001
database: user_db
responsibilities:
- ็จๆทๆณจๅ็ปๅฝ
- ไธชไบบไฟกๆฏ็ฎก็
- ๅฐๅ็ฎก็
- ๆ้็ฎก็
# ๅๅๆๅก
product-service:
port: 8002
database: product_db
responsibilities:
- ๅๅๅฑ็คบ
- ๅ็ฑป็ฎก็
- ๅบๅญ็ฎก็
- ๅๅๆ็ดข
# ่ฎขๅๆๅก
order-service:
port: 8003
database: order_db
responsibilities:
- ่ฎขๅๅๅปบ
- ่ฎขๅๆฅ่ฏข
- ่ฎขๅๅๆถ
- ่ฎขๅ็ป่ฎก
# ๆฏไปๆๅก
payment-service:
port: 8004
database: payment_db
responsibilities:
- ๆฏไปๅค็
- ้ๆฌพๅค็
- ๆฏไปๅ่ฐ
- ่ดฆๅๆฅ่ฏข
โ ๏ธ ๅธธ่ง้ท้ฑ
้ท้ฑ1๏ผ่ฟๅบฆๆๅ
โ ้่ฏฏ๏ผๆๅๆๅ ๅไธชๅพฎๆๅก
็จๆทๆๅก็ปๅ๏ผ
โโโ ็จๆทๆณจๅๆๅก
โโโ ็จๆท็ปๅฝๆๅก
โโโ ็จๆทไฟกๆฏๆๅก
โโโ ็จๆทๅฐๅๆๅก
โโโ ็จๆทๆ้ๆๅก
โโโ ...
้ฎ้ข๏ผ
- ่ฟ็ปดๆๆฌๆดๅข
- ๆๅก่ฐ็จ้พ่ฟ้ฟ
- ๅๅธๅผไบๅกๅคๆ
- ๆง่ฝไธ้
โ
ๆญฃ็กฎ๏ผ้ๅบฆๆๅ
็จๆทๆๅก๏ผๆดๅ๏ผ๏ผ
โโโ ๆณจๅ็ปๅฝ
โโโ ไฟกๆฏ็ฎก็
โโโ ๅฐๅ็ฎก็
โโโ ๆ้็ฎก็
้ท้ฑ2๏ผๅฟฝ็ฅๆฐๆฎไธ่ดๆง
/**
* โ ้่ฏฏ๏ผๅฟฝ็ฅๅๅธๅผไบๅก
*/
public Order createOrder(CreateOrderRequest request) {
// 1. ๅๅปบ่ฎขๅ
Order order = orderRepository.save(new Order(...));
// 2. ๆฃๅๅบๅญ๏ผ่ฟ็จ่ฐ็จ๏ผ
productServiceClient.deductStock(productId, quantity);
// ๅฆๆ่ฟ้ๅคฑ่ดฅ๏ผ่ฎขๅๅทฒๅๅปบ๏ผไฝๅบๅญๆชๆฃๅ โ
// 3. ๆฃๅไฝ้ข๏ผ่ฟ็จ่ฐ็จ๏ผ
accountServiceClient.deductBalance(userId, amount);
// ๅฆๆ่ฟ้ๅคฑ่ดฅ๏ผ่ฎขๅๅทฒๅๅปบ๏ผๅบๅญๅทฒๆฃๅ๏ผไฝไฝ้ขๆชๆฃ โ
return order;
}
/**
* โ
ๆญฃ็กฎ๏ผไฝฟ็จSagaๆจกๅผ
*/
public Order createOrder(CreateOrderRequest request) {
// ไฝฟ็จSaga็ผๆ
SagaOrchestrator saga = new SagaOrchestrator();
// Step 1: ๅๅปบ่ฎขๅ
saga.addStep(
() -> orderRepository.save(new Order(...)),
order -> orderRepository.delete(order) // ่กฅๅฟ
);
// Step 2: ๆฃๅๅบๅญ
saga.addStep(
() -> productServiceClient.deductStock(productId, quantity),
() -> productServiceClient.addStock(productId, quantity) // ่กฅๅฟ
);
// Step 3: ๆฃๅไฝ้ข
saga.addStep(
() -> accountServiceClient.deductBalance(userId, amount),
() -> accountServiceClient.addBalance(userId, amount) // ่กฅๅฟ
);
// ๆง่กSaga
return saga.execute();
}
้ท้ฑ3๏ผๅพช็ฏไพ่ต
โ ้่ฏฏ๏ผๆๅก้ดๅพช็ฏไพ่ต
่ฎขๅๆๅก โ ็จๆทๆๅก
โ โ
โโโโโโโโโโโโโ
ๅพช็ฏไพ่ต๏ผ
โ
ๆญฃ็กฎ๏ผๅๅไพ่ต
่ฎขๅๆๅก โ ็จๆทๆๅก
่ฎขๅๆๅก โ ๅๅๆๅก
่ฎขๅๆๅก โ ๆฏไปๆๅก
็จๆทๆๅกใๅๅๆๅกใๆฏไปๆๅกไน้ดไธไบ็ธไพ่ต
๐ฏ ๆๅๆฃๆฅๆธ ๅ
ๆๅๅ่ฏไผฐ
โก ๅไฝๅบ็จๆฏๅฆ็็้ๅฐ็ถ้ข๏ผ
โก ๅข้ๆฏๅฆๆๅพฎๆๅก็ป้ช๏ผ
โก ๅบ็ก่ฎพๆฝๆฏๅฆๅฎๅ๏ผDockerใK8s๏ผ๏ผ
โก ็ๆงๅ่ญฆๆฏๅฆๅฐไฝ๏ผ
โก ๆฏๅฆๆDevOps่ฝๅ๏ผ
ๅฆๆ้ฝๆฏโ
๏ผๅฏไปฅๅผๅงๆๅ
ๅฆๆๆโ๏ผๅ
ๅฎๅๅบ็ก่ฎพๆฝ
ๆๅๅ้ช่ฏ
โก ๆๅก่พน็ๆฏๅฆๆธ
ๆฐ๏ผ
โก ๆๅก้ด่ฐ็จๆฏๅฆ้ข็น๏ผ
โก ๆฏๅฆๅญๅจๅพช็ฏไพ่ต๏ผ
โก ๆฐๆฎไธ่ดๆงๅฆไฝไฟ่ฏ๏ผ
โก ๆง่ฝๆฏๅฆๆปก่ถณ่ฆๆฑ๏ผ
โก ่ฟ็ปดๆๆฌๆฏๅฆๅฏๆง๏ผ
๐ ๆป็ป
ๆๅๅๅๆป็ป
1. ๅไธ่่ดฃ
ๆฏไธชๆๅกๅชๅไธไปถไบ
2. ้ซๅ
่ไฝ่ฆๅ
็ธๅ
ณๅ่ฝ่้๏ผๆๅก้ดๅฐไพ่ต
3. ไธๅก้ฉฑๅจ
ๆไธๅก่ฝๅๆๅ๏ผ้ๆๆฏๅฑ
4. ๆฐๆฎ่ชๆฒป
ๆฏไธชๆๅกๆฅๆ่ชๅทฑ็ๆฐๆฎๅบ
5. ็ฌ็ซ้จ็ฝฒ
ๆๅกๅฏไปฅ็ฌ็ซๅๅธไธ็บฟ
6. ๅข้่ชๆฒป
ไธไธชๅข้่ด่ดฃไธไธชๆๅคไธชๆๅก
7. ๆธ่ฟๅผๆๅ
ๅ
ๆๆ ธๅฟ๏ผๅๆ่พน็ผ
8. ้ฟๅ
่ฟๅบฆๆๅ
้ๅบฆๅณๅฏ๏ผๅซ่ตฐๆ็ซฏ
ๆๅๆนๆณ
| ๆนๆณ | ้็จๅบๆฏ | ๆจ่ๅบฆ |
|---|---|---|
| ๆไธๅก่ฝๅ | ้็จ | โญโญโญโญโญ |
| ๆๆฐๆฎๆๆๆ | ๆฐๆฎๅบๅ็ฆป | โญโญโญโญโญ |
| ๆๅข้็ปๆ | ๅคงๅข้ | โญโญโญโญ |
| ๆๅๅ้ข็ | ็จณๅฎๆง่ฆๆฑ้ซ | โญโญโญโญ |
่ฎฐๅฟๅฃ่ฏ
ๅพฎๆๅกๆๅๆๅๅ๏ผ
ๅไธ่่ดฃๆฏๆ ธๅฟใ
้ซๅ
่ไฝ่ฆๅ๏ผ
ไธๅก้ฉฑๅจไธๆๆฏใ
DDD้ขๅ้ฉฑๅจๅฅฝ๏ผ
้็ไธไธๆๆพ่พน็ใ
่ๅๅฎไฝๅๅผๅฏน่ฑก๏ผ
ๆฐๆฎ่กไธบ่ฆๅ
่ใ
ๆๅๆนๆณๆๅค็ง๏ผ
ไธๅก่ฝๅๆๅธธ็จใ
ๆฐๆฎๆๆๆ่ชๆฒป๏ผ
ๅข้็ปๆ่ฆๅน้
ใ
ๅบทๅจๅฎๅพ่ฆ่ฎฐ็ข๏ผ
ๆถๆๅๆ ็ป็ป็ปๆใ
้ฟๅ
่ฟๅบฆ็ปๆๅ๏ผ
้ๅบฆๆๆฏๆๅ
ณ้ฎ๏ผ
ๆๅไธๆฏ้ถๅผน่ฏ๏ผ
ๅบ็ก่ฎพๆฝ่ฆๅฎๅใ
็ๆงๅ่ญฆๅ่ฟ็ปด๏ผ
ไธไธช้ฝไธ่ฝๅฐ๏ผ
ๆฟไฝ ็ๅพฎๆๅก่พน็ๆธ ๆฐ๏ผๆถๆไผ้ ๅฆ่ฏ๏ผ ๐ชโจ