久久久精品视频在线_免费在线a视频_在线看的黄色网址_懂色av粉嫩av浪潮av_艳妇乳肉豪妇荡乳av_国产午夜大地久久_国产在线观看免费播放_天堂视频免费看_久久精品女同亚洲女同13_各处沟厕大尺度偷拍女厕嘘嘘

當前位置: 首頁 >推薦 > 正文

一種新型的系統設計解決方案:模塊樹驅動設計

2023-07-05 04:56:42 來源:https://www.cnblogs.com/shoshana-kong/p/14957739.html)5.3 TMF2在架構設計上主要的思想業(yè)務包與平臺分離的插件化架構:平臺提供插件包注冊機制,實現業(yè)務方插件包在運行期的注冊。業(yè)務代碼只允許存在于插件包中,與平臺代碼嚴格分離。業(yè)務包的代碼配置庫也與平臺的代碼庫分離,通過二方包的方式,提供給容器加載。全鏈路統一的業(yè)務身份:平臺需要能有按“業(yè)務身份”進行業(yè)務與業(yè)務之間邏輯隔離的能力,而不是傳統SPI架構不區(qū)分業(yè)務身份,簡單過濾的方式。如何設計這個業(yè)務身份,也成為業(yè)務間隔離架構的關鍵。管理域與運行域分離:業(yè)務邏輯不能依靠運行期動態(tài)計算,要能在靜態(tài)期進行定義并可視化呈現。業(yè)務定義中出現的規(guī)則疊加沖突,也在靜態(tài)器進行沖突決策。在運行期,嚴格按照靜態(tài)器定義的業(yè)務規(guī)則、沖突決策策略執(zhí)行。圖片
一、前言

系統設計的核心作用是在業(yè)務現實世界和抽象的IT實現之間建立起一道橋梁。

與其他行業(yè)被物理特性限制所束縛不同,軟件世界可以變得無限龐大,而限制軟件發(fā)展的其實是人的認知能力。所有軟件設計服務的目標其實都是管理人的認知,是關于人有限的精力如何學習軟件中無限多的知識(Knowledge)的問題。


(資料圖片僅供參考)

軟件行業(yè)從傳統的瀑布開發(fā)模式,過渡到了敏捷開發(fā)模式,對于文檔,敏捷宣言中說的是“工作的軟件高于詳盡的文檔”,但實際工作中開發(fā)人員寫的文檔是越來越少,或者是能不寫就不寫;流程上,更是恨不得需求還沒有出來就直接擼代碼,擼完代碼就直接上線。

缺乏整體系統設計,設計出來的系統就不夠完善,再加上快速的系統迭代,導致系統越來越難以維護,開發(fā)成本越來越高,一個項目需要參與的人越來越多,最終沒有人能夠說明清楚,這個系統具體是如何運行的了。隨著團隊人員的更替,加上每個人的設計思路又不一樣,更加加重了系統的復雜性。

上面也就引入了兩個問題:

缺乏文檔問題:不清楚系統長什么樣?軟件復雜度高的問題:迭代修改系統的成本高。

上面兩個問題在MTDD都有相應的解法,后面我們會詳細講述,接下來我還是再詳談一下軟件復雜度。

2、軟件復雜度2.1 軟件復雜度的癥狀和原因

《軟件設計哲學》這本書中提到,軟件復雜度的三種癥狀:

變化放大:需要修改一個地方,卻發(fā)現改動的點涉及全站,導致難度倍增;認知負荷:開發(fā)者需要完成一項任務的知識量;未知:開發(fā)者在修改代碼后,不知道它的實際影響面。

為了從源頭上解決這些問題,John Ousterhout教授提出:從項目一開始就要嚴格遵循進行軟件設計的原則,那些為了趕工期而沒有經過良好設計的代碼,最終經過多次迭代后,都會變得越來越臃腫,繼而變得再也無法維護了。

我非常認可John Ousterhout的觀點,但

實際操作中發(fā)現基本不具有可行性,原因:

.從瀑布模式到敏捷開發(fā),已經很難回去了。是否遵循良好的軟件設計原則很難衡量。沒有這么多的時間來檢查(代碼review,設計renview)是否有按照這些原則來設計和編碼。

我的觀點

對于“簡化模塊依賴”,“減少模糊性”,“高內聚低耦合”這些原則的話術,知道的人就知道怎么做,不知道的人還是不知道怎么做。這些術語缺少實際的指導性。

2.2 軟件復雜度是怎么引入的(另外一個角度)2.2.1 我們來看一個例子

圖片

2.2.2 系統到底是誰做出來的

一個有意思的現象:

圖片

那系統到底是誰做出來的呢?(這里主要說的是業(yè)務系統。一些中間件之類的系統,基本都都由研發(fā)來完成的。)

圖片

系統設計離不開,業(yè)務人員、產品經理以及技術研發(fā)的合作,業(yè)務和產品的需求沒有理清楚,同樣會導致系統復雜度提升。

2.2.3 另外一種系統復雜度引入環(huán)節(jié)

圖片

系統各主要相關方缺乏對系統設計的信息拉齊,給系統復雜度的提升同樣有重要的貢獻。

那么如何讓各角色更好的進行信息對齊,這就引入了MTDD。

3、一種新型的系統設計解決方案:MTDD

前面提到了《軟件設計哲學》作者提出了一些系統設計總結,也有些人提出了一些方法論,比如領域驅動設計(DDD),測試驅動開發(fā)(TDD),行為驅動開發(fā)(BDD);但是這些模式,都是從設計方法論上給與指導,戰(zhàn)術上指導偏少。下面我們來介紹我自己沉淀的一個方法論,和戰(zhàn)術指導MTDD&MTDP。

3.1 MTDD是什么

MTDD的全稱是:Module Tree Drive Design, 模塊樹驅動設計,也可以叫做能力樹驅動設計。MTDD是一種系統設計模式,并同時提供了戰(zhàn)術層的SDK。

MTDD主要思想是讓業(yè)務,產品、研發(fā)共同對復雜業(yè)務系統中的模塊進行分析,并對這些業(yè)務模塊做好分層分類,最終形成各方達成一致的一棵模塊樹;研發(fā)人員開發(fā)可以通過給定的SDK,將系統中的代碼按照模塊的方式進行打標分類,系統根據代碼中打標分類,自動生成一顆可視化的模塊樹。通過這個方式,讓系統與業(yè)務保持高度一致。

MTDD從某個方面說也是DDD領域驅動設計中所宣導的統一語言一種實現方式。

MTDD思想主要體現在:

當業(yè)務和產品需要對系統能力進行新增、修改、或者擴展時,可以對照系統這顆可視化的模塊樹進行溝通,然后進行思考和設計具體的哪個或者哪些模塊需要進行修改或者擴展,并產出修改后的最終結果。研發(fā)人員接到接到需求后開發(fā)完成后,新開發(fā)的功能就會自動的在系統的模塊樹上進行呈現。產品和業(yè)務驗收時,就可以對照系統上的模塊樹,進行功能驗收。3.2 MTDD的特點3.2.1 模塊化

在系統設計中,模塊是指一組相互依賴的程序元素,通常是在模塊內部完成特定的工作。模塊也可以被組合以形成更大的、更復雜的系統。子模塊則是模塊的一部分,通常是實現特定的功能。

在MTDD中, 模塊化更多的是從業(yè)務的角度上來說的,比如一個營銷觸達模塊,比如倉儲系統中的入庫模塊;模塊下面還可以有子模塊,子模塊也可以有子子模塊, 這個可以根據一定的顆粒度進行靈活拆分,重點是業(yè)務,產品、研發(fā)三方達成一致,并且明確模塊的關系(父子關系)。

3.2.2 分類與分層

將模塊化的模板進行分層分類。

在系統設計中,分層和分類是非常重要的,這有助于提高系統的可擴展性和可維護性,也能很好的降低人的認知負荷。

OOD(面對對象設計)本質就是一種分類思想。DDD(領域驅動設計)本質也是一種分類思想。

分層設計:

在現實世界中,所有我們見到的事物,人類都自然的對其給與了分層,比如:

圖片

再比如在倉儲管理中,也會有天然的分層:

圖片

分層分類-復雜度分解:

我們的目標是將一些同類型的提高一個抽象層次,將大腦比較難處理的9個概念簡化成3個,這樣就無需記憶其中的每個概念,另外由于較高層次的思想總是能夠提示下面一個層次的思想,所以記憶起來會更方便。所有的思維過程(思考、記憶、解決問題)都應該使用這樣的分組和概括的方法,將大腦中的無序信息組成一個相關關聯的金字塔結構。

每個模塊下又可以有多個子模塊。

總而言之,設計人員對模塊進行分層分類后,可以大大降低思考復雜度, 這個很好理解。

圖片

3.2.3可視化

分層分類的模塊以樹狀接口進行可視化呈現。

左邊圖描述的是:業(yè)務、產品、研發(fā)對齊需求后,認為的業(yè)務系統上需要建設兩個子模塊的能力。

右邊的圖是:研發(fā)實現產品需求后,系統自動生成的能力樹的樣子。

3.2.4 強大的配置化能力

所有的業(yè)務配置,都是業(yè)務相關的,系統用來控制業(yè)務的邏輯,本質就是業(yè)務的一部分。在傳統的業(yè)務系統中一般有兩種方式來實現:

使用需要一個配置中心,配置中心一般都使用key-value的方式來存儲。業(yè)務系統根據配置的key到配置中心來獲取value,并解析value的值。業(yè)務人員直接在配置中心來做配置值的修改。每個配置單獨開發(fā)配置頁面,業(yè)務人員在配置頁面上進行值修改。

這兩種方式都存在一些問題:

使用配置中心,雖然將所有的配置都進行了統一,但是面對一些負責配置時,需要采用類似json這種格式來存儲,修改的時候只能修改json的值,無法通過頁面富樣式頁面來修改。每個頁面單獨開發(fā)配置頁面,對配置友好,但是開發(fā)工作量大,因為每個配置都需要前端開發(fā)。

使用MTDD配置化能力時,就可以解決上面兩個問題

業(yè)務配置一定屬于具體的業(yè)務模塊,因為配置是用戶控制某個具體的模塊邏輯,所以配置盡量掛在模塊下面是一個非常自然的做法。

我的觀點

業(yè)務配置一定屬于具體的業(yè)務模塊,因為配置是用戶控制某個具體的模塊邏輯,所以配置盡量掛在模塊下面是一個非常自然的做法。

3.2.5 其他優(yōu)勢讓業(yè)務,產品,在提需求的時候,就能夠以系統能力的方式去思考。在有新需求時,產研可以方便的在能力樹上找到需要改動的模塊。測試的影響范圍也很容易確定。對修改友好,影響范圍可控。讓程序員天然的進行開閉原則,對新增開放,對修改改封閉。3.3 MTDD作用與總結

系統設計的核心作用是在業(yè)務現實世界和抽象的IT實現之間建立起一道橋梁。而業(yè)務系統本身就是現實世界在計算機系統中的映射。

現實世界是一個模塊化的,層次化的樹狀結構,所以業(yè)務系統就應該自然的通過模塊化的樹狀結構來進行映射。

MTDD正是基于此,通過一個可視化的能力樹,這顆能力樹作為實實在在,可以看得見的橋梁,來拉齊業(yè)務、產品和系統研發(fā)。并最終做到讓業(yè)務和產品,可以真正以產品能力搭建的視角來規(guī)劃,設計系統模塊和系統功能。可以讓系統架構人員自然而然的進行高內聚,低耦合的系統設計,可以讓一線研發(fā)自然而然的進行模塊化編程。

模塊樹驅動設計閉環(huán)

圖片

4、MTDD實戰(zhàn)4.1 MTDD戰(zhàn)略層4.1.1 統一語言

DDD中也有統一語言,或者叫做“通用語言(Ubiquitous Language )”

當團隊成員不能享用一個公共語言來討論領域時,項目會面臨嚴重的問題。領域專家使用自己的行話,技術團隊成員在設計中也用自己的語言討論領域。

代碼可能是一個軟件項目中最重要的產物,但每天用來討論的術語卻與代碼中使用的術語脫節(jié)了。即使是同一個人都需要使用不同的 語言來交談和書寫,所以要想完成對領域的深刻表達通常需要產生 一種臨時形式,但這種形式不會出現在代碼甚至是書寫的內容中。

在交流的過程中,需要做翻譯才能讓其他的人理解這些概念。開發(fā) 人員可能會努力使用外行人的語言來解析一些設計模式,但這并一定都能成功奏效。領域專家也可能會創(chuàng)建一種新的行話以努力表達 他們的這些想法。在這個痛苦的交流過程中,這種類型的翻譯并不能對知識的構建過程產生幫助。

上面這段是話是摘自《領域驅動設計精簡版 》

Eric Evans 早就意識到,需要在領域專家和研發(fā)之間共用一套通用語言,并且Eric Evans也做了大量的舉例說明,來說明什么是通用語言,以及統一通用語言可以更好的服務于系統設計。

MTDD更也是站在巨人的肩膀上,提供了一個方法論:讓業(yè)務,產品,技術在系統設計之前,一起對照系統模塊樹來進行溝通;對于一個新功能,一起思考是在某個模塊下新增模塊,還是修改貨擴展模塊內部的邏輯;在對齊后,就可以進行開發(fā)了,并且研發(fā)有一定的范式開做開發(fā),開發(fā)后,系統的模塊樹就能夠自動可視化的呈現出來;業(yè)務和產品也可以通過可視化的方式進行驗收;

4.1.2 按定制規(guī)范來做設計和開發(fā)

上面說了在業(yè)務方、產品、技術在參照能力樹根據需求并對齊需要開發(fā)的模塊后,研發(fā)可以按照一定的范式做系統開發(fā);這是因為我們提供了一套開發(fā)的SDK,以及SDK的使用文檔,來幫助研發(fā)人員來進行基于能力樹功能的開發(fā)。系統功能開發(fā)完成后,相應的模塊信息就可以自動在模塊樹頁面上進行呈現。當然想要在頁面上進行呈現,需要有前端來支持。

這個規(guī)范主要由幾個主要的java注解來實現:

@Module@ModuleConfig@ConfigItem

4.1.3系統的模塊化以及分層分類

使用上面的java注解,對代碼中模塊進行打標。

業(yè)務模塊化,并且做了分層與分類,那么系統中的代碼需要根據業(yè)務中的分層分類進行進行分類打標,使其與業(yè)務分層分類保持一致。

4.1.4 持續(xù)重構(Continue Refactor)

我們這個世界夠復雜了吧,如果讓你設計一個IT系統來實現刻畫這個世界的方方面面,我打賭一定沒有人搞得定;但現實中的這個世界還是能夠有條不紊的發(fā)展演進,沒有需要出現“推倒重來”的現象,為什么呢, 我認為是我們的世界一直在用各種方式不停的重構。

“物競天擇,適者生存”出自達爾文的進化論,達爾文在1859年出版的《物種起源》一書中系統地闡述了他的進化學說。物競天擇,適者生存是指物種之間及生物內部之間相互競爭,物種與自然之間的抗爭,能適應自然者被選擇存留下來的一種叢林法則。

對于軟件系統也是這樣,業(yè)務是在不停的發(fā)展, 我們的認知也是一直不斷的更新,當“我們”通過可視化的能力樹發(fā)現一些突兀時,那肯定是某個或者某些模塊拆分不正確,或者模塊提供的能力不合適,這時,我們就可以考慮對模塊樹進行重構了,要么是拆分模塊,要么是調整模塊的關系,要么是修改模塊的職責。

4.1.5關于產品需求

如果產品了解MTDD,那么就會提出更加符合產品化的需求了

如果研發(fā)對MTDD理解深入,那么當產品的需求不符合產品化,能力化時,就會與產品進行溝通,產品修改需求,以便更好的設計出產品化,系統能力化的需求。

?好的產品需求

×不好的產品需求

對現有系統能力的擴展增加新的系統能力

針對特定的業(yè)務需求 定制系統能力

4.2MTDD戰(zhàn)術層(MTDP)

MTDP的全稱是Module Tree Drive Programing, 領域樹驅動編程。

4.2.1模塊

注解@Module的定義

/** * * 模塊注解,打在一個服務類上,Module注解是繼承了Component注解,因此它注解的類可以被實例化到Spring中去 * 服務啟動時會掃碼所有Module類,將他們組裝成樹進行持久化。 */@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Component@Documentedpublic @interface Module {    /**     * 該模塊的key     * 在設置模塊的key的時候,在同一個服務里面(同一個根節(jié)點),如果兩個類設置的key是一樣,最后會被去重為一個模塊,無論是單體服務還是分布式工程。     * moduleKey全局唯一,就算它們歸屬不同的根節(jié)點,也不能設置一樣的moduleKey,     * 不同根節(jié)點的模塊,如果設置了同一個moduleKey,后部署的服務將無法能力樹的變更情況進行持久化。     * @return     */    String moduleKey();    /**     * 用于指定該模塊的父模塊,     * 根節(jié)點的parentModule指定為 {@link Void}.class。     * 每個模塊指定他們的夫模塊,直到可達根節(jié)點,最后生成一顆樹。     * 指定parentModule時一定要注意,不能循環(huán)依賴了,循環(huán)依賴的情況下,服務將拋出異常無法啟動,     * @return     */    Class parentModule();    /**     * 該模塊名稱     * @return     */    String moduleName();    /**     * 模塊描述,一個該模塊詳細的描述     * @return     */    String moduleRemark() default "";    /**     * 能否被剪枝,你是可以設置模塊能不能被剪枝,默認是不可以的(后續(xù)會根據數量對比情況進行調整默認值)。     * 我們應該將系統中必要的功能設置為無法裁減,將那些加強性的能力,智能化的能力,衍生化的能力,非基本的能力設置為可以裁減     * @return     */    boolean cutAble() default false;}

模塊的具體例子:

@Module(moduleKey = "scm.wms", moduleName = "WMS", parentModule = NULL)public class WmsModule {    //業(yè)務邏輯}@Module(moduleKey = "scm.wms.inner.test1", moduleName = "測試模塊1", parentModule = WmsModule.class)public class InnerTestModule1 {    //業(yè)務邏輯}@Module(moduleKey = "scm.wms.inner.test2", moduleName = "測試模塊2", parentModule = WmsModule.class)public class InnerTestModule2 {    //業(yè)務邏輯}
4.2.2 模塊樹

每個模塊都有父模塊ParentModule,跟模塊的父模塊為NULL,模塊樹則是由所有模塊組成的一個樹狀結構的樹。

圖片

4.2.3 裁剪與恢復

圖片

4.2.4 模塊配置

找到模塊上的配置,點擊展開配置

圖片

展開配置如下:

圖片

上面的配置,是無需前端進行開發(fā),只需要后端實現就好,后端代碼:

@Data@ModuleConfig(configKey = "scm.wms.inbound.receive.oneBarcodeMuliSku", configName = "收貨一碼多品配置", module="scm.wms.inbound.receive")public class ReceiveScanOneCodeMoreSkuModuleConfig {    @ConfigItem(itemName = "是否開啟一碼多品的攔截"            , itemRemark = "如果關閉, 一碼多品的商品在收貨時, 不會收到\"該條碼對應多個商品,請打印商品標簽\"的提醒, prd:https://poizon.feishu.cn/wiki/wikcnstRj3Qfbn4fXDrmvBk6R0d"            , defaultValue = "true")    private Boolean isOpen;    @ConfigItem(itemName = "攔截方式"            , itemRemark = "如果配置強攔截,則必須打印商品標簽, 阻斷收貨流程。如果配置弱攔截, 只是提醒一下, 不阻斷收貨流程"            , scopeClass = InterceptType.class            , defaultValue = "WEAK")    private String interceptType;    @ConfigItem(itemName = "攔截規(guī)則"            , scopeClass = InterceptRuleType.class            , defaultValue = "ARBITRARY")    private String interceptRule;}

配置的幾個java注解:

ModuleConfig
/** * 業(yè)務配置注解,業(yè)務配置是Module的字段 */@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ModuleConfig {    /**     * 配置的key     */    String configKey();    /**     * 配置名稱     * @return     */    String configName();    /**     * 配置描述,鼠標懸浮時的氣泡提示     * @return     */    String configRemark() default "";    /**     * 是否必要,必要的不可以被剪枝     * @return     */    boolean cutAble() default false;}
ConfigItem 配置屬性
@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ConfigItem {    /**     * 配置名稱     * @return     */    String itemName();    /**     * 配置描述,鼠標懸浮時的氣泡提示     * @return     */    String itemRemark() default "";    /**     * 默認值     * @return     */    String defaultValue() default "";    /**     * 如果你的取值范圍是枚舉指定枚舉的全路徑類名,     * 如果你的取值范圍是一種策略,指定策略的interfaces的全路徑名稱     * @return     */    Class scopeClass() default Void.class;    /**     * 范圍,默認通用,當你需要定制時才需要指定     * @return     */    ScopeType scopeType() default ScopeType.COMMON;    /**     * 自定義組件,需要前端參與開發(fā),非特殊組件,無需設置,DSK會自動給你尋找組件     * @return     */    String customScopeType() default "";    /**     * 對位文本類型的配置,min則為文本長度限制的最小值     * 對于數字類型的配置,min則為數字的最小值。     */    int min() default Integer.MIN_VALUE;    /**     * 對位文本類型的配置,min則為文本長度限制的最大值     * 對于數字類型的配置,min則為數字的最大值。     */    int max() default Integer.MAX_VALUE;}
5、MTDD與TMF的差別5.1 什么是TMF

TMF 是 Trade Modularization Framework 的全稱,即交易模塊化框架,最初是交易系統中的一個代碼模塊,后來剔除業(yè)務耦合部分,獨立出來成為一個實現業(yè)務與平臺分離的業(yè)務框架。

5.2TMF架構

圖片

(圖片來源:https://www.cnblogs.com/shoshana-kong/p/14957739.html)

5.3 TMF2在架構設計上主要的思想業(yè)務包與平臺分離的插件化架構:平臺提供插件包注冊機制,實現業(yè)務方插件包在運行期的注冊。業(yè)務代碼只允許存在于插件包中,與平臺代碼嚴格分離。業(yè)務包的代碼配置庫也與平臺的代碼庫分離,通過二方包的方式,提供給容器加載。全鏈路統一的業(yè)務身份:平臺需要能有按“業(yè)務身份”進行業(yè)務與業(yè)務之間邏輯隔離的能力,而不是傳統SPI架構不區(qū)分業(yè)務身份,簡單過濾的方式。如何設計這個業(yè)務身份,也成為業(yè)務間隔離架構的關鍵。管理域與運行域分離:業(yè)務邏輯不能依靠運行期動態(tài)計算,要能在靜態(tài)期進行定義并可視化呈現。業(yè)務定義中出現的規(guī)則疊加沖突,也在靜態(tài)器進行沖突決策。在運行期,嚴格按照靜態(tài)器定義的業(yè)務規(guī)則、沖突決策策略執(zhí)行。

圖片

(圖片來源:https://www.infoq.cn/article/w3ztwqs9q4astbksd0mj)

5.4MTDD VS TMF

圖片

6、MTDD 展望6.1 將模塊間的耦合度進行量化

前面有提到“持續(xù)重構”這個概念;但是持續(xù)重構提出來很容易,但是做起來,就沒有這么簡單;

What:首先是如何發(fā)現需要重構的點,為什么是這個點要重構,而不是那個點要重構。

When:其實是什么時候需要進行重構。

為了更好的回答上面兩個問題,個人認為最重要的是能夠量化兩個模塊的復雜度。

?:高內聚低耦合,但是耦合度到底高還是低,如何衡量。想要衡量,就需要做到數據化,指標化。

6.2 將模塊間的耦合度進行可視化

圖片

標簽:

返回頂部
亚洲国产日韩在线一区| 久久av高潮av| 欧美自拍偷拍一区二区| 香蕉视频一区二区| 六月激情综合网| 波兰性xxxxx极品hd| 亚洲 欧美 精品| 中文字幕 国产| 欧美日韩大片在线观看| 黄色网页免费在线观看| 任我爽在线视频| 中文字幕在线视频播放| 91在线视频国产| 粉嫩aⅴ一区二区三区| 成人性生生活性生交12| 玖玖精品在线视频| 在线观看亚洲大片短视频| 免费高清视频在线观看| 国产精品久久久久久久久毛片 | 亚洲免费观看在线| 99草在线视频| 91porny九色| 欧美黄色免费观看| 不卡av免费在线| 国自产拍偷拍精品啪啪一区二区| 日韩在线不卡av| 人妻一区二区视频| 亚洲av成人片色在线观看高潮| 亚洲第一大网站| 97久久人国产精品婷婷| av一级在线观看| 日韩手机在线观看| 久久久久亚洲天堂| 久久出品必属精品| 激情视频免费网站| www.色就是色| ww国产内射精品后入国产| 国风产精品一区二区| 精品国产国产综合精品| 无码人妻丰满熟妇啪啪欧美| 在线观看av中文字幕| 人妻换人妻a片爽麻豆| 性xxxx视频| 亚欧洲精品视频| 天天干免费视频| 日本韩国免费观看| 亚欧在线观看视频| 成人做爰69片免费| 18禁一区二区三区| 一级欧美一级日韩片| 麻豆精品国产传媒av| 黄色av电影网站| 国产不卡一二三| 亚洲av成人片色在线观看高潮 | avove在线播放| 少妇影院在线观看| 一区二区三区日韩视频| 熟女熟妇伦久久影院毛片一区二区| 免费黄色激情视频| 欧美aaa在线观看| 欧美亚洲视频一区| 久久这里只有精品18| 国产av麻豆mag剧集| 亚洲熟女乱色一区二区三区| 成年人在线看片| 手机看片一级片| 香蕉视频色在线观看| 欧美日韩激情在线观看| 国产精品999在线观看| 精品久久久久久久久久久国产字幕 | 国产av无码专区亚洲av麻豆| 99在线小视频| 凸凹人妻人人澡人人添| www.555国产精品免费| 日本黄色动态图| 一卡二卡三卡四卡| 久久国产精品国语对白| 成人免费性视频| 天堂在线资源视频| 久久久久久天堂| 中国a一片一级一片| 99久久精品国产一区色| 天堂网在线资源| 国产伦精品一区二区三区妓女| 四虎影视1304t| 欧美一级中文字幕| 免费看a级黄色片| 久久激情免费视频| 在线免费一级片| 亚洲色图 校园春色| 五级黄高潮片90分钟视频| 日本二区三区视频| 俄罗斯av网站| 国产亚洲精品久久久久久无几年桃 | 国产大片免费看| 久久国产精品视频在线观看| 亚洲免费999| www.日韩一区| 少妇又色又爽又黄的视频| 精品国产av无码| 日本天堂免费a| gogogo高清免费观看在线视频| 激情五月色婷婷| 精品区在线观看| 国产亚洲无码精品| 国产欧美123| 看看黄色一级片| 亚洲无码精品在线观看| 美女露出粉嫩尿囗让男人桶| 日本 欧美 国产| 91香蕉视频导航| 欧美三级网站在线观看| 精品国产午夜福利在线观看| 亚洲 欧美 变态 另类 综合| 欧美亚洲日本在线观看| jizz国产在线| 波多野结衣一二三区| 国产资源第一页| 九九九久久久久| 超碰在线播放97| 成年人视频软件| 好男人www社区| 在线免费看91| 中文字幕第20页| 成人在线观看你懂的| 国产精品美女久久久久av爽| 天堂在线视频免费| 三级网在线观看| 超碰在线超碰在线| 精品国产区一区二| 国产成人在线网址| 国产又黄又猛又粗| 国产精品一级二级| 色欲狠狠躁天天躁无码中文字幕| 久草资源站在线观看| 99re热视频| 成人免费毛片糖心| 国产免费又粗又猛又爽| 国产精品一区二区av白丝下载| av电影在线不卡| 天堂社区在线视频| 丰满少妇在线观看bd| 97精品在线播放| 久久人人爽av| 嫩草影院一区二区| 日本精品福利视频| 一级特黄免费视频| 一级片久久久久| www.com久久久| 亚洲精品成人区在线观看| 国产奶头好大揉着好爽视频| 久久9999久久免费精品国产| 国产精品无码电影| 日韩一级片播放| 亚洲伦理在线观看| 国产a级黄色大片| 天天干天天操天天操| 一本色道久久88| 九九视频免费在线观看| 手机免费看av片| 欧美精品成人网| 国产18精品乱码免费看| 阿v天堂2018| 97久久人国产精品婷婷| 一级性生活视频| 亚洲系列在线观看| 午夜剧场免费在线观看| 高清乱码免费看污| 日本黄色录像视频| 精品国产午夜福利| 国产又色又爽又高潮免费| 日韩精品久久久久久久| 国产jk精品白丝av在线观看| 九九九九九九九九| 在线观看国产网站| 亚洲色图偷拍视频| 蜜桃精品成人影片| 久久久久亚洲天堂| 最近中文字幕免费视频| 国产亚洲精品码| 亚洲黄色免费视频| 五月婷婷亚洲综合| 久久人妻无码aⅴ毛片a片app| 在线观看亚洲天堂| 欧美性生给视频| 欧美超碰在线观看| 少妇影院在线观看| 国产美女裸体无遮挡免费视频| 黄色片免费在线观看视频| 国产手机av在线| 日韩少妇内射免费播放18禁裸乳| 丰满人妻av一区二区三区| 日韩欧美在线免费观看视频| 影音先锋资源av| 欧美黄色免费观看| 国产精品夜夜夜爽阿娇| 姑娘第5集在线观看免费好剧| 亚洲精品偷拍视频| 99精品免费观看| 久热免费在线观看| 少妇精品一区二区| 色网站在线播放| 99久re热视频精品98| 国产偷拍一区二区| 国产三级日本三级在线播放 | 午夜剧场免费看| 国产性一乱一性一伧一色| 手机av在线看| 99产精品成人啪免费网站| 日韩精品一区二区三区色欲av| av在线天堂网| 国产成人在线观看网站| 99久re热视频精品98| 天堂在线中文网| 欧美专区第二页| 超碰成人在线免费观看| 免费观看国产视频| 久草福利资源在线观看| 99热精品免费| 少妇精品高潮欲妇又嫩中文字幕 | 给我免费播放片在线观看| 精品人妻人人做人人爽夜夜爽| 久久久无码精品亚洲国产| 国产成人无码aa精品一区| 人妻妺妺窝人体色www聚色窝| 国产aⅴ爽av久久久久| 欧美美女性生活视频| av无码精品一区二区三区宅噜噜| 污片在线免费看| 中文国语毛片高清视频| 亚洲高清视频在线播放| 久久久久久久久久久久国产| 台湾无码一区二区| 国产草草浮力影院| 亚洲资源在线播放| av中文字幕网址| 水蜜桃在线免费观看| 亚洲欧洲国产视频| 国产三级理论片| 免费网站在线观看黄| 国产精品夜夜夜爽张柏芝| 一级黄色电影片| 中文字幕在线视频免费| 九一精品久久久| 久久这里只有精品18| 人妻大战黑人白浆狂泄| 亚洲av无码片一区二区三区| 日韩av男人天堂| 免费av观看网址| 久久福利免费视频| 在线观看国产免费视频| 99精品久久久久久中文字幕| 在线看成人av| xxxx一级片| 成人短视频在线观看免费| 国产精品高清无码在线观看| 亚洲女人18毛片水真多| 无码人妻av一区二区三区波多野| 一区二区三区网址| 亚洲色成人www永久在线观看| 四虎国产精品成人免费入口| 性高潮久久久久久久久久| 亚洲图片中文字幕| 国产成人自拍视频在线| 五月婷婷激情久久| 搞av.com| 国产大片免费看| 国产又粗又猛又爽又黄av| 能看毛片的网站| xxxx国产精品| 青青艹在线观看| www.99re7.com| 91国内在线播放| 丝袜老师办公室里做好紧好爽| 天天综合中文字幕| 亚洲精品天堂网| 亚洲人人夜夜澡人人爽| 日本少妇一级片| 日韩一区免费视频| 99久久国产热无码精品免费| 久久久久亚洲视频| 毛片基地在线观看| 国产在线综合网| www.桃色.com| 亚洲精品www.| 亚洲色精品三区二区一区| 九色自拍视频在线观看| 日本一二三区视频在线| 在线播放 亚洲| 日韩欧美综合视频| 久草手机视频在线观看| 中国特黄一级片| 国产人妻大战黑人20p| 久久久久国产精品无码免费看| 午夜影院免费视频| 亚洲色大成网站www| 天堂av在线免费| 亚洲人在线观看视频| 熟妇高潮一区二区高潮| 日日躁夜夜躁白天躁晚上躁91| av中文字幕第一页| av免费观看在线| 精品人妻一区二区三区浪潮在线 | 熟女俱乐部一区二区| 国产偷人妻精品一区| 少妇户外露出[11p]| 性色av蜜臀av色欲av| 国产麻豆xxxvideo实拍| 手机av免费看| 国产传媒国产传媒| 91狠狠综合久久久久久| 日韩欧美黄色网址| 极品久久久久久久| 欧美肥妇bbwbbw| 91制片厂免费观看| www.激情网| 日本精品一区在线观看| 色一情一乱一伦一区二区三区日本| 黄色高清无遮挡| 九九热精品国产| 国产成人无码精品| 国产精品传媒在线观看| 99在线观看免费| 天天干视频在线| 一区二区免费在线观看视频| 国产精品三级在线观看无码| 99久久99久久精品免费看小说.| 少妇高潮一区二区三区喷水| 蜜臀在线免费观看| 欧美久久久久久久久久久久久| 久久精品免费一区二区| wwwwwxxxx日本| 国产精品99精品无码视| 中文字幕一区二区三区免费看 | 杨钰莹一级淫片aaaaaa播放| 91大学生片黄在线观看| jizzjizzxxxx| 色姑娘综合天天| 中文字幕免费观看| www.久久色| 国产网站无遮挡| 日本青青草视频| 久草资源站在线观看| 男女视频在线观看网站| 日本视频免费观看| 老司机午夜福利视频| 粉嫩av懂色av蜜臀av分享| 性生交大片免费全黄| 色综合久久久久无码专区| 亚洲精品乱码久久久久久动漫| 国产伦精品一区二区三区视频网站| 国产精品一区二区免费视频| 日本wwww色| 欧美性生交大片| 欧美性大战久久久久xxx| 青娱乐在线视频免费观看| 影音先锋国产在线| 精品1卡二卡三卡四卡老狼| 三上悠亚作品在线观看| 黄色一级一级片| 五月天综合在线| 黄色av免费观看| 又色又爽的视频| 欧美色图色综合| 国产精品午夜影院| 免费观看国产精品| 久久一级免费视频| 无码人妻h动漫| 中文字幕精品无码一区二区| 蜜桃视频污在线观看| jizz日本在线播放| 久久婷婷国产精品| 黄色av一级片| av电影中文字幕| 色一情一乱一乱一区91| 久久网免费视频| 欧美77777| 婷婷在线精品视频| 日韩av片专区| 亚洲av无码乱码国产精品久久| 手机看片日韩av| 91香蕉视频污版| 国产精品人妻一区二区三区| 国产精品815.cc红桃| 日韩免费毛片视频| 国产精品无码一区| 国产精品无码永久免费不卡| 激情伊人五月天| 亚洲精品一区二三区| aaaaa一级片| 成年人网站大全| 91麻豆成人精品国产| 国产美女永久免费无遮挡| 在线免费视频a| 精品国产99久久久久久宅男i| 999精品视频在线观看播放| 青娱乐在线视频免费观看| 天天摸天天碰天天爽天天弄| 日韩不卡视频一区二区| 91九色丨porny丨肉丝|