国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當(dāng)前位置:首頁 > 科技  > 軟件

DDD 與 CQRS 才是黃金組合

來源: 責(zé)編: 時間:2023-08-20 23:17:18 12240觀看
導(dǎo)讀在日常工作中,你是否也遇到過下面幾種情況:使用一個已有接口進(jìn)行業(yè)務(wù)開發(fā),上線后出現(xiàn)嚴(yán)重的性能問題,被老板當(dāng)眾質(zhì)疑:“你為什么不使用緩存接口,這個接口全部走數(shù)據(jù)庫,這怎么能抗住!”開發(fā)一個后臺管理功能,業(yè)務(wù)反饋說數(shù)據(jù)一直

在日常工作中,你是否也遇到過下面幾種情況:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. 使用一個已有接口進(jìn)行業(yè)務(wù)開發(fā),上線后出現(xiàn)嚴(yán)重的性能問題,被老板當(dāng)眾質(zhì)疑:“你為什么不使用緩存接口,這個接口全部走數(shù)據(jù)庫,這怎么能抗住!”
  2. 開發(fā)一個后臺管理功能,業(yè)務(wù)反饋說數(shù)據(jù)一直不對,對比后發(fā)現(xiàn)緩存與數(shù)據(jù)庫不一致,為什么要使用緩存接口呢,你陷入沉思?
  3. 產(chǎn)品要求在 xxx 上增加新功能,編碼、測試、上線一氣呵成,最后發(fā)現(xiàn)另外一個流程被躺槍,出現(xiàn)異常不得不進(jìn)行回滾!
  4. 在一個高并發(fā)的場景,DB 成為了系統(tǒng)瓶頸,不加索引查詢扛不住,加索引更新扛不住,又該如何處理?
  5. 隨著數(shù)據(jù)量的激增,系統(tǒng)變得越來越慢,特別是后臺管理復(fù)雜的查詢場景下,復(fù)雜的 Join 讓 DB 不堪重負(fù)
  6. ……

為什么會出現(xiàn)這種現(xiàn)象?其本質(zhì)仍舊是代碼組織結(jié)構(gòu)不合理,我們將不同的復(fù)雜性揉在一起,從而造成了更大的復(fù)雜性,然后如此往復(fù),不知不覺中陷入巨大的復(fù)雜性旋渦不可自拔。lcY28資訊網(wǎng)——每日最新資訊28at.com

1. CQRS 是什么?

CQRS 是 Command Query Responsibility Segregation 得簡稱,簡單理解就是對 “寫”(Command) 和 “讀” (Query)操作進(jìn)行分離。反應(yīng)快的同學(xué)會說:“也不是什么高深技術(shù)嗎,不就是數(shù)據(jù)庫的讀寫分離嗎?”lcY28資訊網(wǎng)——每日最新資訊28at.com

是的,數(shù)據(jù)庫的讀寫分離也算是一種 CQRS,但 CQRS 的含義要比這復(fù)雜的多。lcY28資訊網(wǎng)——每日最新資訊28at.com

CRQS 既是一種流行的業(yè)務(wù)架構(gòu),又是一種設(shè)計思維。lcY28資訊網(wǎng)——每日最新資訊28at.com

CQRS 的核心是“拆分”,將復(fù)雜系統(tǒng)拆分為 Command 和 Query 兩個部分,針對不同的場景使用不同的模式,選擇最合適的技術(shù)落地最佳解決方案,避免兩者相互掣肘相互影響。lcY28資訊網(wǎng)——每日最新資訊28at.com

CQRS的目的是降低整個系統(tǒng)的復(fù)雜性,那它背后的邏輯是什么?lcY28資訊網(wǎng)——每日最新資訊28at.com

假設(shè),在一個系統(tǒng)中:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. Command 的復(fù)雜性為 M
  2. Query 的復(fù)雜性為 N

如果使用同一套模型來處理 Command 和 Query,那在極端情況下,系統(tǒng)的復(fù)雜性為 M * N,因?yàn)閮烧呦嗷ビ绊懀{(diào)整一方的同時要時刻關(guān)注對另一方的影響。lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

這種“你中有我,我中有你”的設(shè)計方式,“兩者的相互影響”成為系統(tǒng)最為復(fù)雜之處,大量精力消耗在“排查影響”,而非最有價值的設(shè)計和編碼。lcY28資訊網(wǎng)——每日最新資訊28at.com

如果,將 Command 和 Query 徹底分離,系統(tǒng)的復(fù)雜性變成 M + N。Command 的變更不會影響 Query,而 Query 的修改也不會影響 Command。lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,以上兩個極端在實(shí)際工作中也很少見,通常系統(tǒng)的復(fù)雜性介于兩者之間。lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

這只是從理論進(jìn)行推導(dǎo),在實(shí)際工作中隨處可見的“沖突”也是對“拆分”的一種暗示。lcY28資訊網(wǎng)——每日最新資訊28at.com

2. 分層架構(gòu)中的沖突

以最常見的分層架構(gòu)進(jìn)行介紹,具體如下:lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

如圖所示,將系統(tǒng)分成5層,每層的含義如下:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. Web 接入層。主要用于處理系統(tǒng)輸入,對輸入信息進(jìn)行驗(yàn)證,調(diào)用應(yīng)用服務(wù)完成業(yè)務(wù)操作,對結(jié)果進(jìn)行轉(zhuǎn)換,最終返回給調(diào)用方;
  2. 應(yīng)用服務(wù)層。主要處理業(yè)務(wù)流程編排,從倉庫中獲取領(lǐng)域?qū)ο螅瑘?zhí)行領(lǐng)域模型的業(yè)務(wù)操作,將最新的對象狀態(tài)通過倉庫同步到數(shù)據(jù)存儲引擎,并對外發(fā)布領(lǐng)域事件;
  3. 領(lǐng)域?qū)印I(yè)務(wù)邏輯的承載點(diǎn),是業(yè)務(wù)價值的集中體現(xiàn),通常構(gòu)建于面向?qū)ο笤O(shè)計之上,基于封裝、繼承、多態(tài)等特性保障業(yè)務(wù)邏輯的復(fù)用性和擴(kuò)展性;
  4. 倉庫層。主要用于數(shù)據(jù)訪問,向上為應(yīng)用服務(wù)提供數(shù)據(jù)操作服務(wù),向下屏蔽各類存儲引擎的差異;
  5. 數(shù)據(jù)層。主要用于數(shù)據(jù)保存和檢索,常見的數(shù)據(jù)存儲引擎全部屬于這一層,比如 MySQL、Redis、ES 等;

其實(shí),分層架構(gòu)本身也是一種“拆分”,將不同的關(guān)注點(diǎn)封裝在不同的層次。但除了橫向分層,還可以基于 CQRS 對其進(jìn)行縱向拆分,也就是將每個層的組件拆分為 Command 和 Query 兩部分。lcY28資訊網(wǎng)——每日最新資訊28at.com

由于接入層沖突較小,本身拆分的意義不大,在此不做要求,但從嚴(yán)格意義上講,仍舊建議進(jìn)行拆分。lcY28資訊網(wǎng)——每日最新資訊28at.com

3. 應(yīng)用服務(wù)層沖突與拆分

應(yīng)用服務(wù)層拆分就是將一個應(yīng)用服務(wù)拆分為 CommandService 和 QueryService 兩組。lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

這樣做可以避免很多不必要的麻煩,Command 和 Query 存在較大的區(qū)別,具體如下:lcY28資訊網(wǎng)——每日最新資訊28at.com


lcY28資訊網(wǎng)——每日最新資訊28at.com

CommandServicelcY28資訊網(wǎng)——每日最新資訊28at.com

QueryServicelcY28資訊網(wǎng)——每日最新資訊28at.com

依賴組件不同lcY28資訊網(wǎng)——每日最新資訊28at.com

ValidateService 驗(yàn)證服務(wù);LazyLoaderFactory 延遲加載服務(wù);CommandRepository 不帶緩存的倉庫;EventPublisher 事件發(fā)表器lcY28資訊網(wǎng)——每日最新資訊28at.com

QueryRepository 帶緩存功能的倉庫;JoinService 數(shù)據(jù)聚合服務(wù);Converter 數(shù)據(jù)轉(zhuǎn)換服務(wù)lcY28資訊網(wǎng)——每日最新資訊28at.com

核心流程不同lcY28資訊網(wǎng)——每日最新資訊28at.com

驗(yàn)證、加載、業(yè)務(wù)操作、同步、發(fā)布事件lcY28資訊網(wǎng)——每日最新資訊28at.com

驗(yàn)證、加載、數(shù)據(jù)組裝、轉(zhuǎn)換lcY28資訊網(wǎng)——每日最新資訊28at.com

功能加強(qiáng)不同lcY28資訊網(wǎng)——每日最新資訊28at.com

主要是事務(wù)管理器lcY28資訊網(wǎng)——每日最新資訊28at.com

主要是緩存組件lcY28資訊網(wǎng)——每日最新資訊28at.com

回想開篇時提到的場景,完成應(yīng)用層拆分,就不在為使用錯組件而煩惱:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. CommandService 的 Repository 不使用緩存,僅操作數(shù)據(jù)庫
  2. QueryService 的 Repository 可以使用緩存,以提升訪問性能

除此之外,針對統(tǒng)一的操作流程,還可以進(jìn)一步抽象來消除重復(fù)的“模板代碼”,比如:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. 引入“模板方法設(shè)計模式” 以達(dá)到核心邏輯的復(fù)用

抽象出 BaseCommandService 和 BaseQueryService 兩個父類用于統(tǒng)一核心流程lcY28資訊網(wǎng)——每日最新資訊28at.com

子類實(shí)現(xiàn) BaseCommandService 和 BaseQueryService 的抽象方法完成功能擴(kuò)展lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. 基于“約定優(yōu)于配置” 使用 Proxy 模型,只定義接口不寫實(shí)現(xiàn)代碼
  2. 按規(guī)范定義 CommandService 和 QueryService 接口,通過注解完成相關(guān)配置
  3. 自動生成 Proxy 實(shí)現(xiàn)類,完成流程編排

4. 模型層沖突與拆分

模型層是系統(tǒng)的核心,它的設(shè)計直接影響整個系統(tǒng)的質(zhì)量。作為承接業(yè)務(wù)邏輯的核心,比較流程的實(shí)現(xiàn)策略包括:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. DDD 領(lǐng)域驅(qū)動設(shè)計,其核心是使用面向?qū)ο蟮母呒壧匦裕ǚ庋b、繼承、多態(tài)、組合等)來進(jìn)行設(shè)計,非常適合復(fù)雜的業(yè)務(wù)場景。其體現(xiàn)就是存在很多高內(nèi)聚低耦合的對象組(聚合根),業(yè)務(wù)邏輯由這些小對象相互協(xié)作共同完成;
  2. 事務(wù)腳本,使用過程式思維,將數(shù)據(jù)操作編織到流程中,比較適合并不復(fù)雜的業(yè)務(wù)場景。其體現(xiàn)就是存在很多“上帝 Service”,Service 中存在很多非常長的方法,業(yè)務(wù)邏輯由這些方法完成;

關(guān)于哪個才是最優(yōu)解,網(wǎng)上已經(jīng)爭論多年,最終也沒有結(jié)論。但我始終認(rèn)為“沒有業(yè)務(wù)場景就討論方案,就是在耍流氓”。lcY28資訊網(wǎng)——每日最新資訊28at.com

從不同應(yīng)用場景出發(fā)便可得到如下結(jié)論:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. Command 場景需要保障嚴(yán)謹(jǐn)?shù)臉I(yè)務(wù)邏輯,通常復(fù)雜性偏高,所以DDD 是最優(yōu)解
  2. Query 場景需要更靈活的數(shù)據(jù)組裝能力作為支持,通常比較簡單,所以 事務(wù)腳本 是最優(yōu)解

我經(jīng)常說:“最簡單的“寫”也是復(fù)雜,最復(fù)雜的“讀”也是簡單”,其背后邏輯是基于對 Command 和 Query 的場景判斷。lcY28資訊網(wǎng)——每日最新資訊28at.com

將模型拆分為 Command 和 Query,具體如下:lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

完成模型拆分后,新模型具有以下特征:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. Agg 也就是 DDD 中聚合根,主要用于處理復(fù)雜的 Command 邏輯,由具有大量業(yè)務(wù)操作的"富對象"構(gòu)成;
  2. View 是標(biāo)準(zhǔn)的 POJO,主要充當(dāng) Query 結(jié)果對象,典型的“貧血對象”,僅作為數(shù)據(jù)的載體,根據(jù)展示需求對數(shù)據(jù)進(jìn)行組裝;
  3. View 沒有自己的 Repository,只能依賴 CommandRepository 獲取數(shù)據(jù),Converter 組件負(fù)責(zé)將 Agg 模型轉(zhuǎn)換為 View 模型。

這塊是拆分的重點(diǎn),為了方便理解,簡單舉個例子:lcY28資訊網(wǎng)——每日最新資訊28at.com

比如在電商的訂單模塊:lcY28資訊網(wǎng)——每日最新資訊28at.com

  • 生單流程,由 Order 作為聚合根對內(nèi)部 OrderItem 和 PayInfo 進(jìn)行統(tǒng)一協(xié)調(diào)
  • 訂單列表頁,只需展示 Order 和 User 信息
  • 訂單詳情,需要展示Order、User、Address、OrderItem、PayInfo、Product等信息

如果讓一個模型同時支持著三個場景,那模型自己就變的非常復(fù)雜,很難判斷某個方法、某個字段究竟屬于哪個場景。lcY28資訊網(wǎng)——每日最新資訊28at.com

此時,應(yīng)該根據(jù)場景對模型進(jìn)行拆分:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. OrderBO 以 DDD 方式進(jìn)行建模,對外提供統(tǒng)一的業(yè)務(wù)操作,對內(nèi)協(xié)調(diào) OrderItem 和 PayInfo 等多個實(shí)體對象;
  2. OrderListVO 以 POJO 方式進(jìn)行建模,屬性中包含 Order 和 User 信息;
  3. OrderDetailVO 以 POJO 方式進(jìn)行建模,屬性中包括 Order、User、Address、OrderItem、PayInfo、Product 等信息;

三個模型相互獨(dú)立,互不影響。lcY28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,由于使用統(tǒng)一的 Repository 還需提供對應(yīng) VO 的 Converter:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. OrderListVOConverter 將 OrderBO 轉(zhuǎn)換為 OrderListVO 對象
  2. OrderDetailVOConverter 將 OrderBO 轉(zhuǎn)化為 OrderDetailVO 對象

5. 倉庫層沖突與拆分

倉庫層拆分也是非常有必要的,在這一層主要有幾項(xiàng)沖突:lcY28資訊網(wǎng)——每日最新資訊28at.com


lcY28資訊網(wǎng)——每日最新資訊28at.com

CommandRepositorylcY28資訊網(wǎng)——每日最新資訊28at.com

QueryRepositorylcY28資訊網(wǎng)——每日最新資訊28at.com

底層實(shí)現(xiàn)不同lcY28資訊網(wǎng)——每日最新資訊28at.com

主要基于 DB 實(shí)現(xiàn)lcY28資訊網(wǎng)——每日最新資訊28at.com

基于 DB、Redis、ES 等多種存儲引擎lcY28資訊網(wǎng)——每日最新資訊28at.com

方法復(fù)雜性不同lcY28資訊網(wǎng)——每日最新資訊28at.com

提供僅有的少量方法并足以支持大多數(shù)場景,比如 save、update、getById 等lcY28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)業(yè)務(wù)場景進(jìn)行定制,方法多種多樣(單條、批量、分頁、排序、統(tǒng)計等),維度多種多樣(id、user、status)lcY28資訊網(wǎng)——每日最新資訊28at.com

返回值不同lcY28資訊網(wǎng)——每日最新資訊28at.com

直接返回裝配完整的富對象lcY28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)業(yè)務(wù)場景定制返回值lcY28資訊網(wǎng)——每日最新資訊28at.com

倉庫拆分后整體架構(gòu)如下:lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

倉庫拆分具有以下特點(diǎn):lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. View 不在需要 Converter 組件完成數(shù)據(jù)轉(zhuǎn)換
  2. View 的數(shù)據(jù)來自于自己的 Repository,可以根據(jù)展示需求進(jìn)行靈活定制
  3. Command 和 Query 仍舊使用同一套數(shù)據(jù)庫、同一套數(shù)據(jù)表

6. 數(shù)據(jù)層沖突與拆分

數(shù)據(jù)層拆分是最重要的拆分,提到分離第一反應(yīng)也是“數(shù)據(jù)庫主從分離”。lcY28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)層拆分的本質(zhì)是:各種數(shù)據(jù)存儲引擎的最佳應(yīng)用場景相差巨大,讀 和 寫 優(yōu)化往往存在矛盾。lcY28資訊網(wǎng)——每日最新資訊28at.com

仍舊以最常見的數(shù)據(jù)庫為例:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. 提升查詢性能,建議為各種查詢維度建立索引
  2. 提升寫入性能,需要讓表上的索引越來越少
  3. 為了加速更新性能,建議使用三范式設(shè)計表結(jié)構(gòu),減少冗余信息
  4. 為了加速查詢性能,建議使用反范式設(shè)計,盡量冗余數(shù)據(jù),避免數(shù)據(jù)表間的 Join 操作

魚和熊掌不可兼得,在數(shù)據(jù)庫層展示的淋漓盡致!lcY28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)層拆分后架構(gòu)如下:lcY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片lcY28資訊網(wǎng)——每日最新資訊28at.com

該模型具有以下特點(diǎn):lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. 數(shù)據(jù)存儲進(jìn)行了徹底拆分;Command 和 Query 都可以靈活的選擇最合適的存儲引擎;
  2. Command 與 Query 需要引入一套同步機(jī)制以完成兩者的數(shù)據(jù)同步,常見的同步機(jī)制有:
  • 工作在應(yīng)用層基于領(lǐng)域事件的數(shù)據(jù)同步,如圖所示
  • 工作在數(shù)據(jù)層基于log的數(shù)據(jù)同步,如 MySQL 的主從同步、Canal2XX 等

數(shù)據(jù)層拆分是大型系統(tǒng)最終的歸宿,仍舊以訂單系統(tǒng)為例:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. 訂單作為一致性要求極高的系統(tǒng),Command 側(cè)首選仍舊為具有 ACID 的關(guān)系型數(shù)據(jù)庫,哪怕是分庫分表底層存儲仍舊不變;
  2. 為了滿足高性能查詢需求,需要在 Query 側(cè)引入 Redis 作為分布式緩存對訪問進(jìn)行加速;
  3. 為了滿足后臺復(fù)雜且多維度的業(yè)務(wù)查詢,需要在 Query 側(cè)引入 ES 為全文檢索進(jìn)行加速;
  4. 為了滿足各種實(shí)時報表需求,需要在 Query 側(cè)引入 TiDB 以滿足海量數(shù)據(jù)的實(shí)時檢索;

這就是我們面臨的現(xiàn)狀:“數(shù)據(jù)密集型系統(tǒng)”越來越多的應(yīng)用程序有著各種嚴(yán)格而廣泛的要求,單個工具不足以滿足所有的數(shù)據(jù)處理和存儲需求。取而代之的是,總體工作被拆分成一系列能被單個工具高效完成的任務(wù),并通過應(yīng)用代碼將它們縫合起來,通過 API 的方式,對外提供服務(wù),屏蔽內(nèi)部的復(fù)雜性。lcY28資訊網(wǎng)——每日最新資訊28at.com

7. 小結(jié)

“拆分”是“分離關(guān)注點(diǎn)”的重要手段之一。拆分的目的是將問題進(jìn)行歸類,然后采取有針對性的手段更好的解決問題。lcY28資訊網(wǎng)——每日最新資訊28at.com

CQRS 作為一種架構(gòu),將業(yè)務(wù)系統(tǒng)不同部分進(jìn)行歸類,接下來需要為 Command 和 Query 尋找最優(yōu)解決方案:lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. Command,以 DDD 作為理論基礎(chǔ)將戰(zhàn)術(shù)模型中最佳實(shí)戰(zhàn)進(jìn)行落地,包括

聚合設(shè)計lcY28資訊網(wǎng)——每日最新資訊28at.com

倉庫設(shè)計lcY28資訊網(wǎng)——每日最新資訊28at.com

LazyLoad + Context 模式lcY28資訊網(wǎng)——每日最新資訊28at.com

業(yè)務(wù)驗(yàn)證lcY28資訊網(wǎng)——每日最新資訊28at.com

領(lǐng)域事件lcY28資訊網(wǎng)——每日最新資訊28at.com

lcY28資訊網(wǎng)——每日最新資訊28at.com

  1. Query,以數(shù)據(jù)檢索和組裝作為核心能力,設(shè)計留給開發(fā)人員,實(shí)現(xiàn)留給框架,包括:
  • QueryObject 查詢對象模式
  • 內(nèi)存 Join 模式
  • 寬表&冗余表模式

本文鏈接:http://www.rrqrq.com/showinfo-26-6217-0.htmlDDD 與 CQRS 才是黃金組合

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: H5-Dooring可視化頁面制作神器測評總結(jié)

下一篇: 資損防控技術(shù)體系簡介及實(shí)踐

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
国语精品中文字幕| 欧美成人一区二区| 久久精品国产一区二区| 欧美在线播放高清精品| 一区二区三区资源| 欧美成人中文| 亚洲精品v日韩精品| 亚洲黄色大片| 午夜久久久久久| 日本欧美大码aⅴ在线播放| 久久久久久久久久久电影| 久久久久久9| 欧美福利网址| 国产在线国偷精品产拍免费yy| 国产精品国产a| 日韩欧美中文字幕制服| 99精品视频免费观看视频| 高清不卡一二三区| 视频一区国产视频| 一色桃子久久精品亚洲| 日韩一区二区三区四区五区六区| 国产精品免费在线| 91丝袜美女网| 国产在线国偷精品产拍免费yy| 亚洲免费在线观看| 亚洲精品一区二区三区精华液 | 91精品婷婷国产综合久久性色 | 久久99精品久久久| 亚洲精品国产a久久久久久| 欧美成人一区二区三区在线观看 | 久久人人爽爽爽人久久久| 欧美中文字幕一区二区三区亚洲| 狠狠色综合一区二区| 成人精品小蝌蚪| 精品一二三四区| 日韩精品视频网| 亚洲欧洲日本在线| 久久久精品国产免大香伊| 欧美久久久久久久久| 亚洲中午字幕| 一本久道久久久| 午夜日韩电影| 99热这里都是精品| 国产精品77777竹菊影视小说| 天天亚洲美女在线视频| 一区二区三区四区在线| 国产精品美女久久久久aⅴ | 久久久国产午夜精品| 日韩午夜激情电影| 欧美日本在线观看| 在线一区二区三区| 国产精品一区二区欧美| 激情另类综合| 欧美日韩国产综合视频在线| av一区二区三区四区| 国产成人亚洲综合色影视| 日韩有码一区二区三区| 亚洲成人一二三| 亚洲va在线va天堂| 亚洲影视在线观看| 一区二区三区在线视频观看| 中文字幕一区免费在线观看| 中文字幕欧美三区| 国产喷白浆一区二区三区| 久久综合视频网| 精品免费日韩av| 精品少妇一区二区| 精品国产乱码久久久久久久久| 日韩欧美一级精品久久| 日韩午夜在线观看视频| 精品欧美一区二区三区精品久久| 日韩免费视频一区二区| 精品剧情在线观看| 精品福利视频一区二区三区| 欧美电影免费观看完整版| 欧美一区二区高清| 日韩精品专区在线| 精品国一区二区三区| 久久久久久久久久看片| 日本一二三不卡| 自拍视频在线观看一区二区| 成人欧美一区二区三区小说| 亚洲人成伊人成综合网小说| 一区二区三区精品| 日韩精品欧美精品| 久久精品国产精品青草| 国产精品538一区二区在线| 成人午夜短视频| 99久久国产综合色|国产精品| 91啪亚洲精品| 亚洲高清不卡一区| 亚洲一区影院| 欧美性大战久久| 日韩一级免费观看| 久久精品视频在线看| 最新中文字幕一区二区三区| 一区二区三区中文免费| 免费精品视频最新在线| 国产激情91久久精品导航 | 日韩欧美自拍偷拍| 国产精品国产三级国产三级人妇 | 欧美国产激情二区三区| 亚洲精品国产无套在线观| 日韩高清不卡一区| 成人永久看片免费视频天堂| 欧美.www| 久久国产免费| 日韩精品一区二区三区视频播放| 亚洲国产精品99久久久久久久久| 亚洲精品中文在线影院| 日本不卡的三区四区五区| 国产福利一区在线观看| 欧美破处大片在线视频| 99riav1国产精品视频| 在线精品视频小说1| 亚洲精品在线电影| 一区二区三区在线影院| 国产精品影音先锋| 好吊色欧美一区二区三区视频| 亚洲尤物精选| 欧美一区二区三区四区久久 | 一区二区三区视频在线观看| 麻豆国产欧美日韩综合精品二区| 成人av先锋影音| 一本色道久久综合亚洲精品婷婷| 欧美在线综合视频| 国产清纯白嫩初高生在线观看91 | 蜜桃视频免费观看一区| 91麻豆精品秘密| 久久这里只有| 久久久久久电影| 午夜视黄欧洲亚洲| 99视频在线精品| 久久亚洲影院| 国产亚洲一二三区| 青青草一区二区三区| 波多野结衣一区二区三区| 国产精品一区视频| 精品国内二区三区| 午夜国产不卡在线观看视频| 成人国产精品免费观看动漫| 亚洲欧美日韩综合一区| 精品日韩av一区二区| 亚洲电影欧美电影有声小说| 国产91精品精华液一区二区三区| 国产日韩专区| 亚洲精品在线三区| 美美哒免费高清在线观看视频一区二区| 91麻豆免费在线观看| 在线欧美一区二区| 综合精品久久久| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 香蕉成人啪国产精品视频综合网| 99精品热视频| 欧美性视频一区二区三区| 国产精品久久综合| 国产二区国产一区在线观看| 国产精品有限公司| 欧美激情在线一区二区三区| 韩国一区二区三区| 免费日韩av片| 亚洲欧洲av在线| aaa国产一区| 欧美日韩黄色影视| 亚洲国产成人91porn| 女同性一区二区三区人了人一| 欧美肥妇毛茸茸| 午夜成人免费电影| 亚洲经典自拍| 欧美激情综合网| 国产成人8x视频一区二区| 久久精品日韩| 又紧又大又爽精品一区二区| 色综合色狠狠综合色| 91精品蜜臀在线一区尤物| 香蕉久久一区二区不卡无毒影院| 极品裸体白嫩激情啪啪国产精品| 26uuu另类欧美| 国产不卡视频一区二区三区| 在线视频欧美精品| 午夜精品在线看| 一本久道久久综合婷婷鲸鱼| 国产精品久久影院| 你懂的一区二区| 2023国产精品| 成人爽a毛片一区二区免费| 欧美日韩精品一区视频| 日本va欧美va欧美va精品| 香蕉久久夜色精品国产| 中文字幕一区二区三区在线播放 | 亚洲小说春色综合另类电影| 在线观看一区欧美| 国产精品嫩草99a| 91性感美女视频| 久久色在线观看| 99精品视频中文字幕| 久久亚洲私人国产精品va媚药| 国产成人在线免费| 日韩欧美色综合网站| 国产成人午夜精品影院观看视频 |