精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人欧美一区二区三区黑人孕妇| 精品少妇一区二区三区| 亚洲国产精品一区二区第四页av| 国产女人18毛片水18精| 亚洲美女91| 中文字幕欧美日韩| 特级特黄刘亦菲aaa级| 亚洲成a人片| 一区二区三区在线播放| 久久精品aaaaaa毛片| 一级特黄色大片| 在线综合欧美| 久久香蕉国产线看观看网| 亚洲精品乱码久久久久久久| 亚洲国产天堂| 欧美午夜性色大片在线观看| 黄色网址在线免费看| 免费一级毛片在线观看| 国产麻豆日韩欧美久久| 国产精品户外野外| 日本少妇性生活| 四虎8848精品成人免费网站| 日韩激情视频在线| 任你躁av一区二区三区| 日韩国产一二三区| 色一区在线观看| 亚洲理论电影在线观看| 久cao在线| 国产人成一区二区三区影院| 国产区一区二区| 99热这里只有精| 青椒成人免费视频| 91精品国产亚洲| 激情小说中文字幕| 91精品二区| 日韩在线www| 人人妻人人澡人人爽| 亚洲黄页网站| 亚洲国产精品热久久| 99999精品| 亚洲影视资源| 欧美视频精品在线| av免费在线播放网站| 黑森林国产精品av| 午夜精品久久久久久久99樱桃| 干日本少妇视频| 菠萝菠萝蜜在线观看| 国产精品初高中害羞小美女文| 欧美精品一区二区三区在线四季 | 日韩亚洲欧美一区二区三区| 中文字幕 日韩 欧美| 成人国产一区| 欧美日韩精品一区二区天天拍小说 | 美国一级片在线免费观看视频| www.在线欧美| 国产色综合一区二区三区| 亚洲AV午夜精品| 国产成人免费视频网站| 999日本视频| 性猛交xxxx乱大交孕妇印度| 国产成人综合亚洲91猫咪| 999热视频| 天天综合天天综合| 久久免费精品国产久精品久久久久| 久久久一本精品99久久精品66| 亚洲av片一区二区三区| 国产亚洲短视频| 亚洲成人一区二区三区| 黄色网址在线免费观看| 一区二区三区四区不卡在线| 日本午夜激情视频| 中国色在线日|韩| 欧美色视频在线观看| 在线观看亚洲色图| 久久gogo国模啪啪裸体| 欧美精品一区男女天堂| 麻豆av免费观看| 日韩在线中文| 欧美极品少妇xxxxⅹ裸体艺术 | 亚洲一区二区久久久久久| 国产成人精品毛片| 99re在线视频这里只有精品| 日本亚洲欧洲精品| 国产乱色在线观看| 亚洲一卡二卡三卡四卡五卡| 免费观看精品视频| 未满十八勿进黄网站一区不卡| 欧美一区二区三区精品| a视频免费观看| 三级电影一区| 久久久噜噜噜久久久| 国产婷婷色一区二区在线观看 | 成人黄色网免费| 狠狠人妻久久久久久综合麻豆| 久久综合狠狠综合久久激情 | 一区二区激情| 成人网欧美在线视频| 丰满人妻熟女aⅴ一区| 欧美激情一区二区在线| 97碰在线视频| 成人做爰视频www| 亚洲成人动漫在线播放| 国产精品麻豆一区| 国产婷婷精品| 91久久精品视频| 理论视频在线| 亚洲一区二区三区四区五区中文| 99视频精品免费| 精品国产一区二区三区成人影院 | 亚洲老司机网| 亚洲开心激情网| 欧美日韩三级在线观看| 蜜臀av一区二区三区| 成人av资源网| 韩国av网站在线| 色成人在线视频| aaaa黄色片| 午夜激情一区| 国产主播欧美精品| 黄视频在线观看免费| 亚洲午夜精品网| 图片区乱熟图片区亚洲| 精品美女在线视频| 欧美亚洲成人网| 国产 日韩 欧美 精品| 中文字幕亚洲一区二区va在线| www.亚洲天堂网| 久9re热视频这里只有精品| 久久夜色精品国产| 一级黄色大片网站| 国产午夜精品一区二区三区嫩草| 搞av.com| 国产精品一区二区三区美女| 久久91精品国产| 国产乱淫av免费| 成人免费一区二区三区在线观看| 国产女女做受ⅹxx高潮| 天堂网av成人| 国产91成人video| 三级网站在线看| 亚洲第一狼人社区| 日本69式三人交| 国内精品美女在线观看| 国产传媒欧美日韩| 国产精品久久麻豆| 91精品国产麻豆国产自产在线 | 综合一区av| 91亚洲精品一区| 中文字幕伦理免费在线视频| 欧美一区二区三区免费| 欧美色图一区二区| 处破女av一区二区| 777精品久无码人妻蜜桃| 青青草原在线亚洲| 日韩av电影手机在线| 噜噜噜在线观看播放视频| 91国偷自产一区二区三区观看| 日本一级免费视频| 日韩av在线发布| 中文字幕在线亚洲精品| 国产亚洲高清一区| 欧美黄色成人网| 少妇人妻精品一区二区三区| 欧美性猛交xxxx黑人| 无码人妻aⅴ一区二区三区69岛| 日本不卡中文字幕| 免费成人深夜夜行网站视频| 日韩在线网址| 91国产精品电影| seseavlu视频在线| 91精品国产综合久久久蜜臀图片| 91porn在线视频| 成人三级在线视频| 成人亚洲视频在线观看| 亚洲v在线看| 国产精品xxxx| 日韩av电影资源网| 欧美xxxx18性欧美| 水莓100国产免费av在线播放| 在线免费观看一区| 欧美日韩免费一区二区| 2017欧美狠狠色| 久久6免费视频| 一本久久综合| 最新欧美日韩亚洲| 理论片一区二区在线| 国产精品美女主播| 青春草免费在线视频| 亚洲欧洲在线观看| 国产成人三级在线播放| 日韩欧美亚洲国产一区| 三上悠亚作品在线观看| 97精品超碰一区二区三区| 久久国产激情视频| 日韩图片一区| 精品少妇人妻av一区二区| 丝袜久久网站| 91视频免费在线观看| 国产精品专区免费| 欧美丰满老妇厨房牲生活| 粉嫩av在线播放| 亚洲成人网久久久| 一级片在线观看视频| 高跟丝袜一区二区三区| 精品一区在线观看视频| 国产香蕉久久精品综合网| www.四虎精品| 精久久久久久久久久久| 欧美少妇性生活视频| 亚洲国产午夜| 欧美日韩午夜爽爽| 97精品97| 日本不卡二区高清三区| 鲁大师精品99久久久| 96sao精品视频在线观看| 成人开心激情| 欧美在线视频播放| 暧暧视频在线免费观看| 两个人的视频www国产精品| 成人三级黄色免费网站| 日韩av在线播放资源| www.av网站| 69久久夜色精品国产69蝌蚪网| 精品国产乱子伦| 日韩欧美亚洲综合| 成人午夜视频在线播放| 亚洲高清免费在线| 精品少妇久久久| 一区二区三区日韩| 国产a免费视频| 亚洲日本一区二区| 日韩在线一卡二卡| 国产精品久线在线观看| xxxx日本黄色| 国产无遮挡一区二区三区毛片日本| 成熟妇人a片免费看网站| 国产福利一区在线观看| 久久久国产精品久久久| 国产精品一区二区你懂的| 欧美日韩理论片| 久久99国产精品免费| 中文字幕 日韩 欧美| 久久99精品国产麻豆婷婷洗澡| 久久人人爽av| 精品一区二区三区在线播放| 视频免费1区二区三区| 久久91精品国产91久久小草 | 日韩五码电影| 成人黄色免费网站在线观看| 成人在线日韩| 国产91一区二区三区| 国产精品久av福利在线观看| 国产亚洲欧美另类一区二区三区| 国内视频在线精品| 久久精彩视频| 成人vr资源| 少妇高潮流白浆| 精品999网站| 熟女少妇在线视频播放| 亚洲综合精品| 日本xxxx黄色| 国产精品911| 日本黄色录像片| 久久女同性恋中文字幕| 国产精品理论在线| 亚洲日韩欧美一区二区在线| 国产免费无码一区二区视频| 亚洲国产美女搞黄色| 国产一级18片视频| 欧美日韩的一区二区| 国产按摩一区二区三区| 日韩成人av一区| 阿v免费在线观看| 欧美精品日韩www.p站| 成入视频在线观看| 国产精品男女猛烈高潮激情| 狂野欧美xxxx韩国少妇| 国产综合欧美在线看| 热久久天天拍国产| 免费的一级黄色片| 久久一区二区三区超碰国产精品| 超碰在线公开97| 成人丝袜高跟foot| 调教驯服丰满美艳麻麻在线视频| 最好看的中文字幕久久| 日本系列第一页| 欧美日韩一区二区三区不卡| 午夜精品久久久久久久爽| 亚洲深夜福利网站| 欧美性受ⅹ╳╳╳黑人a性爽| 日韩免费观看视频| 嫩呦国产一区二区三区av| 欧美日韩免费观看一区| 亚洲五月综合| 国产综合免费视频| 国产成人综合精品三级| 日本高清黄色片| 亚洲国产日产av| 91女人18毛片水多国产| 日韩经典一区二区三区| 中文字幕在线观看播放| 国产精品入口尤物| 农村少妇一区二区三区四区五区| 中文字幕中文字幕在线中一区高清| 亚洲国产一区二区三区a毛片 | 国产精品熟女视频| 精品国产制服丝袜高跟| 色三级在线观看| 欧美中文在线免费| 日韩一二三区在线观看| 亚洲精品在线免费看| 久久久久久9| 丰满人妻一区二区三区免费视频棣| 亚洲国产高清aⅴ视频| 日韩不卡视频在线| 精品国产乱码久久久久久免费 | 亚洲国产中文字幕在线视频综合| 在线观看黄色国产| 一区二区福利视频| 成人影院入口| 免费在线成人av电影| 亚洲第一网站| 四虎永久免费观看| 一区二区三区在线观看动漫| 国产精品视频无码| 日韩视频免费中文字幕| 国产一区二区精品调教| 欧美高清性xxxxhd| 亚洲综合好骚| 爱爱的免费视频| 日韩欧美国产视频| 亚洲aⅴ在线观看| 欧美一级视频在线观看| 狼人天天伊人久久| 高清在线观看免费| 91啪九色porn原创视频在线观看| 国产主播在线观看| 精品国产乱码久久久久久老虎| 污污网站在线观看| 99热最新在线| 亚洲高清免费| 国产又粗又猛又色| 午夜激情综合网| 天天操天天干天天舔| 7777kkkk成人观看| 亚洲亚洲免费| www.欧美日本| 国产精品久久久久三级| 国产一区二区网站| 欧美成人在线免费| 在线观看视频一区二区三区| 青青草国产免费| hitomi一区二区三区精品| 国产污污视频在线观看| 亚洲精品视频在线观看视频| 日韩av中字| 亚洲图片都市激情| 国产乱子轮精品视频| 久久精品视频久久| 亚洲乱码一区二区| 欧美色999| 久久久国产精华液999999| 国产成人免费视频网站| 羞羞影院体验区| 中文字幕免费精品一区高清| 久久天堂久久| 日本www在线播放| 国产日韩欧美高清| 国产绿帽一区二区三区| 欧美激情国产高清| 妖精一区二区三区精品视频| 九色porny91| 亚洲黄色片在线观看| 午夜在线视频观看| 国产欧美亚洲精品| 亚洲视频福利| 精品人妻互换一区二区三区| 制服丝袜亚洲播放| 成人bbav| 宅男噜噜99国产精品观看免费| 国产成人在线网站| 一级做a爰片久久毛片| 久久夜色精品国产亚洲aⅴ| 天堂av一区二区三区在线播放 | 国产91沈先生在线播放| 91丨九色丨尤物| 91中文字幕在线播放| 性视频1819p久久| 日韩精品影视| 男男做爰猛烈叫床爽爽小说| 欧美日韩成人一区| 女人让男人操自己视频在线观看| 亚洲午夜高清视频| a美女胸又www黄视频久久| 国产精品久久久久久免费免熟| 68精品久久久久久欧美| 久久久久美女| 男人天堂av电影| 亚洲精品久久在线| 国产激情精品一区二区三区|