聚合,字面意思就很简洁明了,是把领域对象聚合在一块儿,并维护领域对象之间的关系。 架构
聚合其实就是一个在不改变原有实体的状况下将若干实体汇集起来。微服务
在开发中不少实体有着多个一对一,一对多的关联,聚合是为了尽量减小这些关联,用作解耦合,也同时能够清晰的反应业务。设计
同时行外人士对系统的认知也是聚合,使用者不会考虑是用户仍是订单,若是订单消失,那么保存这个订单的信息所在的意义微乎其微。对象
举个例子,实体用户、订单、商品组成一个聚合,这个聚合是为了表达用户与订单的关系的,用户购买商品生成订单,放在一个聚合内,订单是这个聚合根,订单中保存着用户id和商品id。可代入上图理解。blog
上述例子是聚合吗?实际上是存在问题的,若是商品涨价了,商品下架了,商品更名了用户看起来岂不是很迷惑?因此并非随便几个实体就能组成聚合的,聚合要保证不变性和一致性,不变性个人理解是不会轻易改变,若是是聚合根本身改变的那固然是能够的,因此要保证一致性,在这个聚合内,不管怎么改变,必须是强一致的。开发
我认为聚合在代码内部的体现其实也是一个实体,甚至能够表明一个领域,但这不是说聚合是领域,准确来讲领域能够是聚合,可是聚合不必定是领域。为何聚合不必定是领域呢?若是有太多太多的实体组成一个聚合,那么这个聚合为了保证一致性和不变性是很是困难的,因此聚合要尽量的设计的小。效率
聚合既能够表达一个领域,同时也能够表达边界,限制边界。请求
现现在微服务普遍运用,因此我有一个疑问,在微服务架构中如何聚合。在网上看到这么一个例子用户购买电影票,须要同时访问用户微服务和电影微服务。若是让用户直接发请求给各个服务,那其中效率无疑是很低下的。可是能够用一种聚合微服务技术,手机发送请求给聚合微服务,聚合微服务再给电影和用户微服务发请求,再将电影票信息响应给用户。由于聚合微服务、电影微服务、用户微服务通常会在一个局域网内,因此效率会很高,不须要用户发送两个请求。im
其实这就很好的解释了DDD中聚合这一律念。聚合的缘由其一是为了提升效率,其次也能明确的表达某一业务。聚合在DDD中是很是重要的,由于DDD自己的思想就是针对业务,针对领域,这对使用和理解DDD都很方便。技术