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")

  

  

 

posted on 2019-09-24 22:44  溪水静幽  阅读(1176)  评论(0)    收藏  举报