04 将订单微服务与商品微服务分别拆分为多模块
代码改造:
- 问题一:将数据表映射的实体类暴露出去了,建议最好再封装一层
- 问题二:同一个对象在不同微服务之间重复定义
- 问题三: 将对方的服务定义到自己的服务中
order和product 可能是两个小组来开发,而在order微服中将product微服务的请求的url写到自己的微服务中,将对方的服务定义到自己的服务中是不是不太合理? 应该自己管理自己的对外接口,暴露出去供外部调用者使用。

拆分原则:将Product划分为3个子模块
- product Server : 所有业务逻辑
- product Client : 对外暴露的接口(目前有查询商品和扣减库存)
- product Common : 公用的对象
Product Common
主要是解决问题一将数据表映射的实体类暴露出去,建议最好再封装一层
pom.xml

@Data public class DecreaseStockInput { private String productId; private Integer productQuantity; public DecreaseStockInput() { } public DecreaseStockInput(String productId, Integer productQuantity) { this.productId = productId; this.productQuantity = productQuantity; } } @Data public class ProductOutput { private String productId; private String productName; private BigDecimal productPrice; private Integer productStock; private String productDescription; private String productIcon; /** 状态, 0正常1下架. */ private Integer productStatus; private Integer categoryType; }
product client
将属于product微服务的ProductClient定义在该模块中
@FeignClient("product-server")
public interface ProductClient {
@PostMapping("/product/productListForOrder")
List<ProductOutput> getProductListForOrder(List<String> productIds);
/**
* 不用CartDTO,因为它属于Order工程,这里自己在ProductCommon中自己维护一个DTO类
* DecreaseStockInput
* @param decreaseStockInputs
*/
@PostMapping("/product/decreaseProduct")
void decreaseProduct(List<DecreaseStockInput> decreaseStockInputs);
}
product server
Order微服务的改造
要调用商品微服务来查询商品和扣减库存,所以要依赖product-client包
<dependency>
<groupId>com.artisan</groupId>
<artifactId>product-client</artifactId>
</dependency>
为了让order server微服务启动时实例化Feign接口,需要配置扫描基包 (因为他们不在一个工程的同一级或者子孙级目录中)
@EnableFeignClients(basePackages="com.artisan.product.client")
立志如山 静心求实
浙公网安备 33010602011771号