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

“解耦神器”之SpringEvents領(lǐng)域事件

開發(fā) 前端
領(lǐng)域事件是一種用于表示領(lǐng)域模型中發(fā)生的重要事件的機(jī)制。它們用于通知其他相關(guān)的聚合或服務(wù),以便它們可以采取相應(yīng)的行動。

大家好,我是Jensen。一個想和大家一起打怪升級的程序員朋友。

在DDD項目的落地過程中,除了聚合、模型等等重要概念,領(lǐng)域事件在其中扮演了一個非常重要的角色,它不僅能解耦領(lǐng)域?qū)优c其他層,作為“跳出”領(lǐng)域?qū)拥奶澹€是一種策略模式的高級用法。即便你的項目沒有DDD,領(lǐng)域事件在傳統(tǒng)的MVC分層架構(gòu)也大有妙用。

下面我們一起來解鎖這個“解耦神器”。

1.什么是領(lǐng)域事件

領(lǐng)域事件是一種用于表示領(lǐng)域模型中發(fā)生的重要事件的機(jī)制。它們用于通知其他相關(guān)的聚合或服務(wù),以便它們可以采取相應(yīng)的行動。

領(lǐng)域事件通常由聚合根( Aggregate Root)發(fā)布。當(dāng)聚合根內(nèi)部發(fā)生重要的狀態(tài)更改時,它會發(fā)布一個領(lǐng)域事件。其他聚合或服務(wù)可以訂閱這些事件,并在事件發(fā)生時采取相應(yīng)的行動。

以下是使用領(lǐng)域事件的四大步:

  • 定義領(lǐng)域事件:領(lǐng)域事件是一個簡單的對象,它包含事件的名稱、發(fā)生時間和相關(guān)的數(shù)據(jù)。例如,一個訂單已完成的領(lǐng)域事件可能包含訂單的 ID 和完成時間。
  • 發(fā)布領(lǐng)域事件:當(dāng)聚合根內(nèi)部發(fā)生重要的狀態(tài)更改時,它會發(fā)布一個領(lǐng)域事件。例如,當(dāng)訂單完成時,訂單聚合根會發(fā)布一個 OrderCompletedEvent 事件。
  • 訂閱領(lǐng)域事件:其他聚合或服務(wù)可以訂閱領(lǐng)域事件,并在事件發(fā)生時采取相應(yīng)的行動。例如,一個訂單跟蹤服務(wù)可以訂閱 OrderCompletedEvent 事件,并在訂單完成時發(fā)送通知給客戶。
  • 處理領(lǐng)域事件:當(dāng)領(lǐng)域事件被發(fā)布時,訂閱者會收到通知,并可以根據(jù)事件的數(shù)據(jù)采取相應(yīng)的行動。例如,訂單跟蹤服務(wù)可以在收到 OrderCompletedEvent 事件時發(fā)送通知給客戶。

領(lǐng)域事件的使用可以幫助保持領(lǐng)域模型的解耦和一致性。通過使用領(lǐng)域事件,不同的聚合或服務(wù)可以獨立地處理事件,而不需要直接相互依賴。這有助于提高系統(tǒng)的可維護(hù)性和靈活性。

(以上內(nèi)容由豆包AI生成,描述還是蠻契合的,理由我就不過多掩飾了)

2.領(lǐng)域事件的定義、發(fā)布與訂閱

在DDD工程中,領(lǐng)域事件定義在領(lǐng)域?qū)樱唧w來說是放在領(lǐng)域契約下面,如:domain.contract.event,它不屬于某個聚合私有,由該系統(tǒng)下的所有聚合共享。

為什么要這樣劃分呢?

我認(rèn)為,領(lǐng)域事件不僅能在領(lǐng)域?qū)影l(fā)布,也可能在應(yīng)用層發(fā)布,甚至在接入層發(fā)布,而在領(lǐng)域聚合之外發(fā)布的事件,必然會存在跨聚合的事件屬性。

我舉個預(yù)約的場景:

工單中臺下的預(yù)約業(yè)務(wù)需要設(shè)計一個支付回調(diào)接口,由商城系統(tǒng)支付成功后進(jìn)行回調(diào),此時商城系統(tǒng)傳入的回調(diào)命令參數(shù)在處理完核心業(yè)務(wù)后(如設(shè)置預(yù)約單狀態(tài)為待服務(wù)),再發(fā)布支付回調(diào)成功事件,以執(zhí)行后續(xù)的非核心業(yè)務(wù)邏輯(比如提醒服務(wù)店員需要聯(lián)系客戶到店等等)。

工單中臺和商城系統(tǒng)已然進(jìn)行了服務(wù)拆分,工單中臺本身并不包含支付業(yè)務(wù),領(lǐng)域?qū)樱ㄈ珙I(lǐng)域服務(wù))并沒有發(fā)布這個支付回調(diào)成功的事件的入口,那么,發(fā)布領(lǐng)域事件的最佳位置是在應(yīng)用層。

至此,事件的定義、事件的發(fā)布已經(jīng)確定好了位置,但事件在哪里訂閱也有講究。

我在DDD落地過程中,曾多次調(diào)整領(lǐng)域事件訂閱的位置,有試過放在領(lǐng)域?qū)泳酆舷旅妫灿性囘^抽取到SDK工程里,最終在前段時間確定下來了,事件訂閱就放在應(yīng)用層的listener包下面,意為事件監(jiān)聽器。

至于命名規(guī)則,需要看系統(tǒng)的復(fù)雜度,一般小而美的微服務(wù),以聚合Listener或以外部系統(tǒng)Listener命名足以,如工單中臺(WorkOrder)下的預(yù)約領(lǐng)域聚合(Appointment),其監(jiān)聽器以AppointmentListener命名,訂單領(lǐng)域聚合(Order)是商城系統(tǒng)(如Mall)外部聚合,其監(jiān)聽器以MallListener命名而非OrderListener。

特別強(qiáng)調(diào)一點,在高內(nèi)聚的架構(gòu)設(shè)計中,外部系統(tǒng)的調(diào)用不會設(shè)計特別多,如果存在大量的跨系統(tǒng)交互,我們該反思一下是不是微服務(wù)拆分得太細(xì)了,大量的外部系統(tǒng)調(diào)用會存在跨線程的分布式事務(wù)等問題等。

當(dāng)然,隨著業(yè)務(wù)快速發(fā)展,系統(tǒng)復(fù)雜度隨之上升,事件監(jiān)聽listener也可能跟著拆分,這時候我們的原則還是往大了拆,不宜拆得太細(xì)。

對于非DDD工程,可以考慮在根目錄定義一個event包,包括entity和listener:entity下定義領(lǐng)域事件,listener下定義領(lǐng)域事件監(jiān)聽器,這樣一來我們寫代碼就更加簡單清晰。

3.領(lǐng)域事件解耦實戰(zhàn)

下圖是我在DDD工程落地的案例,我們要先約定好代碼放哪里才能更好地規(guī)劃后續(xù)的編碼工作。

上面所說的領(lǐng)域事件,一直停留在概念層面,事件的發(fā)布訂閱只是設(shè)計模式,那具體要怎么實現(xiàn),才是核心技術(shù)。

發(fā)布訂閱有很多種實現(xiàn)方式,如Java自帶的觀察者模型java.util.Observer,事件驅(qū)動模型java.util.EventListener,還有基于第三方跨線程的消息隊列模型(如Kafka、RabbitMQ、RocketMQ、Redis等),以及Spring的發(fā)布訂閱模型SpringEvents。

在這里,我認(rèn)為領(lǐng)域事件在工程內(nèi)部解耦即可,用不上第三方跨線程的MQ模型,所以我選了SpringEvents作為發(fā)布訂閱的底層實現(xiàn),而且Spring事件有個好處,它可以在Idea工具中鏈接消息發(fā)布和訂閱,對于編程還是非常友好的。

在系統(tǒng)內(nèi)部事件滿天飛的情況下,解耦完還能保證代碼可讀性,可謂是錦上添花。

SpringEvents的常規(guī)打開方式:

  • 定義事件:定義一個事件類,該類應(yīng)該繼承自ApplicationEvent類。你可以在事件類中添加任何需要的數(shù)據(jù),這些數(shù)據(jù)將在事件發(fā)布時傳遞給訂閱者。
  • 發(fā)布事件:使用ApplicationEventPublisher發(fā)布事件。你可以通過ApplicationContext獲取ApplicationEventPublisher實例,并使用其publishEvent方法發(fā)布事件。
  • 訂閱事件:使用@EventListener注解來訂閱事件。將@EventListener注解應(yīng)用于一個方法上,并指定要訂閱的事件類型。該方法將在事件發(fā)布時被調(diào)用,并接收事件對象作為參數(shù)。

領(lǐng)域事件還要解決一個問題,如果我們通過@Async+@EventListener實現(xiàn)異步監(jiān)聽,需要跨線程傳遞信息,那我們就要對領(lǐng)域事件做一層小小的封裝了。

首先,寫一個領(lǐng)域事件抽象類,該類由其他事件繼承:

public abstract class DomainEvent extends ApplicationEvent {
    // 本地線程變量池,用于存儲跨線程信息
    private final Map<String, Object> THREAD_LOCALS = ThreadContext.getValues();
    /**
     * 領(lǐng)域事件構(gòu)造器
     *
     * @param source 事件內(nèi)容
     * @param <T>    任意類型
     */
    public <T> DomainEvent(T source) {
        super(source);
    }
    /**
     * 獲取事件內(nèi)容
     *
     * @param <T> 任意類型
     * @return 事件內(nèi)容
     */
    public <T> T get() {
        ThreadContext.setValues(THREAD_LOCALS);
        return (T) super.getSource();
    }
    /**
     * 租戶判斷
     * 使用方式:監(jiān)聽方法標(biāo)注@EventListener(condition = "#event.tenantIn('xxx', 'xxx')")
     *
     * @param tenantIds 指定租戶ID才能訂閱
     * @return 該租戶能否監(jiān)聽
     */
    public boolean tenantIn(String... tenantIds) {
        ThreadContext.setValues(THREAD_LOCALS);
        String tenantId = ThreadContext.getOrDefault("tenant-id", "");
        return Arrays.asList(tenantIds).contains(tenantId);
    }
}

以上代碼,把本地線程變量存進(jìn)了領(lǐng)域事件內(nèi),在監(jiān)聽器獲取事件內(nèi)容時,把本地線程變量塞到另一個線程里。

細(xì)心的同學(xué)發(fā)現(xiàn),該類封裝的tenantIn方法有什么作用?

這是為了控制指定的租戶才能監(jiān)聽到該事件,比如某個租戶需要監(jiān)聽下單完成后,推到他自己的ERP系統(tǒng),但是其他租戶并沒有這個需求,那么我們就可以使用這種方式控制不同租戶的行為,這樣解耦也不會對業(yè)務(wù)主流程產(chǎn)生太大影響。

除了SaaS系統(tǒng)的租戶隔離監(jiān)聽,我們也可以利用這一特性做些別的策略。

以上代碼我們再抽象一輪:

/**
 * 領(lǐng)域事件
 * 1. 異步事件透傳線程變量
 * 2. 租戶策略
 * 3. 條件策略
 */
public abstract class DomainEvent extends ApplicationEvent {
    // 本地線程變量池,用于存儲跨線程信息
    private final Map<String, Object> THREAD_LOCALS = ThreadContext.getValues();
    /**
     * 領(lǐng)域事件構(gòu)造器
     *
     * @param source 事件內(nèi)容
     * @param <T>    任意類型
     */
    public <T> DomainEvent(T source) {
        super(source);
    }
    /**
     * 獲取事件內(nèi)容
     *
     * @param <T> 任意類型
     * @return 事件內(nèi)容
     */
    public <T> T get() {
        ThreadContext.setValues(THREAD_LOCALS);
        return (T) super.getSource();
    }
    /**
     * 租戶判斷
     * 使用方式:監(jiān)聽方法標(biāo)注@EventListener(condition = "#event.tenantIn('xxx', 'xxx')")
     *
     * @param tenantIds 指定租戶ID才能訂閱
     * @return 該租戶能否監(jiān)聽
     */
    public boolean tenantIn(String... tenantIds) {
        ThreadContext.setValues(THREAD_LOCALS);
        String tenantId = ThreadContext.getOrDefault("tenant-id", "");
        return Arrays.asList(tenantIds).contains(tenantId);
    }
    // 監(jiān)聽者能否執(zhí)行的條件,用于控制事件監(jiān)聽器能否執(zhí)行(策略模式)
    private Collection supports;
    /**
     * 領(lǐng)域事件構(gòu)造器
     *
     * @param source   事件內(nèi)容
     * @param supports 支持執(zhí)行的條件,配合supports方法使用
     * @param <T>      任意類型
     */
    public <T> DomainEvent(T source, Collection supports) {
        super(source);
        this.supports = supports;
    }
    /**
     * 條件判斷(策略模式)
     * 使用方式:監(jiān)聽方法標(biāo)注@EventListener(condition = "#event.supports('xxx', 'xxx')")
     *
     * @param supports 支持的類型
     * @param <T>      任意類型
     * @return 該條件下能否監(jiān)聽
     */
    public <T> boolean supports(T... supports) {
        if (this.supports == null) return false;
        ThreadContext.setValues(THREAD_LOCALS);
        List<T> supportList = Arrays.asList(supports);
        for (Object support : this.supports) {
            if (supportList.contains(support)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 發(fā)布事件,方便但降低代碼可讀性
     * 建議使用原生的SpringContext.getApplicationContext().publishEvent()方法
     */
    public void publish() {
        SpringContext.getApplicationContext().publishEvent(this);
    }
}

我們加入了新的成員變量supports,有什么作用呢?來看一個消息中心的例子就一目了然。

業(yè)務(wù)需求是:消息中心需要寫一個事件發(fā)布的接口,聚合站內(nèi)信、極光推送、小程序訂閱消息、公眾號模板消息、郵件、短信功能等等,并且后續(xù)支持?jǐn)U展。

首先設(shè)計一下整個消息中心,DDD領(lǐng)域圖如下:

對應(yīng)的領(lǐng)域事件定義和監(jiān)聽器:

領(lǐng)域事件定義

public class PublishEventMessageEvent extends DomainEvent {
    public PublishEventMessageEvent(EventMessage eventMessage) {
        super(eventMessage, Collections.singleton(eventMessage.getPushChannel()));
    }
}

發(fā)布事件的核心代碼:

// 存儲事件消息
EventMessage eventMessage = EventMessage.builder().eventCode(messageDefine.getEventCode()).notify(messageDefine.getNotify())
  .pushChannel(pushChannel).content(contentCopy).target(targetCopy)
  .categoryCode(messageDefine.getCategoryCode()).categoryName(messageDefine.getCategoryName())
  .pushConfig(messageDefine.getPushConfig())
  .build();
eventMessage.save();
// 發(fā)布事件消息事件
SpringContext.getApplicationContext().publishEvent(new PublishEventMessageEvent(eventMessage));

事件消息事件監(jiān)聽器:

/**
 * 極光推送監(jiān)聽器
 */
@Component
public class JPushListener {
    /**
     * 發(fā)送極光消息
     *
     * @param event
     */
    @EventListener(condition = "#event.supports('jpush')")
    public void sendJPushMessage(PublishEventMessageEvent event) {
        EventMessage eventMessage = event.get();
        // 下面是核心的推送邏輯
    }
}

上面以極光推送監(jiān)聽器為例,其他監(jiān)聽器也是同樣的實現(xiàn)方式,后續(xù)如果還有別的推送實現(xiàn),再寫一個推送監(jiān)聽器即可,消息定義里把對應(yīng)的推送通道pushChannel給加上。

需要注意的是,使用事件作為策略模式,一般是單向的通知,不宜接收監(jiān)聽器的返回結(jié)果做后續(xù)處理。你可能會說,那可以在事件的數(shù)據(jù)里定義返回值啊,方法層傳遞引用對象就行了,但再細(xì)想一下,如果在推送監(jiān)聽器上做了異步處理,那由事件發(fā)布者處理這個結(jié)果就變得不可控了。

4.寫在最后

基于SpringEvents實現(xiàn)的領(lǐng)域事件作為一種跨層解耦的手段,可以讓我們的代碼可讀性變得更高,擴(kuò)展性更強(qiáng),無論新老項目都是使用即見效的舉措。

上述領(lǐng)域事件DomainEvent已集成到我的D3Boot開源基礎(chǔ)框架,大家需要可以移步Gitee抄作業(yè)。

Gitee源碼地址:

https://gitee.com/jensvn/d3boot(例行賒Star)

D3boot基礎(chǔ)框架具體的使用方式見源碼的README.md文件,這里不再贅述。

責(zé)任編輯:姜華 來源: 架構(gòu)師修行錄
相關(guān)推薦

2023-09-26 01:18:55

解密系統(tǒng)業(yè)務(wù)

2017-12-26 15:52:31

MQ互聯(lián)網(wǎng)耦合

2022-09-02 08:23:12

軟件開發(fā)解耦架構(gòu)

2024-11-15 11:01:45

2021-08-27 08:44:52

MQ架構(gòu)耦合

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構(gòu)工具和方案

2012-07-10 01:47:14

代碼架構(gòu)設(shè)計

2020-11-20 15:22:32

架構(gòu)運(yùn)維技術(shù)

2025-05-20 07:13:22

Spring異步解耦Event

2021-03-10 05:50:06

IOCReact解耦組件

2022-04-15 11:46:09

輕量系統(tǒng)解耦鴻蒙操作系統(tǒng)

2023-11-20 23:02:36

Spring系統(tǒng)

2018-04-18 08:47:17

Alluxio構(gòu)建存儲

2025-06-27 02:33:00

ServiceSpring事件

2022-12-28 07:45:17

2022-06-07 07:58:16

流程解耦封裝

2017-11-15 09:32:27

解耦戰(zhàn)術(shù)架構(gòu)

2012-10-12 14:28:32

BYOD安全網(wǎng)絡(luò)

2020-10-16 18:41:43

command設(shè)計模式代碼
點贊
收藏

51CTO技術(shù)棧公眾號

91精品国产综合久久久蜜臀九色| 国产xxxxxxxxx| 免费观看a视频| 国产日韩欧美一区在线| 一本色道久久88综合日韩精品 | 日韩亚洲欧美综合| 欧美精品久久久久久久免费| 成人在线观看网站| 国产伦理精品不卡| 欧美怡春院一区二区三区| 精品熟妇无码av免费久久| 一区二区三区欧洲区| 色偷偷一区二区三区| 久久久99精品视频| 九九在线视频| 成人免费电影视频| 成黄免费在线| 欧美特级特黄aaaaaa在线看| 久久在线播放| 精品成人一区二区| 亚洲免费看av| 僵尸再翻生在线观看免费国语| 国产精品你懂的在线| 国产一区二区三区奇米久涩| 在线视频欧美亚洲| 老鸭窝亚洲一区二区三区| 久久国产精品影视| 欧美人与禽zoz0善交| 狼人天天伊人久久| 日韩欧美在线综合网| 蜜臀av免费观看| 一区二区精品伦理...| 亚洲夂夂婷婷色拍ww47| 一区二区精品在线| 国产三级在线| 91免费版在线看| 高清视频一区| 精品女同一区二区三区| 久久综合综合久久综合| 国产97人人超碰caoprom| 中文在线观看免费网站| 欧美日韩福利| 久久国产精品免费视频| 国内毛片毛片毛片毛片毛片| 精品国产一区一区二区三亚瑟| 亚洲精品视频免费| 国产成人无码一区二区在线观看 | 色94色欧美sute亚洲线路一久| 免费网站永久免费观看| 最新国产在线拍揄自揄视频| 国产精品成人免费精品自在线观看| 欧洲精品在线一区| 青青视频在线观| 91香蕉视频污在线| 好看的日韩精品| 欧洲成人一区二区三区| 国产91精品一区二区麻豆网站| 91在线免费视频| 91久久精品无码一区二区| 美日韩一级片在线观看| 国产精自产拍久久久久久蜜| 国产又粗又猛又黄视频| 日韩精品一卡二卡三卡四卡无卡| 国产成人精品电影久久久| 国产欧美一区二区三区在线看蜜臂| 99视频+国产日韩欧美| 97欧美精品一区二区三区| 久久久国产高清| 国产欧美日韩亚洲一区二区三区| 91爱视频在线| 特级西西444www大胆免费看| 蜜桃免费网站一区二区三区| 91精品久久久久久久久久久| av中文字幕观看| 丁香婷婷综合五月| 国产三区精品| 男操女在线观看| 国产精品卡一卡二卡三| 综合久久国产| 好久没做在线观看| 欧美午夜女人视频在线| 三级视频中文字幕| 高清不卡一区| 亚洲精品国精品久久99热一| 久久精品视频18| 99精品综合| 久久久久久久电影一区| 久草手机在线视频| 青青草国产成人av片免费| 91影视免费在线观看| 日韩中文字幕综合| 中文字幕国产一区| 国产一区二区三区乱码| 欧洲亚洲两性| 日韩欧美一区二区免费| 97伦伦午夜电影理伦片| 91精品国产乱码久久久久久| 性日韩欧美在线视频| 日韩免费视频网站| 久久电影网站中文字幕| 成人免费91在线看| bbbbbbbbbbb在线视频| 一级女性全黄久久生活片免费| av免费观看网| 国产精品毛片aⅴ一区二区三区| 亚洲福利视频网站| 91视频免费看片| 在线一区免费观看| 91麻豆蜜桃| 超碰97在线免费观看| 亚洲一线二线三线视频| 亚洲一区在线不卡| 亚洲区小说区图片区qvod按摩| 久久精品国产96久久久香蕉| 久久久久久91亚洲精品中文字幕| 韩国精品一区二区| 欧美日韩一区在线观看视频| 亚洲精品天堂| 欧美美女bb生活片| 欧美激情亚洲色图| 国产亚洲在线| 成人动漫视频在线观看完整版| eeuss影院在线观看| 欧美日韩午夜剧场| 欧美成人精品一区二区综合免费| 日韩情爱电影在线观看| 日本欧美中文字幕| 无套内谢的新婚少妇国语播放| 亚洲色图一区二区三区| 九九热在线免费| 亚洲小说图片| 91av国产在线| 免费国产精品视频| 一区二区久久久久久| 亚洲欧美偷拍另类| 不卡在线一区二区| 国产91免费看片| 久青草国产在线| 精品女同一区二区三区在线播放| 中文字幕制服丝袜| 国产精品v日韩精品v欧美精品网站 | 成人自拍视频在线| 国产系列第一页| 日韩毛片免费看| 中文字幕在线日韩| 亚洲手机在线观看| 亚洲欧洲一区二区在线播放| 亚洲xxxx2d动漫1| 国产一区二区欧美| 国产91精品在线播放| 国产乱理伦片a级在线观看| 色乱码一区二区三区88| 欧美大波大乳巨大乳| 爽好多水快深点欧美视频| 人禽交欧美网站免费| 人人鲁人人莫人人爱精品| 国产亚洲a∨片在线观看| 免费的毛片视频| 国产日韩精品一区二区三区| 手机在线免费观看毛片| 日韩精品免费一区二区在线观看| 国产日产亚洲精品| 最新av在线播放| 精品国产乱码久久久久久图片 | 国产欧美一区二区在线播放| 91桃色在线观看| 日韩精品在线看| 欧美日韩在线视频播放| 中文字幕av资源一区| 五月激情五月婷婷| 狠狠色丁香久久综合频道| 久久青青草综合| 亚洲四虎影院| 久久久国产精品免费| 亚洲精品久久久久avwww潮水| 亚洲一区免费观看| 9.1成人看片免费版| 男男成人高潮片免费网站| 免费观看黄色大片| 嫩草国产精品入口| 国产精品嫩草影院久久久| 国产在线观看a| 亚洲国产成人久久综合| 国产91国语对白在线| 1区2区3区精品视频| 精品人妻伦一二三区久| 日韩激情中文字幕| 黑人巨茎大战欧美白妇| 亚洲桃色综合影院| 亚洲va欧美va国产综合剧情| 五月花成人网| 亚洲欧美一区二区三区在线 | 精品一区二区成人精品| 国产1区2区3区中文字幕| 亚洲黄色录像| 亚洲一区二区免费在线| 亚洲黄色网址| 色噜噜狠狠色综合网图区| 亚洲免费成人在线| 欧美色图12p| 中文字幕一区二区三区精品| 国产精品久久777777| 免费a v网站| 国模少妇一区二区三区| 哪个网站能看毛片| 欧美va天堂| 视频一区二区在线| 国产区精品视频在线观看豆花| 国产精品亚洲视频在线观看| 国产自产自拍视频在线观看| 久热国产精品视频| 国产天堂在线| 日韩成人高清在线| 99国产精品久久久久久久成人| 色综合天天天天做夜夜夜夜做| 久久久精品99| 亚洲天堂精品视频| 特级西西www444人体聚色| 不卡大黄网站免费看| 亚洲无在线观看| 日本一不卡视频| 女人天堂av手机在线| 韩国亚洲精品| 亚洲一卡二卡三卡| 红桃视频在线观看一区二区| 国产精品一码二码三码在线| 国产一区2区在线观看| 国产精品网站大全| 日本一区免费网站| 午夜免费久久久久| 丁香高清在线观看完整电影视频| 久久伊人精品视频| 欧美日韩欧美| 色噜噜狠狠狠综合曰曰曰| 大地资源中文在线观看免费版| 精品香蕉一区二区三区| 日韩永久免费视频| 精品粉嫩aⅴ一区二区三区四区| 国产精品系列视频| 欧美猛男男办公室激情| 中文字幕理论片| 欧美性生活久久| 国产熟妇一区二区三区四区| 欧美日韩另类字幕中文| 少妇一级淫片免费放中国| 亚洲成人av免费| 日韩精品一区二区av| 亚洲3atv精品一区二区三区| 国产一级一片免费播放| 亚洲成精国产精品女| 国产无套内射又大又猛又粗又爽| 亚洲h动漫在线| 国产一级片毛片| 一本一本大道香蕉久在线精品 | 综合毛片免费视频| 欧美中文字幕精品| 午夜无码国产理论在线| 国产精品福利片| 免费日韩成人| 亚洲最大福利网站| 国产精品99久久免费观看| 国产一区二区久久久| 日韩欧美四区| 日韩欧美亚洲日产国产| 日韩免费视频| 992tv成人免费观看| 国产综合自拍| 午夜精品久久久久久久无码| 日韩福利视频导航| 中文av字幕在线观看| 国产黄色精品视频| 中文字幕人妻一区二区三区| 国产视频一区不卡| 久久精品一区二区三区四区五区| 一区二区在线观看av| 日本三级片在线观看| 色久优优欧美色久优优| 中文字幕一区二区三区免费看 | 午夜视频福利在线| 一区二区三区国产在线观看| 免费av在线播放| 久久久亚洲影院| 三级成人黄色影院| 亚洲自拍av在线| 亚洲精品一级二级三级| 国产91av视频在线观看| 精品69视频一区二区三区Q| 欧美日韩激情视频在线观看| 免费不卡在线观看| 美女网站视频在线观看| 国产日产亚洲精品系列| 深夜福利影院在线观看| 色综合久久中文综合久久97| 91麻豆成人精品国产| 日韩欧美精品三级| 国产免费永久在线观看| 欧美日本黄视频| 91tv亚洲精品香蕉国产一区| 成人综合电影| 欧美xxxx中国| 亚洲午夜无码av毛片久久| 激情五月激情综合网| 无套内谢大学处破女www小说| 最新中文字幕一区二区三区| 国产高清中文字幕| 日韩美一区二区三区| 国产经典自拍视频在线观看| 欧美激情按摩在线| 日韩成人一区| 欧美久久久久久一卡四| 国产精品红桃| 亚洲va综合va国产va中文| 久久综合视频网| 久久国产精品二区| 69堂成人精品免费视频| 国产乱理伦片a级在线观看| 97在线观看视频| 911亚洲精品| 少妇高潮大叫好爽喷水| 日本欧美一区二区三区乱码| 麻豆精品国产传媒av| 亚洲三级理论片| 在线视频免费观看一区| 亚洲性无码av在线| 瑟瑟视频在线看| 国产精品一区二区免费看| 欧美在线看片| 一级黄色片国产| 国产精品国产精品国产专区不蜜 | 日本一区二区三区视频在线观看| 影音先锋久久资源网| 激情小说欧美色图| 亚洲精品五月天| 99热精品在线播放| 久久精品中文字幕电影| 欧美成人福利| 亚洲国产欧美日韩| 蜜桃av一区二区在线观看 | 人妻少妇精品无码专区| 久热精品视频在线免费观看| 日本电影久久久| 亚洲国产成人不卡| 青草av.久久免费一区| 人妻视频一区二区| 精品婷婷伊人一区三区三| 精品美女视频在线观看免费软件 | 色噜噜狠狠狠综合曰曰曰88av| 欧美日韩国产网站| 亚洲国产另类久久久精品极度| 秋霞午夜av一区二区三区| 无码人妻丰满熟妇啪啪欧美| 91成人在线精品| 中文字幕在线播放| 91亚洲精品视频| 亚洲第一伊人| 性色av蜜臀av色欲av| 一本久久a久久精品亚洲| 国产小视频在线| 国产日韩中文在线| 91久久国产| 国产精品91av| 亚洲成av人综合在线观看| 日韩精品视频无播放器在线看| 国产999精品久久久| 欧美xxxxx视频| 国产精品日日摸夜夜爽| 精品久久久免费| 国产福利小视频在线观看| 国产精品影片在线观看| 欧美fxxxxxx另类| 精品无码在线视频| 欧美性猛交xxxxxx富婆| 大片免费在线看视频| 国产一区二区免费电影| 日韩在线一区二区三区| 国产又粗又长又黄的视频| 欧美一区二区精品| 三级在线观看视频| 一区二区视频在线观看| 成人综合在线网站| 黄色片视频免费| 久久躁日日躁aaaaxxxx| 成人另类视频| 青青青在线视频免费观看| 一区二区三区日韩在线观看| 亚洲 精品 综合 精品 自拍| 国产美女直播视频一区| 国产精品jizz在线观看美国| 男人天堂av电影| 欧美一区二区国产| 波多视频一区| 日韩国产精品毛片| wwwwww.欧美系列| 国产又大又粗又硬| 国产91精品久久久久久久| 外国成人激情视频| 素人fc2av清纯18岁| 欧美一卡2卡3卡4卡| 日韩在线影院| 91成人综合网|