基于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架构开始应用的开发和设计。