基於COLA架構建立運輸微服務應用和DDD領域建模

Rickie發表於2021-07-13
基於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專案模板,如圖所示:
基於COLA架構建立運輸微服務應用和DDD領域建模
輸入專案名稱、位置、GroupId和ArtifactId等等,如圖所示:
基於COLA架構建立運輸微服務應用和DDD領域建模
最後,建立完成的專案結構如下圖所示:
基於COLA架構建立運輸微服務應用和DDD領域建模
現在,我們對COLA架構比較熟悉了,就可以刪除專案建立過程中,自動產生的一些示例程式碼。如下圖所示,我們可以刪除adapter模組中的示例adapter和controller類。
基於COLA架構建立運輸微服務應用和DDD領域建模
其他模組中的示例程式碼,也可以自行刪除。
 
 
二、運輸業務域的領域建模
基於戰略設計階段的輸出,運輸域的聚合根為業務實體Voyage(航線),還有CarrierMovement(運輸過程)等等。
如圖所示,在domain模組中建立domain.model.aggregates和domain.model.valueobjects 子包,然後分別建立聚合根Voyage類和實體類CarrierMovement。
基於COLA架構建立運輸微服務應用和DDD領域建模
 
Voyage類程式碼如下所示:
@Data
public class Voyage {
    private Long id;
    private String voyageNumber;
    private List<CarrierMovement> 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;
基於COLA架構建立運輸微服務應用和DDD領域建模
接著,為了演示工作正常,可以初始化一些資料到上述表中。
### 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');
基於COLA架構建立運輸微服務應用和DDD領域建模
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架構建立運輸微服務應用和DDD領域建模
 
現在,我們完成了運輸微服務應用的領域模型設計和資料模型設計。下一章,我們將基於COLA架構開始應用的開發和設計。

相關文章