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

DDD實戰(zhàn)之看看代碼結(jié)構(gòu)長啥樣

開發(fā) 架構(gòu)
DDD 戰(zhàn)術(shù)設(shè)計,核心就是完成“領(lǐng)域”層內(nèi)的“聚合”、“領(lǐng)域服務(wù)”的設(shè)計,也就是“核心業(yè)務(wù)邏輯”的設(shè)計。

真正開始 DDD 旅程前,我想讓您看到經(jīng)過 DDD 設(shè)計之后的代碼長啥樣。我想,這是所有本著“talking is easy, show me your code”理念的程序員都比較在乎的觀念。

為此,我特別將“群買菜”生鮮電商系統(tǒng)服務(wù)端代碼新舊代碼結(jié)構(gòu)都顯示出來,讓您看看原來的舊代碼——也就是“事務(wù)腳本式”代碼長啥樣(應(yīng)該是目前大部分 java 程序員寫代碼的樣子),再讓您看看 DDD 改造設(shè)計后的新代碼長什么樣子。然后再通過分析,說清楚為什么傳統(tǒng)的“事務(wù)腳本”代碼不是對真實世界的“同構(gòu)映射”,而 DDD 代碼的“同構(gòu)映射”在哪。

需要提醒您的是:從今天這個專題開始,可能需要你多花點時間、深入地閱讀我寫的代碼、和文字的每一句話,反復(fù)對照著看,甚至來回反復(fù)多看幾遍,才能真的去理解這些文字了。

1.舊代碼:事務(wù)腳本式(貧血模型)代碼

我們先來看舊代碼的目錄結(jié)構(gòu)截圖。注意看下面的 1、2、3、4 標(biāo)注位置(解釋下,我這里用的是 spring-boot 開發(fā)框架,MyBatisPlus 數(shù)據(jù)持久框架、MySql5.6 數(shù)據(jù)庫):

您注意到這里標(biāo)注的 1、2、3、4 代碼位置了嗎?是不是代碼結(jié)構(gòu)很像大部分 spring-boot 應(yīng)用框架下代碼結(jié)構(gòu)?為了避免您可能不太了解這種代碼結(jié)構(gòu),我還是簡單解釋下。

標(biāo)號 1 位置:這里放的是 Controller(控制器)層代碼,也就是所有前端訪問的接口都在這里實現(xiàn)。按照 MVC 的分層原則,一般來說,這里只會放一些客戶端輸入?yún)?shù)的解析、以及對 service 層(見下文)的業(yè)務(wù)方法調(diào)用。一般來說,這里的代碼都長成下面這樣:

標(biāo)號 2 位置:這里放的是 entity(數(shù)據(jù) bean)層代碼,其實都是 POJO 代碼,所有類都一一對應(yīng)到數(shù)據(jù)庫表。一般來說,這里的代碼都長成這樣:

標(biāo)號 3 位置:mapper 層,對于 mybatis 持久層框架來說,mapper 和 entity 共同實現(xiàn)了 ORM(對象模型到關(guān)系模型的映射)。一般來說,這里的代碼長成這樣(這里 CustomerMapper 類只是定義了 entity 類 Customer 的映射關(guān)系,以及自定義的數(shù)據(jù)操作方法):

以及這樣(在 MP 中,只有需要實現(xiàn)自定義的 SQL 操作方法,才需要這個 CustomerMapper.xml 文件):

標(biāo)號 4 位置:Service(服務(wù))層,這里是所有業(yè)務(wù)邏輯實現(xiàn)的核心代碼處,幾乎所有的業(yè)務(wù)邏輯都是在這里實現(xiàn)的。一般來說,這里會有 interface+implementation 組合的實現(xiàn)方式。比如:OrderService 和 OrderServiceImpl,分別長下面這樣:

OrderService 接口類:

OrderServiceImpl 實現(xiàn)類;

從上面的代碼中 ,我們可以很明顯地看出如下幾點:

  • Controller/entity/mapper 基本上都是利用框架的 annonation(注解)和公共工具類代碼(如 json 解析等)實現(xiàn)的很少的代碼;
  • 顯然,大部分業(yè)務(wù)邏輯都是在 Service 層的實現(xiàn)類里面實現(xiàn)的;
  • Service 層實現(xiàn)類代碼的邏輯寫的很長,且完全是“平鋪直述”的。我這里展示的 OrderSeriveImple 的 create 方法——創(chuàng)建訂單,就寫了 135 行。從我的代碼截圖中的注釋可以看出來,我是想好了一步一步要怎么對數(shù)據(jù)庫進(jìn)行 CRUD,先填寫好注釋,然后寫代碼的。這種代碼,說白了就是“CRUD+計算邏輯”組合的代碼;
  • 事實上,這種“平鋪直述”式的代碼,是很容易被程序理解的,寫起來也很容易,基本上不用“殺死”太多腦細(xì)胞,所以團(tuán)隊很容易就開始實施項目工程,隨便找一個具有基本 java 編程經(jīng)驗(一般一年以上經(jīng)驗即可)就能夠開始著手業(yè)務(wù)代碼的開發(fā);
  • 這種代碼,我們就叫做”事務(wù)腳本式”代碼,或者說叫“貧血模型”代碼。

之所以叫“事務(wù)腳本”,我個人的理解:本質(zhì)上跟 20 年前寫數(shù)據(jù)庫存儲過程代碼沒有本質(zhì)區(qū)別(只是換了個語言書寫、運(yùn)行代碼的位置從數(shù)據(jù)庫服務(wù)器內(nèi)部提到了應(yīng)用服務(wù)器);

又之所以叫“貧血模型”代碼,是因為 entity 層的那些 POJO 對象如 Order 等,沒有任何業(yè)務(wù)行為的封裝(比如:Order 類應(yīng)該自己生成自己的訂單號、提貨號等),只有屬性而沒有行為的對象,就是“貧血”對象,基于“貧血”對象實現(xiàn)的業(yè)務(wù)邏輯代碼,就叫“貧血模型”代碼。

根據(jù)這里的代碼分析,我們是不是能夠發(fā)現(xiàn)一個關(guān)鍵問題:這里的 Controller/entity/mapper/service,事實上和真實世界的業(yè)務(wù)之間關(guān)系,是沒有任何映射的——也就是說:“代碼世界”和“真實世界”是異構(gòu)的。具體來說,我們可以分以下幾點來看。

首先,從業(yè)務(wù)模塊劃分這個“最粗”的粒度來說,我們其實是可以簡單的、憑直覺進(jìn)行模塊劃分的,不用全部業(yè)務(wù)模塊放在一個工程項目中,是可以按照業(yè)務(wù)模塊(比如:店鋪管理、訂單管理、商品管理等)進(jìn)行項目目錄劃分、也就是項目團(tuán)隊分組的。

事實上,目前市面上的大多數(shù)軟件公司,就是根據(jù)業(yè)務(wù)經(jīng)驗或直覺簡單粗暴的將項目劃分了多個團(tuán)隊在進(jìn)行開發(fā)。但這種劃分方式,雖然也可以七七八八準(zhǔn)確——但我們需要意識到的是,這樣簡單粗暴的憑經(jīng)驗直覺的劃分,跟 DDD 方法論做的設(shè)計劃分相比(劃分到限界上下文這個粒度的設(shè)計,在 DDD 中叫做“戰(zhàn)略設(shè)計”),至少有 3 個不足:

  • 軟件代碼如何劃分是嚴(yán)格的“工程性問題”,而所有工程性問題,往往會“差之毫厘謬以千里”!這種經(jīng)驗直覺的劃分,很可能會遺漏掉一些很重要的“限界上下文”識別。而正因為這些重要的“限界上下文”的遺漏,導(dǎo)致了一些模糊地帶,發(fā)現(xiàn)要么是沒必要的模塊間耦合、要么是沒必要的重復(fù)。
  • DDD“限界上下文”的識別,不但要區(qū)分出到底要劃分為幾個模塊(其實“模塊”是個很模糊的詞,可以用來劃分微服務(wù)、也可以用來劃分代碼目錄結(jié)構(gòu),視需要而定),還需要識別這些“限界上下文”之間的協(xié)作關(guān)系和邊界。而這些協(xié)作關(guān)系,才真正“清晰準(zhǔn)確、代碼行級”定義了哪些代碼歸屬模塊 A、哪些代碼歸屬模塊 B——也就是邊界,以及這些模塊是通過 RPC 或本地調(diào)用關(guān)系在協(xié)作、還是異步消息事件在協(xié)作、甚至直接就沒有協(xié)作。
  • 一般來說,DDD 的“限界上下文”需要對應(yīng)到業(yè)務(wù)子領(lǐng)域,而業(yè)務(wù)子領(lǐng)域的重要程度將決定限界上下文的重要程度。業(yè)務(wù)子領(lǐng)域針對某個具體的軟件系統(tǒng)來說,是可以從業(yè)務(wù)角度判斷出哪些必須建設(shè)為軟件的核心競爭力、哪些則可以作為次要模塊甚至通過外包來實現(xiàn)。這些對“限界上下文”模塊的不同“重要程度”定義,將會促使項目管理層從效率的角度采用不同的技術(shù)棧。比如:目前市面上不同的程序員薪資水平是不同的、招聘難度是不同的;不同技術(shù)棧的成熟程度、可適用的編程特性是不同的(比如:java 比較成熟適合企業(yè)級應(yīng)用開發(fā),而 python 適合數(shù)據(jù)處理類開發(fā),node.js 適合跟第三方互聯(lián)網(wǎng)系統(tǒng)連接等)。

其次,到模塊內(nèi)部,其代碼的層次結(jié)構(gòu)劃分,如果按照 mvc 思想,最后還是又回到了類似 controller/entity/mapper/service 這樣的劃分方式。而這種劃分方式,又和“真實世界”有什么同構(gòu)映射關(guān)系呢?可以說,沒有!

所以,最終我們還是可以得出結(jié)論:這種傳統(tǒng)的代碼架構(gòu),是沒有考慮和真實世界的“同構(gòu)映射”的。而這種對“同構(gòu)映射”的缺失,才是導(dǎo)致我們出現(xiàn)“真實業(yè)務(wù)其實沒多大變化、但某個需求卻為什么引起軟件代碼翻天覆地的變化呢?”這樣疑惑的根本原因——DDD 方法論,就是用來解決這個問題的!

2.新代碼:DDD 設(shè)計代碼(充血模型)

我們再來看看使用 DDD 設(shè)計后,新的代碼結(jié)構(gòu)長什么樣。下面是新代碼的結(jié)構(gòu)截圖(同樣注意下面的 1~8 標(biāo)號):

對上面的代碼標(biāo)號位置,我來逐個解釋如下(需要說明的是:這里目錄排序是 IDEA 開發(fā)工具自動按字母順序排序,不是代碼設(shè)計先后順序):

標(biāo)號 1 位置:這里放的是邊緣層(edge)代碼。由于“群買菜”小程序前端界面已經(jīng)開發(fā)完成,并且這是一個前后端分離項目,前端代碼我并沒有打算修改,所以這里就多了個“界面適配”的代碼工作。一般來說,這種代碼就叫“邊緣層”。邊緣層放的代碼,都是類似這種為了前端界面適配、第三方系統(tǒng)接口適配之類的代碼。這種代碼,也可以叫做“為前端提供的后端”(Backend for Frontend, BFF)。理論上,這種 BFF 層的代碼,可以由前端團(tuán)隊開發(fā)的,我可以選擇技術(shù)棧是 Node.js,使用 js 或 ts 語言進(jìn)行開發(fā)。

標(biāo)號 2 位置:這里顯示的是“基礎(chǔ)層”(foudation)。在 DDD 的系統(tǒng)架構(gòu)中,限界上下文(具體概念介紹見后面,這里你只需要理解為它類似于子系統(tǒng)或業(yè)務(wù)模塊劃分就好)是可以根據(jù)“業(yè)務(wù)子域”不是核心層,而分為“基礎(chǔ)層”和“業(yè)務(wù)價值層”。一般來說,“業(yè)務(wù)價值層”對應(yīng)到最核心的業(yè)務(wù)模塊,是一個軟件系統(tǒng)的核心競爭力所在,是需要嚴(yán)格按照 DDD 的理念進(jìn)行戰(zhàn)術(shù)設(shè)計、并采用測試驅(qū)動開發(fā)模式、投入最懂業(yè)務(wù)的程序員去工作的;而“基礎(chǔ)層”一般都是非核心業(yè)務(wù)模塊,比如:業(yè)務(wù)相關(guān)基礎(chǔ)類、工具類、伴生系統(tǒng)的對接等——需要注意的是:“基礎(chǔ)層”不是“基礎(chǔ)資源層”,基礎(chǔ)層指的是業(yè)務(wù)模塊處于非核心地位、而基礎(chǔ)資源指的是數(shù)據(jù)庫、中間件這些技術(shù)組件。

標(biāo)號 3 位置:這里顯示了多個限界上下文,都是以 xxxcontext 這樣的目錄取名。在“基礎(chǔ)層”和“業(yè)務(wù)價值層”中,都會出現(xiàn)多個“限界上下文”。每個限界上下文可以分離到不同的項目團(tuán)隊去負(fù)責(zé)、甚至分離到不同的微服務(wù)中心中。還是那句話,現(xiàn)在你還不用太深入的理解“限界上下文”,暫時只需要理解它是一種模塊劃分的說法就好(后面會逐步深入解釋)。

標(biāo)號 4 位置:這里顯示出來了“業(yè)務(wù)價值層”的代碼——也就是該軟件系統(tǒng)中需要作為最核心競爭力的那些模塊,同樣下面也會有多個“限界上下文”。

標(biāo)號 5 位置:DDD 戰(zhàn)術(shù)設(shè)計軟件分層的“菱形架構(gòu)”下,“領(lǐng)域”(domain)層的代碼放這里,也是業(yè)務(wù)邏輯最核心的代碼——所有的“充血”模型代碼。從這里開始,我們解釋某個“限界上下文”內(nèi)的代碼結(jié)構(gòu)。具體這些代碼怎么設(shè)計的細(xì)節(jié),我們后面會講,現(xiàn)在你只需要知道這里放的是“業(yè)務(wù)邏輯核心”即可。

標(biāo)號 6、8 位置:在 DDD 戰(zhàn)術(shù)設(shè)計軟件分層的“菱形架構(gòu)”下,為了讓“限界上下文”在滿足外部的各種調(diào)用需求、以及需要調(diào)用或與別的“限界上下文”通訊時,不至于因為與本模塊業(yè)務(wù)邏輯無關(guān)的、各種外在因素變化而引起本模塊內(nèi)代碼邏輯的“動蕩不安”,而引入了“北向網(wǎng)關(guān)”、“南向網(wǎng)關(guān)”概念。分別說明如下:

標(biāo)號 6 就里面就是“北向網(wǎng)關(guān)”的代碼,里面又分為 local 和 remote 兩個典型的目錄。“北向網(wǎng)關(guān)”的作用,就是讓限界上下文可以向外輸出各類應(yīng)用服務(wù)。local 目錄下方的是本限界上下文向外提供的“應(yīng)用服務(wù)”,是將 domain 內(nèi)各種“充血模型”代碼進(jìn)行封裝后的、完整的業(yè)務(wù)邏輯;而 remote 目錄下,放的是對 local 目錄為了滿足“遠(yuǎn)程調(diào)用”而進(jìn)行的代碼封裝——如 RPC 調(diào)用、跨服務(wù)器消息事件訂閱等,并不存在任何業(yè)務(wù)邏輯。

標(biāo)號 8 里面就是“南向網(wǎng)關(guān)”的代碼,里面又分為“端口(port)”和“適配器(adaper)”兩個典型的目錄。“南向網(wǎng)關(guān)”的作用,就是是讓本限界上下文通過其請求外部資源。典型的 3 類外部資源請求有:訪問數(shù)據(jù)持久層(關(guān)系或非關(guān)系數(shù)據(jù)庫)、調(diào)用別的限界上下文服務(wù)(在微服務(wù)架構(gòu)中,往往是 RPC 遠(yuǎn)程調(diào)用)、向別的限界上下文發(fā)布消息。我們都知道,這些對外部資源的請求,可能會因為外部資源的技術(shù)底層不同,而存在不同的實現(xiàn)方式。為了能夠隔離“領(lǐng)域?qū)印睂唧w技術(shù)底層的依賴,就分離出來 port 層和 adapter 層。在 java 語言實現(xiàn)中,port 層就是 interface,沒有任何實現(xiàn)代碼,只有方法定義;而 adaper 層就是 implemetaion,具體實現(xiàn)到不同持久層(如不同關(guān)系數(shù)據(jù)庫 oracle/mysql 等、不同 nosql 數(shù)據(jù)庫 redis/mongodb 等)。然后,根據(jù) IoC(依賴倒置)原則在 java 中通過“依賴注入”來將 adaper 目錄下的具體實現(xiàn)與 domain 層的代碼連接起來。

標(biāo)號 7 位置:這里是“發(fā)布語言”(published language, pl)層。說白了,“發(fā)布語言”就是讓“北向網(wǎng)關(guān)”向外輸出服務(wù)時,能與服務(wù)調(diào)用者之間有個“統(tǒng)一語言”,比如:輸入輸出參數(shù)的結(jié)構(gòu)性定義、事件消息的格式定義等等。因為,我們是不用將限界上下文內(nèi)部的“領(lǐng)域”層的內(nèi)部對象結(jié)構(gòu)“泄露”到外部的,所以我們必須要有這個“發(fā)布語言”層。

3.結(jié)論

好了,解釋完了按照 DDD 進(jìn)行的代碼結(jié)構(gòu)設(shè)計,我們還是要回答一個問題:DDD 對真實世界進(jìn)行“同構(gòu)映射”后的代碼邏輯到底在哪里呢?

答案是:在“領(lǐng)域”(Domain)層里面!所謂的“北向網(wǎng)關(guān)”、“發(fā)布語言”、“南向網(wǎng)關(guān)”層的作用,都只是為了讓外部的請求、被請求資源的底層技術(shù),不要去“打擾”我們“業(yè)務(wù)邏輯”的“同構(gòu)化”映射!

這就相當(dāng)于是說:領(lǐng)域?qū)硬攀?DDD 對“業(yè)務(wù)邏輯”映射后的核心,其它都只是對這些“核心業(yè)務(wù)邏輯”的層次“包裝”而已!

那么,顯然,從技術(shù)角度來說,懂得領(lǐng)域?qū)尤绾卧O(shè)計才是 DDD 戰(zhàn)術(shù)設(shè)計層面最重要的技能!因為,“北向網(wǎng)關(guān)”、“發(fā)布語言”、“南向網(wǎng)關(guān)”這 3 層的代碼開發(fā),都是常規(guī)套路,沒啥“業(yè)務(wù)知識”含量,甚至可以用機(jī)器人來實現(xiàn)(也就是通過代碼自動生產(chǎn)工具)。

最后,解釋下反復(fù)提到的 DDD 戰(zhàn)略設(shè)計和戰(zhàn)術(shù)設(shè)計的區(qū)別:

大體上來說,DDD 戰(zhàn)略設(shè)計,就是識別出有哪些限界上下文、以及清晰的定義限界上下文的關(guān)系和邊界,就基本完成了(雖然還有些修修補(bǔ)補(bǔ)的工作,比如要不要邊緣層、本軟件系統(tǒng)跟哪些第三方外部系統(tǒng)接口等,但這些其實已經(jīng)不能叫“設(shè)計”了,因為不需要花多少腦子了);

DDD 戰(zhàn)術(shù)設(shè)計,核心就是完成“領(lǐng)域”層內(nèi)的“聚合”、“領(lǐng)域服務(wù)”的設(shè)計,也就是“核心業(yè)務(wù)邏輯”的設(shè)計。具體怎么玩,我后面會一點點演示。

責(zé)任編輯:武曉燕 來源: 逸言
相關(guān)推薦

2021-12-07 07:01:21

Python病毒 文件

2017-11-08 13:31:34

分層架構(gòu)代碼DDD

2014-11-05 10:08:50

2022-10-10 11:32:01

數(shù)據(jù)分析技術(shù)

2020-01-09 10:03:41

AI 數(shù)據(jù)人工智能

2015-09-11 09:59:04

阿里云數(shù)據(jù)中心

2011-09-29 10:13:54

IBM私有云云計算

2020-04-29 09:30:48

Google面試題工程師

2021-02-06 14:36:39

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2013-10-29 09:35:54

Windows 9概念圖

2020-04-16 12:04:09

5G基站4G

2020-01-07 08:44:33

5G網(wǎng)絡(luò)4G

2020-11-02 07:59:40

高并發(fā)系統(tǒng)業(yè)務(wù)

2025-02-24 09:56:13

交換機(jī)網(wǎng)絡(luò)通信

2021-06-24 05:39:16

Windows 1操作系統(tǒng)微軟

2013-12-03 10:33:51

微軟Windows 9

2024-03-13 13:46:44

2009-11-20 09:19:43

2024-06-07 15:15:56

點贊
收藏

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

国产视频福利一区| 中文字幕欧美日韩va免费视频| 妞干网在线播放| 乱精品一区字幕二区| 久久激情久久| 欧美成人久久久| 日本黄色片在线播放| av在线不卡精品| 亚洲在线免费播放| 水蜜桃一区二区| 丰满岳乱妇国产精品一区| 久久久久久穴| 欧美激情亚洲综合一区| 成人性视频免费看| 欧美成人专区| 日韩一级二级三级精品视频| 男人天堂999| 1区2区在线观看| 国产午夜一区二区三区| 福利视频一区二区三区| www.久久久久久久| 亚洲激精日韩激精欧美精品| 中文字幕在线观看日韩| 日本黄色特级片| 国产 日韩 欧美 综合 一区| 欧美日韩国产首页| 热久久精品国产| 123区在线| 一区二区在线观看免费| 亚洲日本精品一区| 国产一区精品| 久久综合九色综合久久久精品综合| 亚洲自拍欧美色图| 亚洲最大成人在线视频| 三级精品在线观看| 欧美一区二区三区图| 久久久久久久久久久97| 五月天久久网站| 丝袜美腿亚洲一区二区| 好吊视频在线观看| 亚洲制服一区| 亚洲高清一二三区| 成人一区二区三区仙踪林| 日韩欧乱色一区二区三区在线| 色婷婷一区二区| 无码人妻精品一区二区三区在线| 欧美xxx黑人xxx水蜜桃| 亚洲精品久久7777| 日韩一级特黄毛片| 色呦呦在线播放| 亚洲一区在线观看免费观看电影高清 | 黄色一级片网址| 日本在线视频站| 国产精品美女久久久久av爽李琼| 欧美午夜精品久久久久久蜜| 日本国产在线| 久久久噜噜噜久噜久久综合| 欧美日韩国产一二| av福利在线播放| 国产精品福利影院| 超碰97在线看| 免费网站在线观看人| 一区二区三区美女| 真人抽搐一进一出视频| 九色porny丨入口在线| 精品福利在线看| 久久无码高潮喷水| 78精品国产综合久久香蕉| 欧美日韩在线播| 午夜啪啪小视频| 日韩第一区第二区| 亚洲黄在线观看| 久久久久亚洲av无码专区桃色| 最新亚洲精品| 最近2019年中文视频免费在线观看 | 热99这里只有精品| 女生影院久久| 欧美三级韩国三级日本一级| 午夜视频在线观| 国产精品久久久久av蜜臀 | 波多野结衣在线影院| 亚洲国产精品成人久久综合一区| 亚洲精品一区国产精品| fc2ppv国产精品久久| 亚洲大片免费看| 美女网站免费观看视频| 电影91久久久| 亚洲精品成人av| 日韩影视一区二区三区| 欧美二区视频| 日本精品性网站在线观看| 亚洲图片欧美在线| 成人午夜激情片| 视频一区二区三区免费观看| av免费在线观看网站| 欧美日韩精品在线视频| 欧美成人福利在线观看| 国产精品白丝一区二区三区| 中文字幕亚洲欧美| av大片免费在线观看| 免费看黄色91| 国产亚洲欧美另类一区二区三区| 国产大学生校花援交在线播放 | 99久久精品国产亚洲| 男女性色大片免费观看一区二区| 成人激情av| 1769在线观看| 欧美视频一区二区三区…| 午夜视频在线观| 神马电影久久| 久久理论片午夜琪琪电影网| 中文字幕在线播放av| 91在线播放网址| 中文字幕一区二区中文字幕| 天堂av中文在线观看| 欧美成人福利视频| 亚洲精品天堂网| 久久av一区二区三区| 成人av免费在线看| 嫩草在线视频| 91黄色在线观看| 精品国产av色一区二区深夜久久| 91精品天堂福利在线观看| 日韩美女在线观看| 天天舔天天干天天操| 亚洲精品免费在线| 伊人网在线综合| 国产亚洲精品美女久久久久久久久久| 久久久久久久久久久久久久久久久久av| 伊人亚洲综合网| 国产欧美一区在线| 免费观看日韩毛片| 欧美人与动xxxxz0oz| 欧美日韩电影在线观看| 国产女18毛片多18精品| 国产精品你懂的| www.99av.com| 欧美日韩精品一区二区视频| 欧美在线亚洲在线| 视频国产一区二区三区| 亚洲成在人线免费| 国产chinese中国hdxxxx| 国精品一区二区三区| 91在线精品视频| 黄色av电影在线播放| 欧美日本在线视频| 一区二区三区在线播放视频| 日韩电影免费一区| 日韩aⅴ视频一区二区三区| 亚洲午夜天堂| 亚洲人成绝费网站色www| 国产三级精品三级在线观看| 久久丝袜美腿综合| 天天爽人人爽夜夜爽| 日韩成人精品一区| 国产精品激情自拍| 日本福利在线| 日韩一区二区影院| 精品在线视频观看| 91丨九色丨国产丨porny| 91精品91久久久中77777老牛| 亚洲第一论坛sis| 国产精品99久久久久久人| 不卡在线视频| 欧美一区二区视频在线观看| 国产高清在线免费观看| 成人久久视频在线观看| 日韩欧美国产免费| 国产精品亚洲二区| 亚洲a一级视频| 国产丝袜精品丝袜| 精品视频在线导航| 中文字幕av网站| 中文字幕中文字幕一区| 超级砰砰砰97免费观看最新一期| 国内精品福利| 久久综合久久久| 日本免费成人| 久久免费视频网| 免费在线高清av| 欧美精品亚洲二区| 国产成人无码精品久久久久| 国产三区在线成人av| 999热精品视频| 国产精品亚洲产品| 致1999电视剧免费观看策驰影院| 波多野结衣一区二区三区免费视频| 97视频网站入口| 午夜在线免费观看视频| 精品裸体舞一区二区三区| 丁香社区五月天| 亚洲伦在线观看| 亚洲国产欧美视频| 极品尤物av久久免费看| 欧美日本视频在线观看| 99精品全国免费观看视频软件| 国产视频在线观看一区| 国产一区影院| 97在线视频免费| 成人短视频在线| 亚洲精品www久久久| 国产精品无码白浆高潮| 欧美午夜片在线免费观看| 91插插插插插插| 久久女同精品一区二区| 国产免费a级片| 美洲天堂一区二卡三卡四卡视频 | 日韩欧美国产一区在线观看| 无码人妻久久一区二区三区| 亚洲激情成人在线| 三级黄色片在线观看| 久久久五月婷婷| 中文字幕视频观看| 久久99精品久久久久婷婷| 成人免费观看视频在线观看| 亚洲特色特黄| 国产奶头好大揉着好爽视频| 国产伦精品一区二区三区千人斩| 不卡一区二区三区视频| 国产日韩一区二区三免费高清 | 免费精品一区| 国产精品视频在线观看| 日韩电影av| 7777免费精品视频| 欧美hdxxxxx| 久久国产精品首页| 久草资源在线观看| 最近的2019中文字幕免费一页| 手机看片福利在线观看| 亚洲国产高清高潮精品美女| hs视频在线观看| 在线观看91av| 一区二区三区午夜| 日本道色综合久久| 亚洲av中文无码乱人伦在线视色| 午夜亚洲福利老司机| 国产精品111| 一区二区三区小说| 国产av无码专区亚洲av毛网站| 国产精品的网站| 手机看片国产日韩| 国产精品美日韩| 91狠狠综合久久久久久| 中文字幕av在线一区二区三区| 精品无人区无码乱码毛片国产| 久久日韩粉嫩一区二区三区| 99久久人妻无码中文字幕系列| 东方aⅴ免费观看久久av| 久久无码专区国产精品s| 成人夜色视频网站在线观看| 中文字幕人妻一区| 99久久婷婷国产综合精品| 中国一级特黄录像播放| 91在线精品秘密一区二区| av中文字幕免费观看| 国产午夜精品一区二区三区四区| 四虎成人免费影院| 国产精品狼人久久影院观看方式| 伊人久久久久久久久久久久久久| 亚洲欧美日韩综合aⅴ视频| 国产av 一区二区三区| 亚洲国产精品一区二区久久恐怖片| 日韩成人一区二区三区| 黑人巨大精品欧美一区二区三区| 国产精品suv一区| 欧美日韩国产系列| 亚洲AV无码国产精品午夜字幕 | 在线亚洲伦理| 中文字幕第80页| 久久99热这里只有精品| 麻豆短视频在线观看| 91麻豆精品在线观看| 国产午夜福利一区| 亚洲老妇xxxxxx| 国产香蕉视频在线| 欧美喷水一区二区| 亚洲乱码精品久久久久.. | 国产精品午夜av在线| 欧美重口另类| 亚洲午夜精品福利| 日韩视频在线一区二区三区 | 亚洲第一网站在线观看| 欧美另类一区二区三区| 免费激情视频网站| 一区二区日韩精品| 青青在线视频| 国产精品海角社区在线观看| 国产精品一站二站| 久久亚洲一区二区| 91精品天堂福利在线观看| 欧美日韩在线一| 久久成人综合网| 91视频啊啊啊| 18欧美乱大交hd1984| wwwwww国产| 欧美一区二区福利在线| 久久久资源网| 欧美猛交ⅹxxx乱大交视频| 欧亚在线中文字幕免费| 91久久久久久国产精品| 欧美激情网址| 精品国产一区二区三区在线| 性欧美长视频| 一区二区三区四区影院| 国产精品每日更新在线播放网址| 日韩伦人妻无码| 在线综合视频播放| 成人影视在线播放| 欧美在线www| julia中文字幕一区二区99在线| 日韩中文一区| 每日更新成人在线视频| 亚洲欧洲国产视频| 成人免费一区二区三区在线观看| 精品国产一区二区三区四| 欧美刺激午夜性久久久久久久| 91caoporn在线| 日本欧美国产在线| 蜜桃久久久久| 97超碰国产精品| 国产精品自产自拍| 久久噜噜色综合一区二区| 色美美综合视频| 亚洲av成人精品毛片| 欧美丰满老妇厨房牲生活 | 日本人妖一区二区| 久久人人爽人人爽人人片| 亚洲一区日韩精品中文字幕| 国产精品无码免费播放| 色妞久久福利网| 成人性片免费| 视频一区视频二区视频三区视频四区国产 | 久久精品人人爽人人爽| 久久精品视频7| 亚洲精品久久久久久下一站| 黑人玩欧美人三根一起进| 999在线免费观看视频| 亚洲一级毛片| 亚欧美一区二区三区| 最新久久zyz资源站| 亚洲一区精品在线观看| 中文字幕精品网| 国产成人午夜性a一级毛片| 日韩欧美视频第二区| 免费观看在线色综合| 欧美成人久久久免费播放| 欧美视频中文字幕| 乱人伦中文视频在线| 成人激情免费在线| 欧美在线视屏| 免费观看一区二区三区| 亚洲一二三四在线| 香蕉国产在线视频| 欧美一级淫片播放口| 国产精品三级| 97超碰成人在线| 亚洲男人天堂一区| 国内毛片毛片毛片毛片| 欧美黄色小视频| 日本一区福利在线| 毛片av免费在线观看| 久久精品亚洲一区二区三区浴池| 中文字幕乱码在线观看| 久久久国产精彩视频美女艺术照福利| 成人免费91| 成人午夜视频在线观看免费| 97精品国产露脸对白| 免费视频网站在线观看入口| 色婷婷久久av| 第一区第二区在线| 久久久久久久少妇| ...xxx性欧美| 天堂中文网在线| 国产精品高清在线观看| 亚洲精品二区三区| 国产又粗又长又爽| 欧美亚洲国产一区二区三区| 91网在线看| 鲁鲁视频www一区二区| 麻豆精品新av中文字幕| 国产一二三四在线| 亚洲欧美日韩国产精品| 亚洲视频资源| 91成人在线观看喷潮教学| 国产精品视频你懂的| 俄罗斯嫩小性bbwbbw| 日韩av片电影专区| 欧美激情第二页| 成人国产精品久久久网站| 91精品国产美女浴室洗澡无遮挡| 97人澡人人添人人爽欧美| 亚洲不卡1区| 成人黄色av电影| 中文字幕一区二区久久人妻| 久久久久久综合网天天| 欧美精品一区二区三区精品| 人妻 丝袜美腿 中文字幕| 欧美视频一区在线观看| 欧美日韩在线观看首页| 性做爰过程免费播放|