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

在微服務(wù)中使用領(lǐng)域事件

移動開發(fā) 開發(fā)
最近幾年重新進(jìn)入開發(fā)者視野的響應(yīng)式編程(Reactive Programming)更是將事件作為該編程模型中的一等公民??梢?,“事件”這個概念一直在計算機(jī)科學(xué)領(lǐng)域中扮演著重要的角色。
稍微回想一下計算機(jī)硬件的工作原理我們便不難發(fā)現(xiàn),整個計算機(jī)的工作過程其實(shí)就是一個對事件的處理過程。當(dāng)你點(diǎn)擊鼠標(biāo)、敲擊鍵盤或者插上U盤時,計算機(jī)便以中斷的形式處理各種外部事件。在軟件開發(fā)領(lǐng)域,事件驅(qū)動架構(gòu)(Event Driven Architecture,EDA)早已被開發(fā)者用于各種實(shí)踐,典型的應(yīng)用場景比如瀏覽器對用戶輸入的處理、消息機(jī)制以及SOA。最近幾年重新進(jìn)入開發(fā)者視野的響應(yīng)式編程(Reactive Programming)更是將事件作為該編程模型中的一等公民??梢姡?ldquo;事件”這個概念一直在計算機(jī)科學(xué)領(lǐng)域中扮演著重要的角色。
[[196313]]

認(rèn)識領(lǐng)域事件 

領(lǐng)域事件(Domain Events)是領(lǐng)域驅(qū)動設(shè)計(Domain Driven Design,DDD)中的一個概念,用于捕獲我們所建模的領(lǐng)域中所發(fā)生過的事情。領(lǐng)域事件本身也作為通用語言(Ubiquitous Language)的一部分成為包括領(lǐng)域?qū)<以趦?nèi)的所有項(xiàng)目成員的交流用語。比如,在用戶注冊過程中,我們可能會說“當(dāng)用戶注冊成功之后,發(fā)送一封歡迎郵件給客戶。”,此時的“用戶已經(jīng)注冊”便是一個領(lǐng)域事件。 
當(dāng)然,并不是所有發(fā)生過的事情都可以成為領(lǐng)域事件。一個領(lǐng)域事件必須對業(yè)務(wù)有價值,有助于形成完整的業(yè)務(wù)閉環(huán),也即一個領(lǐng)域事件將導(dǎo)致進(jìn)一步的業(yè)務(wù)操作。舉個咖啡廳建模的例子,當(dāng)客戶來到前臺時將產(chǎn)生“客戶已到達(dá)”的事件,如果你關(guān)注的是客戶接待,比如需要為客戶預(yù)留位置等,那么此時的“客戶已到達(dá)”便是一個典型的領(lǐng)域事件,因?yàn)樗鼘⒂糜谟|發(fā)下一步——“預(yù)留位置”操作;但是如果你建模的是咖啡結(jié)賬系統(tǒng),那么此時的“客戶已到達(dá)”便沒有多大存在的必要——你不可能在用戶到達(dá)時就立即向客戶要錢對吧,而”客戶已下單“才是對結(jié)賬系統(tǒng)有用的事件。 
在微服務(wù)(Microservices)架構(gòu)實(shí)踐中,人們大量地借用了DDD中的概念和技術(shù),比如一個微服務(wù)應(yīng)該對應(yīng)DDD中的一個限界上下文(Bounded Context);在微服務(wù)設(shè)計中應(yīng)該首先識別出DDD中的聚合根(Aggregate Root);還有在微服務(wù)之間集成時采用DDD中的防腐層(Anti-Corruption Layer, ACL);我們甚至可以說DDD和微服務(wù)有著天生的默契。更多有關(guān)DDD的內(nèi)容,請參考筆者的另一篇文章或參考《領(lǐng)域驅(qū)動設(shè)計》及《實(shí)現(xiàn)領(lǐng)域驅(qū)動設(shè)計》。 
在DDD中有一條原則:一個業(yè)務(wù)用例對應(yīng)一個事務(wù),一個事務(wù)對應(yīng)一個聚合根,也即在一次事務(wù)中,只能對一個聚合根進(jìn)行操作。但是在實(shí)際應(yīng)用中,我們經(jīng)常發(fā)現(xiàn)一個用例需要修改多個聚合根的情況,并且不同的聚合根還處于不同的限界上下文中。比如,當(dāng)你在電商網(wǎng)站上買了東西之后,你的積分會相應(yīng)增加。這里的購買行為可能被建模為一個訂單(Order)對象,而積分可以建模成賬戶(Account)對象的某個屬性,訂單和賬戶均為聚合根,并且分別屬于訂單系統(tǒng)和賬戶系統(tǒng)。顯然,我們需要在訂單和積分之間維護(hù)數(shù)據(jù)一致性,然而在同一個事務(wù)中同時更新兩者又違背了DDD設(shè)計原則,并且此時需要在兩個不同的系統(tǒng)之間采用重量級的分布式事務(wù)(Distributed Transactioin,也叫XA事務(wù)或者全局事務(wù))。另外,這種方式還在訂單系統(tǒng)和賬戶系統(tǒng)之間產(chǎn)生了強(qiáng)耦合。通過引入領(lǐng)域事件,我們可以很好地解決上述問題。 
總的來說,領(lǐng)域事件給我們帶來以下好處: 
  1. 解耦微服務(wù)(限界上下文)
  1. 幫助我們深入理解領(lǐng)域模型
  1. 提供審計和報告的數(shù)據(jù)來源
  1. 邁向事件(Event Sourcing)和CQRS等
還是以上面的電商網(wǎng)站為例,當(dāng)用戶下單之后,訂單系統(tǒng)將發(fā)出一個“用戶已下單”的領(lǐng)域事件,并發(fā)布到消息系統(tǒng)中,此時下單便完成了。賬戶系統(tǒng)訂閱了消息系統(tǒng)中的“用戶已下單”事件,當(dāng)事件到達(dá)時進(jìn)行處理,提取事件中的訂單信息,再調(diào)用自身的積分引擎(也有可能是另一個微服務(wù))計算積分,***更新用戶積分??梢钥吹?,此時的訂單系統(tǒng)在發(fā)送了事件之后,整個用例操作便結(jié)束了,根本不用關(guān)心是誰收到了事件或者對事件做了什么處理。事件的消費(fèi)方可以是賬戶系統(tǒng),也可以是任何一個對事件感興趣的第三方,比如物流系統(tǒng)。由此,各個微服務(wù)之間的耦合關(guān)系便解開了。值得注意的一點(diǎn)是,此時各個微服務(wù)之間不再是強(qiáng)一致性,而是基于事件的最終一致性。 

訂單系統(tǒng)

事件風(fēng)暴(Event Storming) 
事件風(fēng)暴是一項(xiàng)團(tuán)隊(duì)活動,旨在通過領(lǐng)域事件識別出聚合根,進(jìn)而劃分微服務(wù)的限界上下文。在活動中,團(tuán)隊(duì)先通過頭腦風(fēng)暴的形式羅列出領(lǐng)域中所有的領(lǐng)域事件,整合之后形成最終的領(lǐng)域事件集合,然后對于每一個事件,標(biāo)注出導(dǎo)致該事件的命令(Command),再然后為每個事件標(biāo)注出命令發(fā)起方的角色,命令可以是用戶發(fā)起,也可以是第三方系統(tǒng)調(diào)用或者是定時器觸發(fā)等。***對事件進(jìn)行分類整理出聚合根以及限界上下文。事件風(fēng)暴還有一個額外的好處是可以加深參與人員對領(lǐng)域的認(rèn)識。需要注意的是,在事件風(fēng)暴活動中,領(lǐng)域?qū)<沂潜仨氃趫龅摹?/div>

[[196315]]

創(chuàng)建領(lǐng)域事件 
領(lǐng)域事件應(yīng)該回答“什么人什么時候做了什么事情”這樣的問題,在實(shí)際編碼中,可以考慮采用層超類型(Layer Supertype)來包含事件的某些共有屬性: 
public abstract class Event {
    private final UUID id;
    private final DateTime createdTime;

    public Event() {
        this.id = UUID.randomUUID();
        this.createdTime = new DateTime();
    }
}
可以看到,領(lǐng)域事件還包含了ID,但是該ID并不是實(shí)體(Entity)層面的ID概念,而是主要用于事件追溯和日志。另外,由于領(lǐng)域事件描述的是過去發(fā)生的事情,我們應(yīng)該將領(lǐng)域事件建模成不可變的(Immutable)。從DDD概念上講,領(lǐng)域事件更像一種特殊的值對象(Value Object)。對于上文中提到的咖啡廳例子,創(chuàng)建“客戶已到達(dá)”事件如下: 
public final class CustomerArrivedEvent extends Event {
    private final int customerNumber;

    public CustomerArrivedEvent(int customerNumber) {
        super();
        this.customerNumber = customerNumber;
    }
}
在這個CustomerArrivedEvent事件中,除了繼承自Event的屬性外,還自定義了一個與該事件密切關(guān)聯(lián)的業(yè)務(wù)屬性——客戶人數(shù)(customerNumber)——這樣后續(xù)操作便可預(yù)留相應(yīng)數(shù)目的座位了。另外,我們將所有屬性以及CustomerArrivedEvent本身都聲明成了final,并且不向外暴露任何可能修改這些屬性的方法,這樣便保證了事件的不變性。
發(fā)布領(lǐng)域事件 
在使用領(lǐng)域事件時,我們通常采用“發(fā)布-訂閱”的方式來集成不同的模塊或系統(tǒng)。在單個微服務(wù)內(nèi)部,我們可以使用領(lǐng)域事件來集成不同的功能組件,比如在上文中提到的“用戶注冊之后向用戶發(fā)送歡迎郵件”的例子中,注冊組件發(fā)出一個事件,郵件發(fā)送組件接收到該事件后向用戶發(fā)送郵件。 

圖2

在微服務(wù)內(nèi)部使用領(lǐng)域事件時,我們不一定非得引入消息中間件(比如ActiveMQ等)。還是以上面的“注冊后發(fā)送歡迎郵件”為例,注冊行為和發(fā)送郵件行為雖然通過領(lǐng)域事件集成,但是他們依然發(fā)生在同一個線程中,并且是同步的。另外需要注意的是,在限界上下文之內(nèi)使用領(lǐng)域事件時,我們依然需要遵循“一個事務(wù)只更新一個聚合根”的原則,違反之往往意味著我們對聚合根的拆分是錯的。即便確實(shí)存在這樣的情況,也應(yīng)該通過異步的方式(此時需要引入消息中間件)對不同的聚合根采用不同的事務(wù),此時可以考慮使用后臺任務(wù)。
除了用于微服務(wù)的內(nèi)部,領(lǐng)域事件更多的是被用于集成不同的微服務(wù),如上文中的“電商訂單”例子。 

圖3

通常,領(lǐng)域事件產(chǎn)生于領(lǐng)域?qū)ο笾?,或者更?zhǔn)確的說是產(chǎn)生于聚合根中。在具體編碼實(shí)現(xiàn)時,有多種方式可用于發(fā)布領(lǐng)域事件。 
一種直接的方式是在聚合根中直接調(diào)用發(fā)布事件的Service對象。以上文中的“電商訂單”為例,當(dāng)創(chuàng)建訂單時,發(fā)布“訂單已創(chuàng)建”領(lǐng)域事件。此時可以考慮在訂單對象的構(gòu)造函數(shù)中發(fā)布事件: 
public class Order {
    public Order(EventPublisher eventPublisher) {
        //create order        
        //…        
        eventPublisher.publish(new OrderPlacedEvent());    
        }
}
注:為了把焦點(diǎn)集中在事件發(fā)布上,我們對Order對象做了簡化,Order對象本身在實(shí)際編碼中不具備參考性。 
可以看到,為了發(fā)布OrderPlacedEvent事件,我們需要將Service對象EventPublisher傳入,這顯然是一種API污染,即Order作為一個領(lǐng)域?qū)ο笾恍枰P(guān)注和業(yè)務(wù)相關(guān)的數(shù)據(jù),而不是諸如EventPublisher這樣的基礎(chǔ)設(shè)施對象。 另一種方法是由NServiceBus的創(chuàng)始人Udi Dahan提出來的,即在領(lǐng)域?qū)ο笾型ㄟ^調(diào)用EventPublisher上的靜態(tài)方法發(fā)布領(lǐng)域事件:
public class Order {
    public Order() {
        //create order
        //...
        EventPublisher.publish(new OrderPlacedEvent());
    }
}
這種方法雖然避免了API污染,但是這里的publish()靜態(tài)方法將產(chǎn)生副作用,對Order對象的測試帶來了難處。此時,我們可以采用“在聚合根中臨時保存領(lǐng)域事件”的方式予以改進(jìn):
public class Order {

    private List<Event> events;

    public Order() {
        //create order
        //...
        events.add(new OrderPlacedEvent());
    }

    public List<Event> getEvents() {
        return events;
    }

    public void clearEvents() {
        events.clear();

    }
} 
在測試Order對象時,我們便你可以通過驗(yàn)證events集合保證Order對象在創(chuàng)建時的確發(fā)布了OrderPlacedEvent事件:
@Test
public void shouldPublishEventWhenCreateOrder() {
    Order order = new Order();
    List<Event> events = order.getEvents();
    assertEquals(1, events.size());
    Event event = events.get(0);
    assertTrue(event instanceof OrderPlacedEvent);
} 
在這種方式中,聚合根對領(lǐng)域事件的保存只能是臨時的,在對該聚合根操作完成之后,我們應(yīng)該將領(lǐng)域事件發(fā)布出去并及時清空events集合??梢钥紤]在持久化聚合根時進(jìn)行這樣的操作,在DDD中即為資源庫(Repository):
public class OrderRepository {
    private EventPublisher eventPublisher;

    public void save(Order order) {
        //save the order
        //...
        List<Event> events = order.getEvents();
        events.forEach(event -> eventPublisher.publish(event));
        order.clearEvents();
    }
}
除此之外,還有一種與“臨時保存領(lǐng)域事件”相似的做法是“在聚合根方法中直接返回領(lǐng)域事件”,然后在Repository中進(jìn)行發(fā)布。這種方式依然有很好的可測性,并且開發(fā)人員不用手動清空先前的事件集合,不過還是得記住在Repository中將事件發(fā)布出去。另外,這種方式不適合創(chuàng)建聚合根的場景,因?yàn)榇藭r的創(chuàng)建過程既要返回聚合根本身,又要返回領(lǐng)域事件。
 這種方式也有不好的地方,比如它要求開發(fā)人員在每次更新聚合根時都必須記得清空events集合,忘記這么做將為程序帶來嚴(yán)重的bug。不過雖然如此,這依然是筆者比較推薦的方式。 
業(yè)務(wù)操作和事件發(fā)布的原子性 
雖然在不同聚合根之間我們采用了基于領(lǐng)域事件的最終一致性,但是在業(yè)務(wù)操作和事件發(fā)布之間我們依然需要采用強(qiáng)一致性,也即這兩者的發(fā)生應(yīng)該是原子的,要么全部成功,要么全部失敗,否則最終一致性根本無從談起。以上文中“訂單積分”為例,如果客戶下單成功,但是事件發(fā)送失敗,下游的賬戶系統(tǒng)便拿不到事件,導(dǎo)致最終客戶的積分并不增加。 
要保證業(yè)務(wù)操作和事件發(fā)布之間的原子性,最直接的方法便是采用XA事務(wù),比如Java中的JTA,這種方式由于其重量級并不被人們所看好。但是,對于一些對性能要求不那么高的系統(tǒng),這種方式未嘗不是一個選擇。一些開發(fā)框架已經(jīng)能夠支持獨(dú)立于應(yīng)用服務(wù)器的XA事務(wù)管理器(如Atomikos 和Bitronix),比如Spring Boot作為一個微服務(wù)框架便提供了對Atomikos和Bitronix的支持。 
如果JTA不是你的選項(xiàng),那么可以考慮采用事件表的方式。這種方式首先將事件保存到聚合根所在的數(shù)據(jù)庫中,由于事件表和聚合根表同屬一個數(shù)據(jù)庫,整個過程只需要一個本地事務(wù)就能完成。然后,在一個單獨(dú)的后臺任務(wù)中讀取事件表中未發(fā)布的事件,再將事件發(fā)布到消息中間件中。 

圖4

這種方式需要注意兩個問題,***個是由于發(fā)布了事件之后需要將表中的事件標(biāo)記成“已發(fā)布”狀態(tài),即依然涉及到對數(shù)據(jù)庫的操作,因此發(fā)布事件和標(biāo)記“已發(fā)布”之間需要原子性。當(dāng)然,此時依舊可以采用XA事務(wù),但是這違背了采用事件表的初衷。一種解決方法是將事件的消費(fèi)方創(chuàng)建成冪等的,即消費(fèi)方可以多次消費(fèi)同一個事件。這個過程大致為:整個過程中事件發(fā)送和數(shù)據(jù)庫更新采用各自的事務(wù)管理,此時有可能發(fā)生的情況是事件發(fā)送成功而數(shù)據(jù)庫更新失敗,這樣在下一次事件發(fā)布操作中,由于先前發(fā)布過的事件在數(shù)據(jù)庫中依然是“未發(fā)布”狀態(tài),該事件將被重新發(fā)布到消息系統(tǒng)中,導(dǎo)致事件重復(fù),但由于事件的消費(fèi)方是冪等的,因此事件重復(fù)不會存在問題。 
另外一個需要注意的問題是持久化機(jī)制的選擇。其實(shí)對于DDD中的聚合根來說,NoSQL是相比于關(guān)系型數(shù)據(jù)庫更合適的選擇,比如用MongoDB的Document保存聚合根便是種很自然的方式。但是多數(shù)NoSQL是不支持ACID的,也就是說不能保證聚合更新和事件發(fā)布之間的原子性。還好,關(guān)系型數(shù)據(jù)庫也在向NoSQL方向發(fā)展,比如新版本的PostgreSQL(版本9.4)和MySQL(版本5.7)已經(jīng)能夠提供具備NoSQL特征的JSON存儲和基于JSON的查詢。此時,我們可以考慮將聚合根序列化成JSON格式的數(shù)據(jù)進(jìn)行保存,從而避免了使用重量級的ORM工具,又可以在多個數(shù)據(jù)之間保證ACID,何樂而不為? 
總結(jié)
領(lǐng)域事件主要用于解耦微服務(wù),此時各個微服務(wù)之間將形成最終一致性。事件風(fēng)暴活動有助于我們對微服務(wù)進(jìn)行拆分,并且有助于我們深入了解某個領(lǐng)域。領(lǐng)域事件作為已經(jīng)發(fā)生過的歷史數(shù)據(jù),在建模時應(yīng)該將其創(chuàng)建為不可變的特殊值對象。存在多種方式用于發(fā)布領(lǐng)域事件,其中“在聚合中臨時保存領(lǐng)域事件”的方式是值得推崇的。另外,我們需要考慮到聚合更新和事件發(fā)布之間的原子性,可以考慮使用XA事務(wù)或者采用單獨(dú)的事件表。為了避免事件重復(fù)帶來的問題,***的方式是將事件的消費(fèi)方創(chuàng)建為冪等的。 
責(zé)任編輯:張子龍 來源: 博客園
相關(guān)推薦

2017-04-19 08:58:54

微服務(wù)領(lǐng)域事件事件

2020-12-01 12:08:45

微服務(wù)架構(gòu)DOMA

2023-06-21 08:00:00

微服務(wù)架構(gòu)

2023-07-28 13:55:40

便捷選項(xiàng)組件

2024-02-22 18:12:18

微服務(wù)架構(gòu)設(shè)計模式

2022-10-19 13:11:35

2009-06-25 16:49:24

Hibernate

2013-12-13 17:21:14

Lua腳本語言

2023-11-17 12:04:39

GORM并發(fā)

2023-04-12 15:25:09

Bytrace鴻蒙

2009-07-04 00:50:38

2017-06-07 11:57:26

混合云OpenStack容器

2018-12-12 09:59:47

微服務(wù)架構(gòu)分布式系統(tǒng)

2020-04-13 09:54:44

微服務(wù)子集存儲

2022-04-25 10:44:08

微服務(wù)架構(gòu)設(shè)計

2012-10-12 14:28:32

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

2011-06-15 10:08:01

Qt CVS

2023-07-04 16:36:03

Linuxcd 命令

2010-04-29 17:51:40

Unix工具

2023-07-23 19:26:18

Linuxcat 命令
點(diǎn)贊
收藏

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

国产伦精品一区二区三区免费迷 | 日韩电影免费在线看| 亚洲第五色综合网| 99视频在线免费播放| 日韩在线免费看| 日韩一区精品字幕| 日韩在线观看免费av| 深夜福利网站在线观看| 成人bbav| 国产精品久久久久久妇女6080| 91久久久久久久久| 国产亚洲自拍av| 国产精品一区二区99| 欧美精品第一页| a级黄色小视频| 色吊丝在线永久观看最新版本| 日本不卡在线视频| 精品国产一区二区三区久久久 | 国产一区91精品张津瑜| 久久久久五月天| 免费毛片视频网站| 久久久久九九精品影院| 欧美特级www| 伊人情人网综合| 四虎永久在线精品免费网址| 青青草国产精品亚洲专区无| 久久久久久综合网天天| 久久久久久久久久久影视| 97**国产露脸精品国产| 亚洲黄网站在线观看| 午夜精品久久17c| 国产chinese中国hdxxxx| 高清av一区| 亚洲高清不卡在线| 色99中文字幕| 人妻与黑人一区二区三区| 免费视频最近日韩| 国模视频一区二区| www.av免费| 国产成人久久| 日韩成人在线视频观看| 久久久无码人妻精品无码| 97精品国产综合久久久动漫日韩| 亚洲一二三区不卡| 日本三级福利片| 国产系列在线观看| 99精品视频在线免费观看| 91久久精品久久国产性色也91| 国产午夜精品久久久久| 激情国产一区| 久久成人精品电影| 欧美一区二区三区粗大| 欧美电影免费网站| 欧美一区二区三区在线观看视频| 国产真人无码作爱视频免费| 看黄在线观看| 亚洲1区2区3区4区| av免费观看国产| 国产蜜臀在线| 亚洲一区二区三区不卡国产欧美| 日本一本草久p| 中文字幕资源网在线观看| 国产精品美女久久久久久| 日韩三级电影网站| 黄色免费在线播放| 久久综合丝袜日本网| 精品乱码一区二区三区| 色婷婷视频在线| 成人网在线免费视频| 亚洲在线观看视频| av中文字幕免费| 国产91在线观看| 国产a一区二区| 蜜臀久久99精品久久久| 成人福利电影精品一区二区在线观看| 成人做爰66片免费看网站| 成人精品在线播放| av资源网一区| 国产精品三区四区| 亚洲欧美一区二区三| 91在线观看高清| 免费试看一区| 成全电影播放在线观看国语| 国产精品丝袜在线| 女女同性女同一区二区三区按摩| 国产淫片在线观看| 亚洲电影第三页| 免费在线观看亚洲视频| 中文不卡1区2区3区| 欧美性猛片xxxx免费看久爱| 亚洲一区二区在线视频观看| 国产成人免费视频网站视频社区| 欧美成人精品1314www| 四虎国产精品免费| 成人知道污网站| 精品小视频在线| 免费看污片网站| 精品99久久| 日韩视频免费在线| 久久久久黄色片| 乱人伦精品视频在线观看| 国产精品一区二区三区免费视频| 国产毛片毛片毛片毛片| 99久久亚洲一区二区三区青草| 欧美亚洲一级二级| 好操啊在线观看免费视频| 亚洲va欧美va人人爽午夜| caopor在线视频| 久久久久久亚洲精品美女| 亚洲精品美女在线观看| 潘金莲一级黄色片| 亚洲人www| 国产精品永久在线| 亚洲第一色网站| 久久精品视频一区二区| 裸体裸乳免费看| 欧美日韩免费看片| 91精品国产一区二区| 精品国产人妻一区二区三区| 国产精品酒店视频| 欧美成熟毛茸茸| 中文字幕中文字幕在线一区| 青青青青在线视频| 激情欧美一区二区三区黑长吊| 精品精品国产高清一毛片一天堂| 国产精品久久久久无码av色戒| 婷婷综合社区| 日韩av电影在线网| 亚洲精品久久久久久动漫器材一区| 久久久久久久久一| 激情五月婷婷六月| 中文字幕成人| 中文日韩在线观看| 日本一级一片免费视频| 国产精品自拍av| 91在线在线观看| 大片免费播放在线视频| 亚洲免费在线视频一区 二区| 日韩av资源在线| 国产精伦一区二区三区| 久久久精品在线| 在线免费a视频| 久久综合色天天久久综合图片| a级片一区二区| 国产黄色精品| 日韩高清中文字幕| 国产乡下妇女做爰| 国产91精品在线观看| 黄色一级片网址| 国产欧美在线观看免费| 国产视频亚洲精品| 你懂的国产视频| 国产91在线|亚洲| 国产精品免费看久久久无码| 亚洲综合资源| 色阁综合伊人av| 欧美另类高清videos的特点| 91蜜桃传媒精品久久久一区二区| 福利视频免费在线观看| 涩爱av色老久久精品偷偷鲁| 久久久精品国产网站| 国产精品伊人久久 | 精品国产免费久久久久久婷婷| 99久久婷婷这里只有精品| 国产精品自产拍在线观看中文| 国产天堂素人系列在线视频| 狠狠做深爱婷婷久久综合一区| 美女黄色一级视频| 在线免费高清一区二区三区| 国产乱码精品一区二区三区中文| 国产在线xxx| 亚洲精品久久久久久久久久久久久 | 精品成人免费观看| 久久久综合久久久| 成人黄色综合网站| aa在线免费观看| 国产在线日韩精品| 国产精品久久久999| 又爽又大又黄a级毛片在线视频| 欧美日韩在线三区| 亚洲AV成人无码精电影在线| 国产精品18久久久久久久久| 免费看国产一级片| 天海翼亚洲一区二区三区| 欧美孕妇与黑人孕交| 国产资源在线观看| 欧美日韩国产一区二区三区地区| 中文字幕资源站| 国产高清久久久久| 成人免费观看视频在线观看| 欧美先锋资源| 91手机在线播放| 日本蜜桃在线观看视频| 亚洲一区二区国产| 国产91av在线播放| 国产精品嫩草99a| 精品国产鲁一鲁一区二区三区| 欧美日本免费| 欧美12av| 高清久久一区| 88xx成人精品| 午夜精品一区| 亚洲国产精品一区二区久| 国产99免费视频| 18欧美乱大交hd1984| aaaa黄色片| 久久国产日韩欧美精品| 中文字幕日韩一区二区三区不卡| 亚洲国产一区二区三区网站| 国产不卡视频在线| 2024最新电影在线免费观看| 国产视频丨精品|在线观看| 在线能看的av| 亚洲美女视频在线| 无遮挡aaaaa大片免费看| 激情成人综合网| www一区二区www免费| 在线看片不卡| 日韩欧美视频第二区| eeuss鲁片一区二区三区| 国产精品久久久久久久av大片| 青春草在线免费视频| 自拍偷拍亚洲区| 你懂的网站在线| 精品视频在线免费看| 黄色一级片免费看| 亚洲另类中文字| 国产精品美女高潮无套| 成人午夜在线视频| 亚洲精品免费一区亚洲精品免费精品一区| 一本久道久久久| 国产一级大片免费看| 日韩www.| 日韩欧美一区二区三区四区五区 | 日韩av手机在线播放| 国产一区二区三区香蕉| 久久综合伊人77777麻豆最新章节| 亚洲福利精品| 中文字幕精品—区二区日日骚| 免费视频国产一区| 精品日本一区二区| 视频国产精品| 国产日韩欧美自拍| 3d性欧美动漫精品xxxx软件| 91av在线视频观看| av老司机在线观看| 欧美丰满片xxx777| av网址在线| 最近中文字幕2019免费| 亚洲 小说区 图片区 都市| 日韩视频在线你懂得| 国产白浆在线观看| 在线观看一区日韩| 无码人妻一区二区三区免费| 欧美午夜影院在线视频| 成人免费区一区二区三区| 一区二区三区在线视频观看| 欧美日韩色视频| 久久久综合精品| 免费在线观看成年人视频| 99精品热视频| 少妇精品一区二区| 久久综合资源网| 国产精品高清无码在线观看| 久久天堂av综合合色蜜桃网| 播金莲一级淫片aaaaaaa| 2023国产一二三区日本精品2022| 亚洲欧美日本一区| 99精品视频一区二区| aaaaaav| 久久久久久影视| 极品蜜桃臀肥臀-x88av| 中文字幕成人在线观看| 亚洲欧美精品久久| 自拍偷拍国产精品| 青娱乐91视频| 精品福利一区二区| 亚洲 欧美 成人| 色噜噜久久综合| 国产一级片一区二区| 欧美日韩国产精品自在自线| 国产99视频在线| 欧美精品一区二| 免费在线性爱视频| 最近中文字幕mv在线一区二区三区四区| 日韩毛片久久久| 精品中文字幕在线观看| 91九色国产在线播放| 久久久久日韩精品久久久男男| 美女91在线看| 91精品国产91久久| 黄色成人免费网| 国产精品久久久久久网站 | 色狠狠桃花综合| 在线免费看毛片| 欧美成人激情免费网| 免费在线超碰| 久久亚洲精品成人| 午夜伦理福利在线| 国产日韩av在线| 91综合久久爱com| 日本午夜精品一区二区三区| 91精品啪在线观看国产81旧版| 国产www免费| 国产精品日韩| 国产一级片中文字幕| 91视视频在线观看入口直接观看www | 日本一区二区高清不卡| 成人av在线播放观看| 日日摸夜夜添夜夜添精品视频 | 欧洲第一无人区观看| 婷婷国产v国产偷v亚洲高清| 中文字幕制服诱惑| 日韩欧美的一区| 成人亚洲综合天堂| 欧美成人黑人xx视频免费观看| 麻豆福利在线观看| 国产精品免费小视频| 免费看成人人体视频| 一区二区三区精品国产| 亚洲一区国产| 韩国三级在线播放| 国产精品午夜免费| 91视频免费网址| 日韩欧美激情四射| 国产美女视频一区二区三区| 久久躁日日躁aaaaxxxx| 欧美少妇网站| av一区观看| 久久久久久久久99精品大| 亚洲中文字幕无码不卡电影| 国产成a人亚洲精品| 五月激情四射婷婷| 一本色道久久综合亚洲91| 国产91免费在线观看| 久久精品99国产精品酒店日本 | 91av视频在线免费观看| 国产乱码精品一区二区三区亚洲人| 国产精品二区三区四区| 亚洲国产精品久久久久蝴蝶传媒| 91视频免费版污| 91网上在线视频| 国产第100页| 日韩视频免费观看高清在线视频| 婷婷视频在线| 国产精品久久久久久久app | 天堂一区二区三区 | 日本在线免费| 91超碰caoporn97人人| 凹凸av导航大全精品| 中文字幕在线观看一区二区三区| 日本午夜一本久久久综合| 国产情侣久久久久aⅴ免费| 亚洲少妇屁股交4| 一本色道久久综合亚洲| 在线观看久久av| 成人在线观看免费播放| 日韩精品另类天天更新| 视频一区中文字幕国产| yy6080午夜| 欧美午夜影院在线视频| 免费观看国产精品| 午夜欧美大片免费观看| 九九热播视频在线精品6| 国产亚洲黄色片| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产无遮挡又黄又爽| 精品国产制服丝袜高跟| 里番在线播放| 精品国产电影| 免费在线播放第一区高清av| 国产黄色网址在线观看| 欧美在线免费观看亚洲| 菠萝菠萝蜜在线观看| 国产日韩精品久久| 日本午夜一区二区| 欧美激情国产精品免费| 日韩成人av在线播放| 欧美黑粗硬大| 欧美黄色免费网址| 久久久精品免费观看| 国产情侣一区二区| 国自产精品手机在线观看视频| 欧美理论视频| 少妇熟女视频一区二区三区| 欧美最新大片在线看| 啦啦啦中文在线观看日本| 欧洲视频一区二区三区| 国产精品亚洲一区二区三区妖精| 日韩欧美中文字幕一区二区| 综合激情国产一区| 高潮久久久久久久久久久久久久| 免费激情视频在线观看| 一区二区三区日本| 免费在线观看一级毛片| 99国产超薄肉色丝袜交足的后果 | 亚洲三级在线免费观看| 视频污在线观看| 成人在线国产精品| 亚洲中午字幕|