Spring Boot實現DDD的貨運Cargo微服務案例原始碼

banq發表於2019-09-27

使用Spring Boot平臺的Cargo Tracker應用程式的完整DDD實現。點選標題進入專案。

該實現採用基於微服務的架構風格,並使用以下技術

  • 以Spring Boot為核心
  • 用於微服務編排基礎架構的Spring Cloud流
  • RabbitMQ作為微服務訊息傳遞代理
  • Spring Data作為資料管理平臺

測試用例如下

  • 貨物已預訂從香港交付至紐約,交付期限為2019年9月28日 (bookingms實現)
  • 根據規格,通過分配行程相應地運輸貨物(routingms實現)
  • 貨物在行程的各個港口處理,最終由客戶索取(handlingms實現)
  • 客戶可以在任何時間使用唯一的跟蹤號跟蹤貨物(trackingms實現)

四個微服務分別實現上述四個用例需求:

1. 預訂微服務 bookingms :負責與貨物預訂相關的所有操作。在執行此微服務之前,必須設定mysql資料表和rabbit mq的設定(佇列的建立和繫結)

執行:java -jar bookingms-0.0.1-SNAPSHOT.jar

測試:http://localhost:8080/cargobooking

輸入預訂資訊資料:預訂貨櫃多少數量;出發點是香港,目的地是紐約,交付時間是2019-09-28:

{
    "bookingAmount": 100,
    "originLocation": "CNHKG",
    "destLocation" : "USNYC",
    "destArrivalDeadline" : "2019-09-28"
}

返回的Booking Id將需要放在後續其他請求中。

涉及到業務物件 Cargo、leg 和Location

2. 運輸微服務routingms:該MS負責與貨物路線相關的所有操作。涉及到業務物件voyage航線、運輸工具carrier_movement

3. 跟蹤微服務trackingms:該ms負責與貨物相關的所有跟蹤操作。涉及業務物件tracking_activity、tracking_handling_events

4. 裝卸微服務handlingms:該MS負責與貨物相關的所有裝卸操作。涉及活動有handling_activity。

模組

該原始碼每個微服務內部以六邊形架構設計模組:

微服務模組內部程式碼以六邊形架構設計:

  • domain:DDD領域模型,其中有aggregates、command、entities和valueobjects等子模組。
  • application:放置應用服務,命令和查詢服務分離在這裡。其中有CargoBookingCommandService,這是CQRS的命令服務;CargoBookingQueryService是CQRS查詢服務;CargoEventPublisherService是用於向RabbitMQ訊息系統傳送訊息的訊息釋出者;應用服務主要是與CQRS和訊息系統相關的工具或SPI類。
  • infrastructure: 放置資料庫倉儲、以及與訊息系統相關,這裡基礎設施包主要是直接與資料庫和訊息系統技術相關的SPI或幫助類。
  • interfaces:  REST API介面以及相關DTO或事件。這裡放置提供被呼叫的API相關類,包括DTO,領域模型物件不應該直接被外部呼叫引用,應該轉為DTO供外界使用。

相關參考:

使用六邊形架構解耦技術程式碼與業務邏輯

 

相關文章