基于COLA架构创建运输微服务应用和DDD领域建模


基于COLA架构(Clean Object-oriented and Layered Architecture,整洁面向对象分层架构)DDD(Domain Driven Design,领域驱动设计)思想,我们初步完成了包裹预订服务的开发,包括包裹预订和包裹查询服务等等。接下来,继续进行DDD经典项目的开发工作。本文将创建运输微服务routingms,该服务负责与货物路线相关的所有操作,包括获取路线的行程、维护航线(Maintain Voyages)等等。 创建该项目的目的,是为了演示通过防腐层(ACL)进行微服务之间的调用。防腐层(Anti-Corruption Layer),简单说,就是应用不要直接依赖外域的信息,要把外域的信息转换成自己领域上下文(Context)的实体再去使用,从而实现本域和外部依赖的解耦。   一、基于COLA项目模板创建运输微服务 创建新的微服务项目cola-cargo-routingms,和之前创建cola-cargo-bookingms项目的过程基本是一样的。 首先,选择左侧的Maven项目类型,然后选择右侧的cola项目模板,如图所示: 输入项目名称、位置、GroupId和ArtifactId等等,如图所示: 最后,创建完成的项目结构如下图所示: 现在,我们对COLA架构比较熟悉了,就可以删除项目创建过程中,自动产生的一些示例代码。如下图所示,我们可以删除adapter模块中的示例adapter和controller类。 其他模块中的示例代码,也可以自行删除。     二、运输业务域的领域建模 基于战略设计阶段的输出,运输域的聚合根为业务实体Voyage(航线),还有CarrierMovement(运输过程)等等。 如图所示,在domain模块中创建domain.model.aggregates和domain.model.valueobjects 子包,然后分别创建聚合根Voyage类和实体类CarrierMovement。   Voyage类代码如下所示: @Data public class Voyage {     private Long id;     private String voyageNumber;     private List carrierMovements = Collections.emptyList(); } Voyage类包含航线id和航线编号信息。   CarrierMovement类代码如下所示: @Data public class CarrierMovement {     private Long id;     @JSONField(format="yyyy-MM-dd")     private Date arrivalDate;     @JSONField(format="yyyy-MM-dd")     private Date departureDate;     private String arrivalLocation;     private String departureLocation; } CarrierMovement类包含对象标识符id、出发日期departureDate、到达日期arrivalDate、出发位置编号departureLocation、到达位置编号arrivalLocation等等。   三、创建数据库和数据模型 首先,执行如下SQL脚本,创建routingmsdb数据库。 # 创建数据库 create database routingmsdb;   然后,在routingmsdb数据库中创建数据表:voyage(航程)、carrier_movement(航程详细信息)。执行如下SQL脚本即可: ##Voyage Table DDL CREATE TABLE `voyage` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `voyage_number` varchar(20) NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;   ##Carrier Movement Table DDL - CREATE TABLE `carrier_movement` (   `Id` int(11) NOT NULL AUTO_INCREMENT,   `arrival_location_id` varchar(100) DEFAULT NULL,   `departure_location_id` varchar(100) DEFAULT NULL,   `voyage_id` int(11) DEFAULT NULL,   `arrival_date` date DEFAULT NULL,   `departure_date` date DEFAULT NULL,   PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1358 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 接着,为了演示工作正常,可以初始化一些数据到上述表中。 ### Data to ensure Routing works fine -> insert voyage (Id,voyage_number) values(3,'0100S'); insert voyage (Id,voyage_number) values(4,'0101S'); insert voyage (Id,voyage_number) values(5,'0102S'); insert into carrier_movement (Id,arrival_location_id,departure_location_id,voyage_id,arrival_date,departure_date)         values (1355,'CNHGH','CNHKG',3,'2021-03-28','2019-08-25'); insert into carrier_movement (Id,arrival_location_id,departure_location_id,voyage_id,arrival_date,departure_date)              values (1356,'JNTKO','CNHGH',4,'2021-04-10','2019-09-01'); insert into carrier_movement (Id,arrival_location_id,departure_location_id,voyage_id,arrival_date,departure_date)         values (1357,'USNYC','JNTKO',5,'2021-04-25','2019-09-15’);   现在,我们完成了运输微服务应用的领域模型设计和数据模型设计。下一章,我们将基于COLA架构开始应用的开发和设计。