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

DDD的奇幻世界:從小積木到藝術品的設計之旅

開發 前端
在一個系統中,“元素”的數量是有限的,“元素”間的“關系”是無限的。我們需要用好流程編排這把利器,在有限“元素”基礎上,構建無限的“關系”,從而應對多變的業務場景。

1. 背景

DDD 是一個門檻很高的設計方法,里面涉及眾多概念,各概念間相互關聯相互制約,大大增加了落地的難度。但,當真正落地之后,你會發現還是有很多技巧能大幅降低學習成本,實現快速上手。

學習 DDD 最關鍵的一點便是:使用面向對象思維去思考問題。

這個說起來很抽象,面向對象其實很簡單,就像孩子們玩的樂高積木:

  • 【組件】每個小積木都有自己的形狀(對象自身功能),也都有自己的凸起或插槽(對象暴露的接口或能力);
  • 【關系】多個小積木可以組裝成一個大積木,多個大積木可以組裝成更大的積木(通過對象間的組合實現更強大的功能);
  • 【功能】多個大積木最終組成“藝術品”(通過對象間的協作實現某個功能);
  • 在 DDD 中也是一樣的:
  • 【組件】聚合根是DDD中最核心的組件,對內維護高內聚的對象集合,對外提供原子業務能力;
  • 【關系】應用服務、領域服務、領域事件 對多個組件進行編排,實現業務流程;
  • 【功能】領域內部能力 通過 應用服務 暴露給外部調用者,從而滿足業務需求;

2. 原子能力

這里的原子能力主要指的是聚合根所提供的業務方法,從業務或技術視角都是不可拆分的最小操作單元。

2.1. 聚合根

在 DDD 中,聚合根是一個重要的概念,它是一組具有內在一致性的相關對象的根,用來限制對象的邊界,可以保證聚合內部的對象間關聯關系和業務規則得到統一的管理和維護。

聚合根是聚合的一個實體,作為整個聚合的唯一入口點,通過它才能訪問整個聚合。在DDD中,聚合被定義為一組相關對象的集合,這些對象在業務上有著緊密的聯系,需要被當作一個整體來對待。聚合根是這個整體的根節點,它負責維護整個聚合的完整性和一致性。

很抽象,讓我們看個示例:

電商訂單系統主要由以下幾個實體組成:

  • 訂單(Order)。記錄用戶的一次生單,主要保存用戶、支付金額、訂單狀態等;
  • 訂單項(OrderItem)。購買的單個商品,主要保存商品單價、售價、應付金額等;
  • 支付記錄(Pay)。用戶的支付信息,包括支付渠道、支付金額、支付時間等;
  • 收貨地址(Address)。用戶的收貨地址;

這幾個實體存在非常強的一致性保障,特別是在金額方面:

  • 訂單的支付金額等于所有訂單項金額總和;
  • 支付記錄的待支付金額必須與訂單支付金額一致;

如何保障訂單、訂單項、支付記錄上的金額是強一致的呢?小心編碼+謹慎測試?

那加入更多的應用場景又該怎么處理呢?比如 優惠券、優惠活動、手工改價、調整快遞費用等,這將變成一個燙手山芋。

解決方案便是將這幾個實體作為一個整體來思考,也就是聚合的概念。

聚合是DDD的一種設計模式,它的本質是建立比對象粒度更大的邊界,聚合了那些緊密聯系的對象,形成了一個業務上的整體。

圖片圖片

如上圖所示:

  • Order、OrderItem、Pay 和 Address 不在單獨處理,而是組成了一個更大的對象,也就是聚合;
  • Order 是這個聚合的聚合根,對內協調各個對象,對外提供唯一的訪問入口;
  • OrderItem、Pay、Address 作為非聚合根的內部實體,不可直接對外提供服務,僅接受 Order 的調用;

這樣的調整,能否保障 Order、OrderItem、Pay 三者間的強一致關系呢?讓我們從代碼層面進行細致分析:

生單:

// 靜態工廠,封裝復雜的 Order 創建邏輯,并保障創建的 Order 對象是有效的
public static Order create(CreateOrderCommand createOrderCommand) {
    Order order = new Order(createOrderCommand.getUserId());
    order.setAddress(Address.create(createOrderCommand));
    order.setPay(new Pay());
    order.addItems(createOrderCommand.getItems());
    order.init();
    return order;
}

// 添加 OrderItem,并計算總金額
private void addItems(List<OrderItemDTO> items) {
    if (!CollectionUtils.isEmpty(items)){
        items.forEach(item ->{
            // orderItem.setPrice(orderItem.getPrice() * orderItem.getQuantity());
            OrderItem orderItem = OrderItem.create(item);
            this.orderItems.add(orderItem);
            this.totalSellingPrice += item.getPrice();
        });
    }
    this.totalPrice = totalSellingPrice;
    this.pay.updatePrice(this.totalPrice);
}

// 設置狀態完成對象的初始化
private void init() {
    this.status = OrderStatus.CREATED;
}

所有流程全部封裝在 Order 的靜態方法 create 上,包括:

  • 構建內部實體。根據輸入信息創建 Pay、Address 等關聯實體;
  • 金額計算。創建 OrderItem 實體并添加到集合中,在添加流程完成金額計算:

根據單價和購買數量計算 OrderItem 需付金額;

對 OrderItem 需付金額進行累計,更新 Order 的需支付金額;

將 Order 需付金額同步到 Pay 實體;

  • 設置訂單狀態。調用 init 方法,將訂單狀態設置為 CREATED;

然后看下改價流程:

public void changePrice(Long newPrice) {
    if (newPrice <= 0) {
        throw new IllegalArgumentException("金額必須大于0");
    }

    long discount = getTotalPrice() - newPrice;
    if (discount == 0){
        return;
    }
    // Item 均攤折扣
    discountForItem(discount);
    // Order 折扣
    discountForOrder(discount);
    // Pay 折扣
    syncForPay();
}

// Item 均攤
private void discountForItem(long discount) {
    Long totalAmount = getTotalPrice();
    Long allocatedDiscount = 0L;

    for (int i = 0; i < getOrderItems().size(); i++) {
        OrderItem item = getOrderItems().get(i);
        Long itemAmount = item.getSellingPrice();
        if (i != getOrderItems().size() - 1) {
            // 按比例進行均攤
            Long itemDiscount = itemAmount / totalAmount * discount;
            // 重新設置金額
            item.setPrice(item.getPrice() - itemDiscount);
            // 記錄累加金額
            allocatedDiscount += itemDiscount;
        }else {
            // 分攤余下的優惠金額到最后一個訂單
            Long lastItemDiscount = discount - allocatedDiscount;
            item.setPrice(item.getPrice() - lastItemDiscount);
        }
    }
}
// Order 折扣
private void discountForOrder(long discount) {
    Long newTotalPrice = getTotalPrice() - discount;
    setTotalPrice(newTotalPrice);
}
// 將價格同步到 Pay
private void syncForPay() {
    this.pay.updatePrice(getTotalPrice());
}

改價流程由 Order 的實體方法 changePrice 承載,核心流程如下:

  • 入參校驗。修改后的金額不可為負數;
  • Item金額均攤。按OrderItem金額對折扣信息按比例進行均攤,并更新 Item 上的應付金額;
  • Order金額更新。重新計算 Order 應付金額并對金額進行更新(也可以使用所有 Item 的金額總和);
  • Pay金額同步。將Order上的最新金額同步到 Pay 實體;

如此操作,便可以保證聚合根內各個實體對象間的強一致性關系。

那原子能力又體現在哪呢?

  • 不可分割。從業務視角,每個操作都是一個不可被拆分的最小執行單元;從技術視角,操作過程不會被打斷;
  • 不可破壞規則。必須從一個有效狀態轉換到另一個有效狀態,聚合根內多個實體間的業務規則不允許被破壞;
  • 持久化層的原子性保障。整個聚合根的狀態要么全部更新到DB,要么全不更新,不允許只更新部分信息;

聚合根上的這些“原子業務”操作形成了聚合根的生命周期,如下圖所示:

圖片圖片

這是 Order 聚合根的生命周期,每個業務操作均由以下部分組成:

  • 業務驗證。包括入參校驗、前置條件校驗;
  • 狀態或數據更新。對聚合內實體狀態或數據進行更新;
  • 領域事件發布。對外發布領域事件;

以訂單的支付成功為例:

public void paySuccess(){
    // 前置校驗
    if (getStatus() != OrderStatus.CREATED){
        throw new RuntimeException("非待支付狀態,無法操作");
    }

    // 更新狀態
    setStatus(OrderStatus.PAID);
    // 如果 OrderItem 需要更新的話進行調用
    // paySuccessForItem();

    // 發布事件
    publishEvent(new OrderPaidEvent(this));
}

2.2. 聚合根設計原則

想設計出好的聚合根非常不容易,需要豐富的經驗,更需要對領域概念有很深的認知,但有些原則可以幫助你避免不少坑:

  1. 盡量簡單。聚合根不應該包含太多的業務對象,應該保持簡單,以保證可維護性;
  2. 對內部實體提供保護。非聚合根實體或值對象只能通過聚合根來間接訪問,不能被外部直接訪問;
  3. 業務操作具備原子性。內部實體操作必須滿足聚合根的業務規則,以保證數據的一致性和完整性;
  4. 謹慎處理與其他聚合根的關系。聚合根不能包含其它聚合根的引用,聚合根之間可以通過 ID 引用來關聯,而不能直接引用其它聚合根,以避免概念的擴大;
  5. 有效的版本管理。聚合根是狀態變化的載體,為了避免并發情況下狀態不一致,需要有效的版本管理對其進行保障,比如最常見的樂觀鎖機制;
  6. 具有清晰的職責。聚合根只處理自己的領域問題,不應該處理其它聚合根的領域問題;

2.3. 聚合根的優勢

聚合根的引入會對系統產生非常大的影響,具體如下:

  1. 簡化系統架構。使用聚合根將整個領域劃分為多個聚合,可以使系統架構更加清晰。每個聚合都有自己的聚合根,聚合根之間只有松散的關聯,這樣可以降低系統的復雜度和耦合度;
  2. 提高系統性能。聚合根可以作為一組數據的操作單元,因此可以減少數據庫的訪問次數。例如,在多次更新一個聚合后,最終狀態只需要一次數據庫操作便能完成;
  3. 支持并發處理。使用聚合根可以支持更好的并發處理,聚合是一個最小的操作單元,同一聚合可以使用樂觀鎖等機制來控制并發,而聚合之間不存在共享數據可以進行并行處理;
  4. 提高可測試性。將整個領域劃分為多個聚合,可以將測試場景限定在單個聚合內,從而提高測試的可控性和可重復性;

3. 流程編排

有了小“積木塊”(聚合根上的原子業務操作),接下來就是如何將其組裝成更大的業務操作。常見的編排方式有:

  1. 應用服務。對模型中的組件進行編排,為調用者提供完整的業務能力,比如生單、改價等;
  2. 領域服務。應用服務之下,主要解決跨聚合根操作的業務流程,比如轉賬等;
  3. 事件編排。應用服務之上,對多個業務域的操作進行編排,實現聚合間、服務間的解耦,比如支付成功后需要給用戶發送短信等;

3.1. 應用服務

應用服務是DDD中重要的一層,它主要根據業務場景對流程進行編排,從而滿足不同場景對領域能力的不同訴求。應用服務位于領域層和接口層之間,對內統一協調多個組件,對外滿足不同場景下的 User Story。

下圖是應用服務所在的位置:

圖片圖片

簡單一句話形容便是:應用服務在領域模型各個組件的能力之上進行流程編排,以滿足上層不同場景下的業務需求。

應用服務使用最多的便是對單個聚合的流程編排,主要包括創建和更新:

創建流程如下:

圖片圖片

更新流程如下:

圖片圖片

兩者最大的區別在于聚合根獲取方式:

  • 創建流程,使用工廠完成復雜對象的創建,從而開啟聚合的生命周期;
  • 更新流程,使用倉庫從持久化存儲中恢復聚合對象,從而推動聚合生命周期的演進;

那這個的價值在哪呢?因為規范所以可以做到非常好的封裝,具體見代碼:

生單并改價流程編排:

@Transactional
public void createAndChangePrice(CreateOrderAndChangePriceCommand command) {
    // 1. 檢查庫存,如果足夠則進行鎖定;如果不夠,則拋出異常
    this.inventoryService.checkIsEnoughAndLock(command.getItems());

    // 2. 流程編排
    // 設置存儲倉庫
    creatorFor(this.orderRepository)
            // 配置事件發布器
            .publishBy(eventPublisher)
            // 配置聚合根初始化
            .instance(() -> Order.create(command))
            // 配置執行額外操作
            .update(order -> order.changePrice(command.getNewPrice()))
            // 執行操作
            .call();
}

支付成功流程編排:

@Transactional
public void paySuccess(Long orderId){
    // 流程編排
    // 設置存儲倉庫
    updaterFor(this.orderRepository)
            // 設置 id
            .id(orderId)
            // 配置事件發布器
            .publishBy(this.eventPublisher)
            // 未找到時拋出異常
            .onNotExist(id -> new AggregateNotFountException(id))
            // 配置業務動作
            .update(order -> order.paySuccess())
            // 執行操作
            .call();

}

代碼的可讀性得到很大的提升。

3.2. 領域服務

領域服務通常是無狀態操作,當一些職責不適合放在任何一個領域對象上時,我們可以考慮將其放在一個領域服務中。

整個流程是一個標準的業務概念,并且流程中涉及多個領域對象,當這個操作放在哪個領域對象上都不合適時,可以將其放在一個單獨的服務中,這個服務就是領域服務。

領域服務只做流程編排,不直接處理業務邏輯,業務邏輯直接調用領域模型中的其他對象。

一個例子就是轉賬,“轉賬”作為一個標準的業務概念,需要提供一個轉賬服務來承載這個領域概念。轉賬服務需要協調兩個領域對象:源賬戶和目標賬戶,源賬號做轉出,目標賬號做轉入,從而實現轉賬邏輯。

簡單的單機場景可以基于數據庫事務進行保障,具體如下:

圖片圖片

image

從嚴格意義上講,在一個事務中只能對一個聚合進行修改,這條原則更適合于分布式系統。在單機系統中,直接使用數據庫本地事務對一致性進行保障,是一種投入產出比極高的事情。

在復雜的分布式場景需要引入“協調器”來對流程進行總控,以實現系統的最終一致性,具體如下:

圖片圖片

image

【注】領域服務只做流程編排,不處理業務邏輯?。。?!

領域服務不會直接暴露給業務方使用,而是由應用服務負責協作。切記應用服務是領域模型的門面(Facade)。

領域服務是基于面向過程編程范式構建的,目的是降低領域模型之間的耦合關系。切記不要被濫用,將太多的邏輯放在領域服務中,這會導致領域服務變得臃腫和難以維護。

3.3. 領域事件編排

領域事件是一種輕量級的通信機制,聚合根可以發布領域事件來通知其他聚合根或外部系統發生了某個事件,而其他聚合根或外部系統則可以訂閱這些事件,進行相應的處理,從而推動流程向下發展。

在系統中,基于領域事件的流程編排極為重要,他是系統間解耦的利器,也是分布式環境下最終一致性的保障。

首先,看一個簡單場景:

圖片圖片

訂單支付成功后,向外發布領域事件,下游接受到領域事件后,做如下動作:

  • 為用戶發送購買成功的短信通知;
  • 為用戶增加積分;
  • 通知倉庫進行發貨;

然后,看一個更復雜的外賣場景:

圖片圖片

在分布式系統中極為常見,將事件串聯起來從而完成一個復雜的業務操作:

  • 用戶完成支付,訂單服務向外發布“支付成功”事件;
  • 餐廳服務接收到“支付成功”事件后,執行下單動作,將菜品增加到大廚的制菜清單上;
  • 餐廳做完菜后對外發送“飯菜準備好”事件;
  • 物流系統接收到“飯菜準備好”事件后,通知外賣小哥上門取餐(這點不太合適,應該是支付成功后,快遞小哥便收到通知。為了更好的描述流程,先忽略現實操作)
  • 快遞小哥完成取餐、送餐后,物流系統發出“外賣已送達”事件;
  • 訂單服務接收到“外賣已送到”事件后,更新訂單為“已完成”狀態;

不管簡單場景還是復雜場景,事件玩的就是一個連線游戲:

  • 各個系統已經提供了豐富的業務操作,也就是游戲中的“節點”;
  • MQ中間件是一個標準的橋梁,用于連接消息發送方和訂閱方,也就是游戲中的“線”;
  • 根據業務流程,將業務操作與消息發送端&消費端鏈接起來,并完成了整個業務操作;

4. 小節

在一個系統中,“元素”的數量是有限的,“元素”間的“關系”是無限的。我們需要用好流程編排這把利器,在有限“元素”基礎上,構建無限的“關系”,從而應對多變的業務場景。

  • 原子能力。主要以聚合根為中心,對外暴露的各種 原子業務操作;
  • 流程編排。通過多種手段,將原子能力和基礎設施編排起來,最終實現業務需求:

應用服務。對領域模型中的組件進行組裝,以實現不同的業務訴求;

領域服務。對于有明確的業務概念,但找不到合適的領域對象作承載的操作,可以封裝成領域服務;

領域事件編排。主要解決聚合之間、服務之間耦合問題,對于有明確的 “因果” 關系的場景最為實用;


責任編輯:武曉燕 來源: geekhalo
相關推薦

2012-06-06 09:14:45

OracleJavaAPI

2021-03-30 10:41:48

比特幣加密貨幣貨幣

2011-04-25 10:13:42

惠普打印機

2021-04-01 06:21:08

人工智能AI

2021-03-02 10:22:30

AI 數據人工智能

2021-03-18 10:48:22

漏洞黑客網絡攻擊

2024-03-13 09:00:00

人工智能Nightshade人工智能毒化

2015-10-22 11:22:53

藝客豆瓣藝術品電商

2022-09-14 15:54:59

人工智能圖像生成器數字藝術

2022-05-25 16:46:01

數據網絡

2024-09-26 19:39:23

2024-09-24 10:36:29

2025-02-05 11:43:28

2025-06-06 04:00:00

2025-05-26 01:22:00

2015-10-12 10:07:36

數據藝術市場

2014-11-12 13:22:34

2020-10-16 12:57:15

“繪畫”集群機器人

2011-08-30 22:44:11

點贊
收藏

51CTO技術棧公眾號

aaa免费在线观看| 91精品视频在线| 国产三级国产精品| 久久亚洲精品爱爱| 亚洲女同ⅹxx女同tv| 国产伦精品一区二区三区四区免费 | 日韩综合久久| 亚洲一二三区不卡| 日韩高清国产一区在线观看| 精品乱子伦一区二区| 翔田千里一区二区| 久久国产精品电影| av中文字幕免费观看| 国产精品久久久久久久久久辛辛| 狠狠综合久久av一区二区小说| 亚洲视频sss| 天天射天天操天天干| 麻豆精品一二三| 国内精品国产三级国产在线专| 久久精品色妇熟妇丰满人妻| 精品一区二区男人吃奶| 欧美男生操女生| 国产91对白刺激露脸在线观看| 久久99精品久久久久久野外| xnxx国产精品| 国产另类自拍| 国产suv一区二区| 青青国产91久久久久久| 97精品视频在线播放| 超碰手机在线观看| 操欧美老女人| 亚洲欧美在线x视频| 国产欧美视频一区| 国产一区二区三区亚洲综合| 色久优优欧美色久优优| www.日本在线播放| 婷婷色在线播放| 中文字幕中文字幕在线一区| 欧美日韩综合网| 污视频在线免费观看| 国产成人福利片| 91九色视频在线观看| 一区二区三区午夜| 久久国产精品区| 国产美女久久精品香蕉69| 精品久久久久久久久久久久久久久久久久 | 精品亚洲porn| 成人国产精品一区二区| 最近中文字幕在线免费观看| 久久久久久久欧美精品| 欧美在线视频一区二区| 91九色丨porny丨肉丝| 亚洲精品欧洲| 91成人性视频| 精品成人av一区二区在线播放| 亚洲国产精品一区| 久久免费高清视频| 久久精品国产亚洲AV无码男同| 午夜视频一区| 国模精品视频一区二区三区| 欧美不卡视频在线观看| 一本色道久久综合| 26uuu另类亚洲欧美日本老年| 波多野结衣国产| 午夜亚洲性色视频| 日本一区二区在线播放| 欧美男人天堂网| 久久精品国产99| 亚洲自拍欧美色图| 亚洲国产精品国自产拍久久| 不卡一区二区三区四区| 美女主播视频一区| 成人在线观看一区| 中文字幕一区二区三区四区不卡 | 1区1区3区4区产品乱码芒果精品| wwwxxxx国产| 91看片淫黄大片一级在线观看| 欧美一区二区三区在线免费观看| 成人高清网站| 一区二区三区在线观看网站| 国产精品久久中文字幕| 日韩在线观看不卡| 911精品产国品一二三产区| 国产a级片视频| 伊人久久大香线蕉av不卡| 在线精品91av| 久久久久免费看| 久久狠狠一本精品综合网| 国产精品网站入口| 成人av无码一区二区三区| av一区二区三区黑人| 日韩欧美精品一区二区| 动漫一区在线| 欧美性xxxxx极品娇小| 欧美精品久久久久久久久25p| 日韩精品一区二区三区中文字幕| 精品视频一区在线视频| 中文字幕资源站| 亚洲欧洲综合| 国产日韩在线一区| 蜜臀久久99精品久久久| 中文字幕免费不卡| 欧洲精品一区二区三区久久| 91精品店在线| 亚洲精品电影网站| 黄色录像免费观看| 亚洲影院一区| 97se亚洲综合| 午夜国产福利在线| 高潮白浆女日韩av免费看| 五月天激情播播| 免费看成人哺乳视频网站| 久久影院免费观看| 日韩国产亚洲欧美| 99久久久精品免费观看国产蜜| 一区二区视频国产| 亚洲风情在线资源| 精品国产免费人成电影在线观看四季| 亚洲欧美va天堂人熟伦| 一本不卡影院| 国产高清在线一区| 顶级网黄在线播放| 欧美日韩国产一级二级| 好吊日免费视频| 亚洲午夜在线| 国产一区深夜福利| 国际av在线| 精品日韩视频在线观看| 久久久久亚洲av成人网人人软件| 婷婷综合视频| 国产噜噜噜噜久久久久久久久| 黄色av免费在线看| 欧美色另类天堂2015| 极品白嫩的小少妇| 欧美日韩国产亚洲一区| 国产日韩欧美在线| av播放在线| 在线影视一区二区三区| 国产福利短视频| 亚洲免费播放| 精品国产乱码久久久久久久软件| 色婷婷在线播放| 日韩一本二本av| 日本少妇高清视频| 国产精选一区二区三区| 伊人情人网综合| 日本精品久久| 久久视频在线视频| 国产精品久久影视| 国产精品成人免费在线| 国内av一区二区| 中文字幕免费一区二区| 亚洲最大福利视频网| 日本不卡影院| 精品国产伦理网| 日韩av免费网址| 99精品视频在线观看免费| 成人黄色av片| 国产成人短视频在线观看| 国产精品成人aaaaa网站| 丁香在线视频| 欧美日韩精品高清| 国产性xxxx| 国产精品69毛片高清亚洲| 欧美人与动牲交xxxxbbbb| 国产 日韩 欧美 综合 一区| 97久久精品国产| 免费在线视频你懂得| 欧美综合一区二区| 国精品人伦一区二区三区蜜桃| 精品一区二区三区欧美| 激情五月六月婷婷| 九色丨蝌蚪丨成人| 国产成人亚洲综合91| 亚洲视频tv| 日韩视频一区在线观看| 日韩免费av片| 国产情人综合久久777777| 中文字幕在线视频一区二区三区| 午夜精品婷婷| 欧美精品一区二区视频| 日韩精品一页| 午夜免费日韩视频| 成a人片在线观看www视频| 337p亚洲精品色噜噜噜| 91av在线免费视频| 中文字幕av不卡| 美国黄色一级视频| 日本特黄久久久高潮| 神马午夜伦理影院| 色婷婷久久久| 91九色蝌蚪嫩草| 色8久久影院午夜场| 久久中文字幕国产| 日韩欧美电影在线观看| 这里只有精品电影| www.日本精品| 亚洲男同1069视频| wwwwww日本| 国产麻豆成人传媒免费观看| 岳毛多又紧做起爽| 中文乱码免费一区二区三区下载| 久久久久久久久久久久久久一区| 在线视频成人| 日本中文字幕不卡免费| 性网站在线观看| 一区二区在线视频| 黄色一级a毛片| 欧美久久久久久久久| 日本免费在线观看视频| 亚洲一区视频在线| 亚洲色图 激情小说| 成人国产精品免费观看视频| 黄色小视频免费网站| 乱码第一页成人| 妞干网在线观看视频| 永久91嫩草亚洲精品人人| 日本高清视频一区二区三区| 国产亚洲成av人片在线观黄桃| 国产精品久久久久久亚洲影视| www成人免费观看| 欧美黄色www| av片在线观看网站| 色婷婷av一区二区三区在线观看| 天堂а在线中文在线无限看推荐| 日韩美女一区二区三区四区| 一级特黄aaa大片在线观看| 色av成人天堂桃色av| 成人毛片18女人毛片| 亚洲aaa精品| 国产亚洲第一页| 亚洲精品日韩综合观看成人91| 特黄一区二区三区| 亚洲国产精品精华液ab| 亚洲无人区码一码二码三码的含义| 99精品欧美一区二区三区综合在线| 成人做爰69片免费| 国产精品一品视频| 国产探花一区二区三区| 国产一区三区三区| 日本77777| 激情综合色丁香一区二区| 久热精品在线播放| 日本特黄久久久高潮| 91香蕉视频污版| 日韩av电影一区| 欧美伦理片在线看| 日本亚洲三级在线| 在线免费视频一区| 日本特黄久久久高潮| 手机看片一级片| 国产在线精品免费| 激情在线观看视频| 国产伦精品一区二区三区视频青涩| 亚洲天堂av一区二区| 国产一本一道久久香蕉| 成人在线短视频| 成人一二三区视频| 星空大象在线观看免费播放| 久久综合九色综合欧美98| 久久国产柳州莫菁门| 国产精品卡一卡二| 久久高清内射无套| 亚洲一区二区三区美女| 精品成人免费视频| 色先锋资源久久综合| 中国a一片一级一片| 91麻豆精品国产91久久久久| 亚洲成a人片在线| 日韩电影免费观看中文字幕| 国产精品一区二区三区四区色| 色悠悠久久88| 影音先锋男人资源在线| 97精品免费视频| h1515四虎成人| 91九色蝌蚪嫩草| 亚洲+变态+欧美+另类+精品| 色中色综合成人| 欧美激情五月| 欧美成人黑人猛交| 精品一二三四区| 欧美大片免费播放器| 国产欧美一区二区三区网站| 国内偷拍精品视频| 欧美日韩国产限制| 91亚洲视频在线观看| 精品国产乱码久久| 韩日在线视频| 欧美另类暴力丝袜| 日韩电影免费观| 91久久偷偷做嫩草影院| 天海翼精品一区二区三区| 一区二区不卡在线观看| 亚洲日本成人| 思思久久精品视频| 91麻豆国产香蕉久久精品| 国产性生活大片| 一本到三区不卡视频| www夜片内射视频日韩精品成人| 亚洲精品永久免费| 26uuu亚洲电影在线观看| 国产精品91视频| 久久1电影院| 美女黄色片网站| 久久精品中文| 波多野结衣加勒比| 亚洲人成网站色在线观看| 国产精品男女视频| 日韩欧美亚洲国产另类| 超碰免费在线观看| 2020久久国产精品| 久久爱www.| 亚洲精品一区二区三区蜜桃久| 亚洲久久在线| 韩国三级与黑人| 成人免费一区二区三区在线观看| 久久国产视频播放| 欧美不卡激情三级在线观看| 久久久久久国产精品免费无遮挡| 国产精品18久久久久久首页狼| 国产精品三p一区二区| 久久久久亚洲av无码专区喷水| 日本在线不卡视频| av男人的天堂av| 精品久久久久久国产91| 亚洲毛片欧洲毛片国产一品色| 久久亚洲精品毛片| 日日夜夜精品| 三年中文高清在线观看第6集| 日产欧产美韩系列久久99| 男人天堂av电影| 欧美网站在线观看| 亚洲av电影一区| 国内免费久久久久久久久久久 | 成人在线观看免费完整| 欧美日韩不卡一区| 色哟哟免费在线观看| 国产精品久久久久久久久久久久久久 | 青春草免费视频| 欧美一区二区三区视频在线观看| 欧美r级在线| 国产日韩欧美在线观看| 欧美高清在线| 波多野结衣在线免费观看| 亚洲欧美自拍偷拍色图| 国产精品毛片一区视频播| 久久久精品免费视频| 国产精品国产三级在线观看| 穿情趣内衣被c到高潮视频| 国产一区欧美二区| 免费看一级一片| 精品国产一二三| 国产夫妻在线| 欧美日韩国产高清视频| 日韩精品91亚洲二区在线观看 | 久久久久中文字幕亚洲精品| 一区二区三区 在线观看视频| 乱色精品无码一区二区国产盗| 欧美黑人巨大xxx极品| 全国精品免费看| 999香蕉视频| 中文字幕一区二区视频| 精品久久久中文字幕人妻| 欧美国产在线电影| 少妇精品导航| 男女男精品视频站| 亚洲欧美日韩小说| 狠狠躁日日躁夜夜躁av| 欧美亚洲午夜视频在线观看| 欧美日韩第一| 中文字幕一区二区在线观看视频| 有码一区二区三区| 五月婷婷激情在线| 国产精品久久久精品| 中文字幕乱码亚洲无线精品一区 | 精品按摩偷拍| 久久人妻精品白浆国产 | 特级黄色录像片| 99久久精品国产导航| 无码人妻久久一区二区三区不卡| 日韩综合视频在线观看| 国产精品亚洲四区在线观看| 国产综合中文字幕| 国产精品视频在线看| 午夜精品久久久久久久第一页按摩 | 日韩免费一区二区三区| 国产精品一区二区久激情瑜伽| 天天综合网久久综合网| 日韩一级裸体免费视频| 精品视频高潮| 天天综合网久久| 午夜一区二区三区视频| 欧美jizzhd欧美| 久久国产精品-国产精品| 美女高潮久久久| 日韩av免费网址| 久久av.com| 久久丫精品久久丫| 国产在线不卡一区| 免费一级特黄特色大片|