文章目录前言一、微服务调用链二、推荐命名请求对象三、Feign 接口示例stock-api 模块请求 DTO返回 DTO四、微服务 DTO 不要放在哪五、不要直接暴露 Entity / DO六、DTO 要分“入参”和“出参”七、统一返回结构八、版本兼容很重要九、订单服务调用用户服务示例十、推荐目录结构一句话总结前言微服务下 DTO 设计核心原则对外稳定对内隔离禁止直接复用数据库对象。一、微服务调用链order-service ↓ Feign / RPC user-service stock-service coupon-service pay-service服务之间传的对象一般就是RequestDTO / ResponseDTO二、推荐命名请求对象CreateOrderRequestDeductStockRequestUserQueryRequest或者CreateOrderDTODeductStockDTO我更推荐微服务接口用XXXRequest / XXXResponse因为语义更清楚。三、Feign 接口示例stock-api 模块FeignClient(namestock-service)publicinterfaceStockClient{PostMapping(/api/stock/deduct)StockDeductResponsededuct(RequestBodyStockDeductRequestrequest);}请求 DTOpublicclassStockDeductRequest{privateLongskuId;privateIntegercount;privateStringrequestId;}返回 DTOpublicclassStockDeductResponse{privateBooleansuccess;privateStringcode;privateStringmessage;}四、微服务 DTO 不要放在哪不要放在order-service 内部 domain 包 stock-service 内部 entity 包否则其他服务依赖会很乱。推荐建独立 API 包stock-api ├── client │ └── StockClient.java ├── dto │ ├── StockDeductRequest.java │ └── StockDeductResponse.java然后order-service 依赖 stock-api stock-service 实现 stock-api五、不要直接暴露 Entity / DO错误示例PostMapping(/user/get)UserDOgetUser(RequestBodyUserDOuser);问题数据库结构泄露 字段一改调用方全炸 可能暴露敏感字段 服务边界不清晰正确UserQueryRequestUserResponse六、DTO 要分“入参”和“出参”不要一个对象到处复用。错误UserDTO同时用于创建、修改、查询、返回正确UserCreateRequestUserUpdateRequestUserQueryRequestUserResponse因为不同场景字段不一样创建需要 password 返回不能有 password 修改可能只传 nickname 查询可能只传 userId/mobile七、统一返回结构微服务之间建议统一响应publicclassRpcResultT{privatebooleansuccess;privateStringcode;privateStringmessage;privateTdata;}例如RpcResultUserResponsegetUser(UserQueryRequestrequest);八、版本兼容很重要DTO 一旦被其他服务依赖就不能随便改。推荐规则新增字段可以 删除字段谨慎 改字段类型禁止 改字段含义禁止 字段重命名基本等于破坏兼容如果必须大改/api/v2/user/query UserQueryV2Request UserV2Response九、订单服务调用用户服务示例ServicepublicclassOrderService{privatefinalUserClientuserClient;publicOrderService(UserClientuserClient){this.userClientuserClient;}publicvoidcreateOrder(LonguserId){RpcResultUserResponseresultuserClient.getUser(newUserQueryRequest(userId));if(!result.isSuccess()){thrownewRuntimeException(查询用户失败);}UserResponseuserresult.getData();// 创建订单逻辑}}十、推荐目录结构user-api ├── client │ └── UserClient.java ├── request │ └── UserQueryRequest.java ├── response │ └── UserResponse.java └── result └── RpcResult.java user-service ├── controller ├── service ├── domain ├── mapper └── converter order-service ├── controller ├── service └── client一句话总结微服务 DTO 是服务契约不是数据库对象Feign/RPC 接口要用独立 API 模块维护 Request/Response并注意版本兼容。