Appearance
🚀 综合项目实战
项目实战概述
通过实际项目练习,综合运用所学知识。
本章采用“电商简化域”作为统一案例:用户、商品、订单、支付。包含领域建模、接口契约、数据库设计、分层架构、测试与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-domain、product-domain、order-service、payment-service、api-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_id、t_order.created_at组合索引;t_order_item.order_id;t_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 /livenessyaml
# Kubernetes 片段
resources:
limits:
cpu: "1"
memory: "512Mi"
env:
- name: JVM_OPTS
value: "-Xms512m -Xmx512m -XX:+UseG1GC -Xlog:gc"下一步
完成了综合项目实战后,可以继续学习:
- JVM 深入与性能调优 - 深入学习 JVM
- 并发编程高级 - 深入学习并发编程
💡 提示:通过实际项目练习,可以更好地理解和应用所学知识
