文章目录Spring Cloud 学习与实践4订单服务开发1. 本章目标2. cloud-order 模块结构3. 订单表设计4. DTO 设计5. 订单实体6. Mapper7. Service 接口与实现8. Controller9. order.http 测试10. 故障演练总结Spring Cloud 学习与实践4订单服务开发本章目标开发订单服务cloud-order实现本地订单创建和查询接口并通过故障演练展示当前版本的设计缺陷为后续 OpenFeign 调用用户和商品服务、库存扣减打基础。1. 本章目标本章主要完成搭建cloud-order模块创建订单表t_order创建订单实体Order创建 DTOCreateOrderRequest创建 Mapper、Service 和 Controller实现本地创建订单逻辑订单查询接口故意演练不校验用户、商品和价格总结当前缺陷并引出后续服务间远程调用必要性2. cloud-order 模块结构cloud-order ├── pom.xml └── src ├── main │ ├── java │ │ └── com.example.cloud.order │ │ ├── CloudOrderApplication.java │ │ ├── controller │ │ │ └── OrderController.java │ │ ├── dto │ │ │ └── CreateOrderRequest.java │ │ ├── entity │ │ │ └── Order.java │ │ ├── mapper │ │ │ └── OrderMapper.java │ │ └── service │ │ ├── OrderService.java │ │ └── impl │ │ └── OrderServiceImpl.java │ └── resources │ └── application.yml └── test └── http └── order.http3. 订单表设计在数据库cloud_demo中执行DROPTABLEIFEXISTSt_order;CREATETABLEt_order(idBIGINTNOTNULLAUTO_INCREMENTCOMMENT订单ID,user_idBIGINTNOTNULLCOMMENT用户ID,product_idBIGINTNOTNULLCOMMENT商品ID,product_nameVARCHAR(128)NOTNULLCOMMENT下单时的商品名称快照,amountDECIMAL(10,2)NOTNULLCOMMENT订单金额,statusTINYINTNOTNULLDEFAULT0COMMENT订单状态0待处理1已完成2已取消,create_timeDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT创建时间,PRIMARYKEY(id),KEYidx_user_id(user_id),KEYidx_product_id(product_id))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT订单表;示例数据可通过接口创建。4. DTO 设计CreateOrderRequest.javaDatapublicclassCreateOrderRequest{privateLonguserId;privateLongproductId;privateStringproductName;privateBigDecimalamount;}说明DTO 与实体分离防止客户端直接控制数据库字段便于后续 OpenFeign 调用重构接口参数5. 订单实体Order.javaDataTableName(t_order)publicclassOrder{TableId(typeIdType.AUTO)privateLongid;privateLonguserId;privateLongproductId;privateStringproductName;privateBigDecimalamount;privateIntegerstatus;privateLocalDateTimecreateTime;}6. MapperOrderMapper.javaMapperpublicinterfaceOrderMapperextendsBaseMapperOrder{}7. Service 接口与实现OrderService.javapublicinterfaceOrderServiceextendsIServiceOrder{OrdercreateOrder(CreateOrderRequestrequest);}OrderServiceImpl.javaServicepublicclassOrderServiceImplextendsServiceImplOrderMapper,OrderimplementsOrderService{OverrideTransactional(rollbackForException.class)publicOrdercreateOrder(CreateOrderRequestrequest){if(requestnull||request.getUserId()null||request.getProductId()null||request.getProductName()null||request.getAmount()null){thrownewBizException(ErrorCode.PARAM_ERROR,参数不完整);}OrderordernewOrder();order.setUserId(request.getUserId());order.setProductId(request.getProductId());order.setProductName(request.getProductName());order.setAmount(request.getAmount());order.setStatus(0);booleansuccesssave(order);if(!success){thrownewBizException(ErrorCode.BIZ_ERROR,创建订单失败);}returnorder;}}8. ControllerOrderController.javaRestControllerRequestMapping(/orders)RequiredArgsConstructorpublicclassOrderController{privatefinalOrderServiceorderService;PostMappingpublicResultOrdercreate(RequestBodyCreateOrderRequestrequest){returnResult.success(orderService.createOrder(request));}GetMapping(/{id})publicResultOrdergetById(PathVariableLongid){OrderorderorderService.getById(id);if(ordernull){returnResult.fail(ErrorCode.NOT_FOUND,订单不存在);}returnResult.success(order);}}9. order.http 测试完整内容↓### 正常创建订单POSThttp://localhost:9400/orders Content-Type:application/json{userId:1,productId:1,productName:机械键盘,amount:299.00}### 查询订单详情GEThttp://localhost:9400/orders/1### 查询不存在的订单GEThttp://localhost:9400/orders/999### 参数错误缺少用户IDPOSThttp://localhost:9400/orders Content-Type:application/json{productId:1,productName:机械键盘,amount:299.00}### 故障演练不存在的用户仍然可以创建订单POSThttp://localhost:9400/orders Content-Type:application/json{userId:999999,productId:1,productName:机械键盘,amount:299.00}### 故障演练不存在的商品仍然可以创建订单POSThttp://localhost:9400/orders Content-Type:application/json{userId:1,productId:999999,productName:不存在的商品,amount:0.01}### 故障演练客户端可以伪造商品价格POSThttp://localhost:9400/orders Content-Type:application/json{userId:1,productId:1,productName:机械键盘,amount:0.01}包含正常订单创建查询订单用户不存在、商品不存在、伪造金额的订单创建示例POST http://localhost:9400/orders Content-Type: application/json { userId: 999999, productId: 1, productName: 机械键盘, amount: 299.00 }结果仍然创建成功说明本章故意保留的缺陷用户 ID 可以伪造商品 ID 可以伪造商品名称和金额可以伪造库存未扣减测试后数据库如图↓10. 故障演练总结本章订单服务完全本地落库故意不校验用户、商品、价格方便演练后续服务间调用为第 5~7 章引出 OpenFeign、远程用户校验、商品校验及库存扣减逻辑做准备