欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

那不是又把商品Sku这样的重型对象引入了这个 昆山软件开发 微服务?两个重型的对象在一个服务中?这样的微服务拆不开啊

点击: 次  来源:宝鼎软件 时间:2017-08-30

原文出处: JoeCao

上篇我们聊了微处事的DDD之间的干系,许多人照旧以为很虚幻,DDD那么巨大的理论,聚合根、值工具、事件溯源,到底我们该怎么入手呢?

实际上DDD和面向工具设计、设计模式等等理论有千丝万缕的接洽,假如不熟悉OOA、OOD,DDD也是利用欠好的。不外进修这些OO理论的时候,各人往往感受到无用武之地,因为大部门的Java措施员开产生涯是从进修J2EE经典的分层理论开始的(Action、Service、Dao),在这种分层理论中,我们根基没有啥时机利用那些所谓的“行为型”的设计模式,这里的焦点原因,就是J2EE经典分层的开拓方法是“贫血模子”。

Martin Fowler在他的《企业应用架构模式》这本书中提出了两种开拓方法“事务剧本”和“规模模子”,这两种开拓别离对应了“贫血模子”和“充血模子”。

事务剧本开拓模式

事务剧本的焦点是进程,可以认为大部门的业务处理惩罚都是一条条的SQL,事务剧本把单个SQL组织成为一段业务逻辑,在逻辑执行的时候,利用事务来担保逻辑的ACID。最典范的就是存储进程。虽然我们在平时J2EE经典分层架构中,常常在Service层利用事务剧本。

那不是又把商品Sku这样的重型工具引入了这个 昆山软件开拓 微处事?两个重型的工具在一个处事中?这样的微处事拆不开啊

利用这种开拓方法,工具只用于在各层之间传输数据用,这里的工具就是“贫血模子”,只有数据字段和Get/Set要领,没有逻辑在工具中。

我们以一个库存扣减的场景来举例:

  • 业务场景
  • 首先谈一下业务场景,一个下订单扣减库存(锁库存),这个很简朴
    先判定库存是否足够,然后扣减可销售库存,增加订单占用库存,然后再记录一个库存变换记录日志(作为凭证)

  • 贫血模子的设计
  • 首先设计一个库存表 Stock,有如下字段

    那不是又把商品Sku这样的重型工具引入了这个 昆山软件开拓 微处事?两个重型的工具在一个处事中?这样的微处事拆不开啊

    设计一个Stock工具(Getter和Setter省略)

    public class Stock {
    	private String spuId;
    	private String skuId;
    	private int stockNum;
    	private int orderStockNum;
    }
  • Service进口
  • 设计一个StockService,在个中的lock要领中写逻辑
    入参为(spuId, skuId, num)
    实现伪代码

    count = select stocknum from stock where spuId=xx and skuid=xx
    if count>num {
         update stock set stocknum=stocknum-num, orderstocknum=orderstocknum+num  where skuId=xx and spuId=xx
    } else {
         //库存不敷,扣减失败
    }
    insert stock_log set xx=xx, date= new Date()
  • ok,打完收工,假如做的好一些,可以把update和select count合一,这样可以操作一条语句完成自旋,办理并发问题(好手)。
  • 小结一下:
    有没有发明,在这个业务规模很是重要的焦点逻辑 — 下订单扣减库存中操纵进程中,Stock工具基础不消呈现,全部是数据库操纵SQL,所谓的业务逻辑就是由多条SQL组成。Stock只是CRUD的数据工具罢了,没逻辑可言。

  • 马丁福勒界说的“贫血模子”是反模式,面临简朴的小系统用事务剧本方法开拓没问题,业务逻辑巨大了,业务逻辑、各类状态散布在大量的函数中,维护扩展的本钱一下子就上来,贫血模子没有实施微处事的基本。
  • 固然我们用Java这样的面向工具语言来开拓,可是其实和进程型语言是一样的,所以许多环境下各人用数据库的存储进程来替代Java写逻辑反而结果会更好,(ps:用了Spring boot也不是微处事),
  • 规模模子的开拓模式

  • 规模模子是将数据和行为封装在一起,并与现实世界的业务工具相映射。种种具备明晰的职责分别,使得逻辑分手到符合工具中。这样的工具就是“充血模子” 。
  • 在详细实践中,我们需要明晰一个观念,就是规模模子是有状态的,他代表一个实际存在的事物。照旧接着上面的例子,我们设计Stock工具需要代表一种商品的实际库存,并在这个工具上面加上业务逻辑的要领
  • 那不是又把商品Sku这样的重型工具引入了这个 昆山软件开拓 微处事?两个重型的工具在一个处事中?这样的微处事拆不开啊

    这样做下单锁库存业务逻辑的时候,每次必需先从Repository按照主键load还原Inventory这个工具,然后执行对应的lock(num)要领改变这个Inventory工具的状态(属性也是状态的一种),然后再通过Repository的save要领把这个工具耐久化到存储去。