Skip to content

🚀 综合项目实战

项目实战概述

通过实际项目练习,综合运用所学知识。

本章采用“电商简化域”作为统一案例:用户、商品、订单、支付。包含领域建模、接口契约、数据库设计、分层架构、测试与CI、观测与部署。

用户下单主流程(高层):
Client → API 网关 → 订单服务(校验/定价/库存预占)→ 支付服务(下单/回调)→ 订单服务(状态流转)

项目示例

用户管理系统

java
// 用户实体
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
    
    // getter/setter
}

// 用户服务
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public User createUser(User user) {
        return userRepository.save(user);
    }
    
    public User getUser(Long id) {
        return userRepository.findById(id)
            .orElseThrow(() -> new UserNotFoundException(id));
    }
    
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
    
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

订单用例与状态机

[INIT] --create--> [PENDING_PAY] --pay_ok--> [PAID] --ship--> [SHIPPED] --confirm--> [DONE]
                                  └--pay_fail/cancel--> [CANCELED]

REST 接口契约(片段)

http
POST /api/orders
{ "userId": 1, "items": [{"sku":"SKU123","qty":2}] }

200 OK
{ "orderId": 1001, "status": "PENDING_PAY", "amount": 19900 }
http
POST /api/payments
{ "orderId":1001, "channel":"WECHAT" }
302 Redirect to pay_url

项目结构

project/
├── src/main/java/
│   ├── controller/
│   ├── service/
│   ├── repository/
│   ├── entity/
│   └── config/
├── src/main/resources/
│   ├── application.properties
│   └── application.yml
└── pom.xml

推荐按“分层 + 有界上下文”组织:user-domainproduct-domainorder-servicepayment-serviceapi-gateway

数据库设计(核心表)

t_user(id, name, email, created_at)
t_product(id, sku, name, price, stock)
t_order(id, user_id, amount, status, created_at)
t_order_item(id, order_id, product_id, sku, price, qty)
t_payment(id, order_id, channel, amount, status, trade_no)

索引建议:

  • t_product.sku 唯一;t_order.user_idt_order.created_at 组合索引;
  • t_order_item.order_idt_payment.order_id

核心流程(顺序图)

Client → API → OrderSvc:create
OrderSvc → ProductSvc: checkStock+price
OrderSvc → OrderRepo: save(PENDING_PAY)
Client → PaySvc:create
PayGateway → PaySvc: callback(OK)
PaySvc → OrderSvc: markPaid

关键实现片段

java
// 领域服务:订单创建(校验/定价/库存预占)
@Transactional
public Order create(CreateOrder cmd){
  Money amount = pricing(cmd.items());
  preReserveStock(cmd.items());
  return repo.save(Order.pending(cmd.userId(), amount));
}
java
// 防止超卖的库存预占(示例:悲观锁/乐观锁二选一)
int updated = jdbc.update("update t_product set stock=stock-? where sku=? and stock>=?", qty, sku, qty);
if (updated==0) throw new BusinessException("库存不足");
java
// 支付回调幂等处理
@Transactional
public void onPayCallback(String orderId, String tradeNo){
  if (payRepo.existsByTradeNo(tradeNo)) return; // 幂等
  payRepo.save(...);
  orderRepo.markPaid(orderId);
}

测试与 CI

测试金字塔:单元(最多)→ 集成(Repo/外部依赖)→ E2E(关键链路)
java
@DataJpaTest
class OrderRepoTest { /* repository 集成测试 */ }

@SpringBootTest
@AutoConfigureMockMvc
class OrderApiTest { /* API 层集成测试 */ }

CI 步骤:编译 → 单元测试 → 集成测试(容器化依赖,用 Testcontainers)→ 生成覆盖率 → 构建镜像。

可观测性(日志/指标/追踪)

日志:结构化(JSON)
指标:QPS、P95 延迟、错误率、库存失败率、支付回调幂等命中率
追踪:TraceId 跨服务传递(网关注入)

部署与配置

多阶段镜像:
1) 构建镜像(mvn -T 1C -DskipTests package)
2) 运行镜像(jlink 精简 JRE,可选)
滚动发布:健康检查 /readiness /liveness
yaml
# Kubernetes 片段
resources:
  limits:
    cpu: "1"
    memory: "512Mi"
env:
  - name: JVM_OPTS
    value: "-Xms512m -Xmx512m -XX:+UseG1GC -Xlog:gc"

下一步

完成了综合项目实战后,可以继续学习:


💡 提示:通过实际项目练习,可以更好地理解和应用所学知识