精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么需要CQRS,它能解決什么問題?

開發 架構
本文詳細介紹了CQRS模式的基本概念及其實現方式,重點分析了在DailyMart項目中如何通過實踐CQRS架構對訂單模塊進行改造。希望通過本文的講解,能夠幫助你更好地理解CQRS模式的應用場景、優勢及實施細節,提升系統架構的可維護性和擴展性。

為什么需要CQRS?

圖片圖片

在領域驅動設計(DDD)中,業務邏輯的基本處理流程通常如下:接口層接收業務請求,進行參數校驗后,調用應用服務執行業務編排。在應用服務中,加載聚合根,接著由領域對象處理業務邏輯,最后通過基礎設施層更新領域對象。

然而,在實際開發中,我們經常遇到一些復雜的查詢需求,比如分頁查詢、非業務標識符的條件查詢以及多表關聯查詢。這些需求往往涉及到多個聚合根,并且在查詢時不一定需要加載完整的聚合根。

例如,在之前的章節中,我通過擴展倉儲接口來支持條件查詢,如訂單服務的倉儲接口定義:

public interface OrderRepository extends Repository<TradeOrder, OrderId> {
    
    /**
     * 根據訂單編號查詢訂單
     * @param orderSn 訂單號
     * @return 訂單聚合
     */
    TradeOrder findOrderByTransaction(String customerId);
    
    /**
     * 修改訂單狀態
     * @author jam
     * @date 2023/12/19 9:07
     * @param orderSn 訂單編號
     * @param status 訂單狀態
     */
    void changeStatus(String orderSn, OrderStatusEnum status);
    
    /**
     * 分頁查詢
     * @param customerId 用戶ID
     * @param pageRequest 分頁請求體
     */
    PageResponse<TradeOrder> pageQuery(Long customerId, PageRequest pageRequest);
}

這個設計存在一定問題:倉儲接口的職責變得不再單一。根據DDD的設計理念,Repository主要負責維護聚合根的生命周期,然而在這里,它同時承擔了分頁查詢職能,這與其單一職責原則相悖。每當我們需要新增查詢功能時,都需要在領域層的倉儲接口中增加新方法,導致接口變得越來越復雜。

為了保持倉儲接口的單一職責,我們需要將查詢操作與聚合根的生命周期管理分離。CQRS(命令查詢職責分離) 就是為了解決這個問題。

查詢與聚合根的關系

聚合根代表了事務的一致性邊界,倉儲接口需要確保在加載時獲取聚合根的完整狀態以保證數據的準確性。然而,許多查詢操作,如分頁查詢和條件查詢,往往只需要讀取聚合根的一部分數據,而不需要修改它的狀態。在這種情況下,加載整個聚合根的狀態不僅會導致不必要的性能開銷,還可能使查詢變得更復雜和低效。

因此,在只查詢而不修改的場景下,其實沒必要完整的加載聚合根。接下來,我們將引入CQRS來解決這個問題。

什么是CQRS?

CQRS(Command Query Responsibility Segregation,命令查詢職責分離)是一種架構模式,它通過將修改操作(命令,Command)與查詢操作(查詢,Query)分開,使用不同的模型來分別處理這兩類操作,從而實現命令與查詢的分離。

在領域驅動設計(DDD)中引入CQRS后,應用層的職責被明確分為兩個部分:

  • 命令應用服務(Command Application Service):負責處理寫操作,如創建、更新和刪除。
  • 查詢應用服務(Query Application Service):負責處理讀操作,包括數據查詢和展示。

引入CQRS后,命令和查詢操作在應用層使用不同的模型進行處理:

  • 在命令應用服務中,依舊使用領域模型來執行業務操作。通過倉儲(Repository)加載完整的聚合根,并由聚合根修改其內部狀態來實現業務邏輯。
  • 在查詢應用服務中,使用專門的數據模型來處理查詢操作。這些數據模型直接從數據庫讀取數據,并將結果展示給用戶。查詢操作不涉及領域邏輯,只關注高效的數據檢索和展示,可以直接使用基礎設施層的額數據模型和ORM接口來完成操作。

實際上,CQRS并非DDD獨有的概念,無論是否使用領域驅動設計,都會推薦采用CQRS架構。具體而言,在三層架構中,可以將Service層拆分為不同職責的模型;在DDD的四層架構中,則將應用服務(Application Service)拆分為命令服務和查詢服務。

CQRS的實現

CQRS的實現通常分為相同數據源模式和異構數據源模式,兩者適用于不同的業務場景。

相同數據源的CQRS

在這種模式下,命令服務和查詢服務共用同一套數據源。命令操作通過領域模型完成,查詢操作則通過數據模型實現。由于數據源相同,CQRS的實現相對簡單,且能夠滿足大部分業務場景需求。

如下圖所示:

圖片圖片

異構數據源的CQRS

雖然相同數據源模式可以滿足大多數業務需求,但在某些場景下,為了優化性能、解決特定問題,可能會引入其他數據存儲中間件,將業務數據的副本存儲在新的數據源中,從而形成異構數據源。這時,命令操作和查詢操作將分別由不同的數據源承接。

示例:

以訂單查詢為例,為了提高查詢性能,訂單領域在創建訂單后,可以通過 binlog 將 MySQL 數據同步到 Elasticsearch,查詢操作則直接從 Elasticsearch 獲取數據。這就是典型的異構數據源 CQRS 模式。

圖片圖片

注意:異構數據源不一定是兩種不同的數據中間件。例如,即使兩個數據源都是 MySQL,只要表結構不同,也可以被視為異構數據源。

部署方式

在實際應用中,CQRS 架構可以根據項目需求靈活部署:

  1. 同一應用內實現:命令服務和查詢服務共存于同一個應用中,適用于簡單場景。
  2. 物理隔離部署:將命令服務和查詢服務拆分為不同的應用,獨立部署,適用于高并發、大規模業務場景。

在Dailymart改造CQRS模式

以訂單模塊為例,看看如何實踐CQRS模式,以下為實踐步驟:

1、拆分應用服務

將原應用服務接口OrderService拆成兩個服務,分別是OrderCommandService 和 OrderQueryService,將分頁接口定義遷移到OrderQueryService中,OrderCommandService 中只包含聚合的加載和更新操作。

public interface OrderQueryService {

    /**
     * 分頁查詢
     * @author jam
     * @date 2024/12/17 14:56
     */
    PageResponse<OrderRespDTO> findListByUserId(OrderPageQueryDTO pageRequest);

}

public interface OrderCommandService {
    /**
     * 創建訂單
     * @param orderCreateRequest 創建訂單參數
     */
    String createOrder(OrderCreateRequest orderCreateRequest);

    /**
     * 訂單發貨
     */
    String ship(String orderSn);

    /**
     * 加載訂單詳情
     */
    OrderRespDTO getOrderBySn(String orderSn);
}

2、實現查詢服務: 使用 MyBatis-Plus 進行分頁查詢并轉換 DO 到 DTO 

在查詢服務中,我們直接使用 MyBatis-Plus 提供的 selectPage 方法進行分頁查詢,并通過 OrikaUtils.convertList 方法將數據庫對象DO轉換為DTO。

@Service
@Slf4j
public class OrderQueryServiceImpl implements OrderQueryService {

    @Resource
    private OrderMapper orderMapper;


    @Override
    public PageResponse<OrderRespDTO> findListByUserId(OrderPageQueryDTO pageRequest) {

        Page<OrderDO> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());

        LambdaQueryWrapper<OrderDO> queryWrapper = Wrappers.lambdaQuery(OrderDO.class).eq(OrderDO::getCustomerId, pageRequest.getCustomerId());

        Page<OrderDO> selectedPage = orderMapper.selectPage(page, queryWrapper);

        List<OrderDO> records = selectedPage.getRecords();

        Map<String,String> refMap = new HashMap<>(1);
        //map key 放置 源屬性,value 放置 目標屬性
        refMap.put("orderId","id");

        //Do -> Dto
        List<OrderRespDTO> pageList = OrikaUtils.convertList(records, OrderRespDTO.class,refMap);

        return new PageResponse<>(pageRequest.getCurrent(), pageRequest.getSize(), selectedPage.getTotal(), pageList);

    }

}

3、刪除倉儲接口中關于分頁查詢的接口

Repository的職責應集中在持久化和聚合的加載上。分頁查詢不應包含在倉儲接口中。通過移除分頁查詢方法來簡化倉儲接口的設計,使其專注于聚合根的生命周期管理。

public interface OrderRepository extends Repository<TradeOrder, OrderId> {
    
    /**
     * 根據訂單編號查詢訂單
     * @param orderSn 訂單號
     * @return 訂單聚合
     */
    TradeOrder load(String orderSn);
    

}

4、修改訂單接口層的調用方式,分別使用不同的應用服務完成業務操作。

@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Tag(name = "OrderController", description = "C端訂單模塊")
public class OrderController {
    private final OrderCommandService orderCommandService;

    private final OrderQueryService orderQueryService;

 ...
    
}

小結

本文詳細介紹了CQRS模式的基本概念及其實現方式,重點分析了在DailyMart項目中如何通過實踐CQRS架構對訂單模塊進行改造。希望通過本文的講解,能夠幫助你更好地理解CQRS模式的應用場景、優勢及實施細節,提升系統架構的可維護性和擴展性。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2022-04-04 07:51:32

Web框架

2022-06-29 07:49:42

云存儲架構DevOps

2020-06-15 08:06:25

ES數據

2019-04-26 13:01:16

ServiceMesh微服務架構

2020-03-23 07:15:35

物聯網IOT物聯網技術

2021-05-06 07:53:21

MySQLFigure 8Raft

2021-07-16 06:56:50

邊緣計算分布式

2025-08-28 08:02:00

2020-05-22 10:02:43

Python語言編程

2021-10-16 12:52:17

Builder模式生成器

2021-08-02 15:23:16

Windows 10Windows微軟

2024-12-26 09:20:51

2024-11-04 10:28:08

2021-05-11 10:56:07

DevOps開發工具

2011-11-30 15:28:32

在線協作系統

2024-12-09 09:30:00

適配器模式設計模式代碼

2011-08-30 10:54:48

遠程服務器服務器管理工具服務器虛擬化

2019-04-03 16:24:02

電腦重啟Windows 10

2019-04-03 09:44:37

技術研發開發

2023-11-08 14:03:47

數據可視化數字化轉型
點贊
收藏

51CTO技術棧公眾號

国产又粗又猛又爽又黄的| 美女福利视频网| 亚洲一二三四| 国产精品国模大尺度视频| 4444kk亚洲人成电影在线| 亚洲综合一二三| 国产91精品对白在线播放| 欧美色精品在线视频| 国产又粗又猛又爽又黄的网站 | 蜜桃视频在线观看一区| 久久成人综合视频| 永久免费看mv网站入口78| 国产精品亚洲综合在线观看| 五月天一区二区| 亚洲一区二区三区涩| 日本黄色三级视频| 麻豆国产欧美日韩综合精品二区| 欧美激情久久久久| 毛片视频免费播放| 欧洲在线一区| 日韩精品一区二区三区视频| 中文字幕第36页| 成人一级福利| 亚洲三级久久久| 日韩av电影免费在线观看| 亚洲av无码乱码国产精品久久| 日韩二区三区四区| 2019最新中文字幕| 久久久精品人妻一区二区三区四| 日韩av在线播放网址| 日韩成人高清在线| 中文字幕1区2区| 亚洲国产天堂| 欧美在线一二三四区| 男人添女人下面高潮视频| 国产午夜精品久久久久免费视| 久久影视一区二区| 国产超碰91| 国产特黄一级片| 麻豆精品国产传媒mv男同 | 中文字幕制服丝袜在线| 久色视频在线| eeuss鲁片一区二区三区在线观看| 91精品视频在线播放| 最近国语视频在线观看免费播放| 午夜在线a亚洲v天堂网2018| 久久人人爽人人爽人人片av高请| 精品国产乱码久久久久久鸭王1| 日韩电影一区| 在线电影中文日韩| 亚洲第一综合网| 国产一区二区三区日韩精品| 亚洲精品有码在线| 女~淫辱の触手3d动漫| 视频小说一区二区| 日韩精品在线观看网站| 欧美无人区码suv| 久久香蕉精品香蕉| 日韩毛片在线看| 国产精品无码一区二区三区免费 | 成人bbav| 天天操天天色综合| 日本免费不卡一区二区| 日韩大片免费观看| 色哟哟一区二区在线观看| 成年人免费在线播放| 免费福利视频一区二区三区| 日本韩国视频一区二区| 亚洲视频在线a| 欧美aaaaaa| 3atv一区二区三区| 亚洲精品成人无码毛片| 精品国产18久久久久久洗澡| 国产丝袜视频一区| 五月天婷婷丁香网| 综合天天久久| 性亚洲最疯狂xxxx高清| 潘金莲一级淫片aaaaaa播放| 日韩av一区二区三区| 成人美女av在线直播| www.日韩高清| 91麻豆成人久久精品二区三区| 欧美不卡1区2区3区| av在线日韩国产精品| 亚洲女子a中天字幕| 人人妻人人做人人爽| 在线观看网站免费入口在线观看国内| 91精品福利在线| 亚洲五月激情网| 天堂99x99es久久精品免费| 中文字幕精品一区二区精品| 欧美精品入口蜜桃| 久久精品毛片| 91亚色免费| 日本1级在线| 亚洲欧美区自拍先锋| 国产精品专区在线| 国产亚洲欧美日韩精品一区二区三区| 欧美成人官网二区| 国产毛片欧美毛片久久久| 自拍日韩欧美| 国产精品免费久久久久影院| 亚洲欧美另类一区| 国产精品私房写真福利视频| av无码久久久久久不卡网站| 成人看片网页| 亚洲精品97久久| 天天操夜夜操av| 久久99伊人| 97中文在线| 日本中文字幕视频在线| 欧美日韩国产丝袜美女| 永久看看免费大片| 日韩免费视频| 日韩av毛片网| 污污的视频网站在线观看| 中文字幕一区三区| 欧美一级黄色影院| 欧洲亚洲视频| 久久久在线免费观看| 国产又大又黄又爽| 欧美高清在线视频| 北条麻妃在线观看| 国产精品对白| 欧美大片在线看免费观看| 亚洲午夜激情视频| 久久久三级国产网站| 国自产拍偷拍精品啪啪一区二区| 精品中文在线| zzjj国产精品一区二区| 青青艹在线观看| 久久影院视频免费| 欧美精品一区免费| 国产精品一区二区三区美女| 久久久国产精品免费| 中文字幕在线一| 欧美激情在线看| 国产91对白刺激露脸在线观看| 视频一区日韩| 久久6免费高清热精品| 一级α片免费看刺激高潮视频| 久久久久久久久久久电影| 国产l精品国产亚洲区久久| 国产区精品视频在线观看豆花| 欧美福利视频在线观看| 国产av无码专区亚洲a∨毛片| 国产精品美女一区二区三区| 手机看片一级片| 日韩在线第七页| 国产精品欧美日韩| av大片在线看| 欧美夫妻性生活| 国产美女高潮视频| 国产在线一区观看| 日韩中文在线字幕| 一区二区三区视频播放| 欧美国产中文字幕| 欧美 日韩 人妻 高清 中文| 午夜精品久久久久影视| 天堂久久久久久| 香蕉久久国产| 日本不卡高清视频一区| 国产精品亲子伦av一区二区三区| 色综久久综合桃花网| 91精品人妻一区二区三区果冻| 成人欧美一区二区三区小说 | 成人福利视频网站| 日本少妇高潮喷水视频| 免费黄色成人| 成人激情av在线| 尤物yw193can在线观看| 亚洲韩国欧洲国产日产av| 狠狠人妻久久久久久| 国产欧美一区二区三区在线看蜜臀| 久久久久国产一区| 亚洲精品国产偷自在线观看| 国产精品嫩草在线观看| 欧美三级网址| www.欧美精品一二三区| 黄色av免费观看| 色噜噜久久综合| 免费在线观看a级片| 成人久久18免费网站麻豆| 91av资源网| 婷婷亚洲最大| 精品无人乱码一区二区三区的优势| 天天综合网站| 久久av资源网站| 欧美综合视频在线| 欧美日韩亚洲国产综合| 国产亚洲成人精品| 国产日韩精品一区二区浪潮av| 在线一区二区不卡| 国产精品久久国产愉拍| 中文字幕一区二区三区有限公司 | 日韩伦理在线| 日韩中文字幕久久| 天天干天天干天天干| 欧美日韩综合一区| 国产91av视频| 一色屋精品亚洲香蕉网站| 视频免费在线观看| 激情偷乱视频一区二区三区| av动漫在线看| 欧美一区激情| 婷婷亚洲婷婷综合色香五月| baoyu135国产精品免费| 国产精品亚洲精品| 三级在线观看视频| 欧美日韩第一视频| 自拍视频在线播放| 日韩精品久久久久久久玫瑰园| 国产美女www爽爽爽视频| 欧美午夜激情在线| 久久中文字幕无码| 亚洲欧美在线视频观看| 国产中年熟女高潮大集合| 高清成人免费视频| 色婷婷.com| 日本中文在线一区| 男人操女人免费软件| 亚洲午夜精品久久久久久app| 亚洲精品在线视频观看| 国产成人精品一区二区免费看京| 国产精品一码二码三码在线| 99精品国产九九国产精品| 国产不卡av在线免费观看| 爱搞国产精品| 久久久久久久久久久网站| 激情在线小视频| 色天天综合狠狠色| 成人性生交大片免费看午夜| 亚洲国产中文字幕在线观看| 亚洲黄色小说网| 日韩一卡二卡三卡四卡| 国产又色又爽又黄又免费| 欧美视频你懂的| 香蕉污视频在线观看| 欧美性色视频在线| 久久99精品波多结衣一区| 亚洲一区二区三区视频在线| 欧美成人黄色网| 自拍视频在线观看一区二区| 一本色道久久88| 国产精品美女久久久久久| 国产调教在线观看| 国产精品丝袜一区| 免费一级suv好看的国产网站| 国产日韩欧美电影| 成年人在线免费看片| 国产精品欧美精品| 国产一区二区三区视频播放| 亚洲欧洲一区二区在线播放| 久久精品日韩无码| 亚洲伦理在线精品| 在线观看亚洲网站| 亚洲精品欧美在线| 久久精品国产亚洲av高清色欲| 亚洲一区二区三区中文字幕在线| 免费观看一级视频| 懂色av影视一区二区三区| www.国产毛片| 欧美老肥妇做.爰bbww| 国产av精国产传媒| 亚洲国产欧美自拍| 国产在线视频你懂得| 中国china体内裑精亚洲片| 快射视频在线观看| 久久久久久久色| 亚洲风情在线资源| 国产精品视频网站| 国产精品99久久免费| 国产伦精品一区二区三区视频孕妇 | 亚洲国产一区二区三区在线播放| 青青草综合视频| 国产精品呻吟| 天堂一区在线观看| 国产成人免费在线观看| 欧美老熟妇乱大交xxxxx| 国产精品欧美久久久久无广告| 2018天天弄| 色综合天天综合狠狠| 国产又粗又猛又爽又黄的视频一| 精品三级在线看| 国产在线观看黄| 九九热最新视频//这里只有精品| 成人免费观看在线观看| 国产精品久久久久久久久久新婚 | 欧美日韩最好看的视频| 97国产精品| 黄色网页免费在线观看| 麻豆91在线播放| 国产xxxx视频| 国产精品久久一卡二卡| 国产乡下妇女做爰视频| 欧美图区在线视频| 少妇人妻偷人精品一区二区| 中文字幕欧美精品日韩中文字幕| 成人高潮aa毛片免费| 国产精品啪视频| 久久久久久久久久久久久久久久久久久久 | 国产成人毛毛毛片| 日韩高清免费观看| 超碰在线网址| 国产成人精品视频| 福利电影一区| 黄色高清视频网站| 天堂久久一区二区三区| 中国黄色片视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 黄色免费福利视频| 国产美女在线精品| 丰满的亚洲女人毛茸茸| 欧美日韩国内自拍| 午夜精品久久久久久久99老熟妇| 永久免费精品影视网站| а√在线天堂官网| 91综合免费在线| 日韩极品一区| 国产最新免费视频| www..com久久爱| 久久久久久久福利| 欧美一区二区观看视频| 自拍视频在线网| 国产精品久久久精品| 网红女主播少妇精品视频| 成人一级生活片| 国产成人午夜精品影院观看视频 | 韩国三级在线观看久| 91av视频在线观看| 国产+成+人+亚洲欧洲在线| 久久久久亚洲av无码专区喷水| 裸体在线国模精品偷拍| 日韩中文字幕有码| 91福利区一区二区三区| 日本成人一区| 国产91免费看片| 亚洲精品无吗| 青青草原成人网| caoporn国产精品| 日本少妇bbwbbw精品| 精品免费国产二区三区 | 欧美中文在线观看国产| 色老板在线视频一区二区| 黄色免费视频大全| www成人在线观看| 三级视频在线观看| 亚洲人成网站色ww在线| 欧美中文字幕精在线不卡| 欧美日韩综合精品| 蜜臀久久久99精品久久久久久| 人人妻人人澡人人爽| 欧美日韩第一区日日骚| 日本在线观看www| 91久久国产综合久久蜜月精品| 亚洲欧美综合| 美女黄色一级视频| 欧美日韩综合视频网址| 伦理片一区二区三区| 国产精品久久久久久久久免费| 第四色成人网| 久久精品一卡二卡| 亚洲一区二区三区四区的| 性感美女一级片| 国产精品久久久久久久午夜| 色综合天天综合网中文字幕| 小早川怜子一区二区三区| 亚洲专区一二三| 四虎电影院在线观看| 国产精品你懂得| 一区二区电影在线观看| 国产亚洲色婷婷久久99精品91| 一本一本大道香蕉久在线精品| 97视频精彩视频在线观看| 2022国产精品| 亚洲综合日本| 国产男女猛烈无遮挡在线喷水| 欧美成人猛片aaaaaaa| 厕沟全景美女厕沟精品| 影音先锋欧美在线| 丰满白嫩尤物一区二区| www.久久精品视频| 不卡av电影在线观看| 久本草在线中文字幕亚洲| 别急慢慢来1978如如2| 一区二区三区在线免费播放| 青青草手机在线| 亚洲www在线| 性一交一乱一区二区洋洋av| 91香蕉视频污在线观看| 亚洲国产91色在线| 亚洲欧美一级| 国产视频一视频二| 中文字幕永久在线不卡| 五月天久久久久久| 国产在线视频不卡| 国产日韩欧美一区在线| 日韩高清dvd碟片| 亚洲精品一区二区网址| 美女精品久久|