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

前端如何正確使用中間件?

開發 開發工具
中間件可以算是一種前端中常用的”設計模式“了,有的時候甚至可以說,整個應用的架構都是使用中間件為基礎搭建的。那么中間件有哪些利弊?什么才是中間件正確的使用姿勢?本文將分享作者在實際使用中的一些想法,歡迎同學們共同討論。

中間件可以算是一種前端中常用的”設計模式“了,有的時候甚至可以說,整個應用的架構都是使用中間件為基礎搭建的。那么中間件有哪些利弊?什么才是中間件正確的使用姿勢?本文將分享作者在實際使用中的一些想法,歡迎同學們共同討論。

一 先簡單講講中間件

const compose = (middlewares) => { 
const reduce = (pre, cur) => {
if (pre) {
return (ctx) => cur(ctx, pre)
} else {
return (ctx) => cur(ctx, () => ctx)
}
}
return [...middlewares].reverse().reduce(reduce, null);
}

這是一段非常簡潔的中間件代碼,通過傳入的類似這樣的函數的列表:

const middlware = async (ctx, next) => { 
/**
* do something to modify ctx
*/
if (/* let next run */true) {
await next(ctx)
}
/**
* do something to modify ctx
*/
}

得到一個新的函數,這個函數的執行,會讓這些中間件逐個處理并且每個中間件可以決定:

  • 在下個中間件執行之前做些什么?
  • 是否讓下個中間件執行?
  • 在下個中間件執行之后做些什么?

現在的中間件都是使用的洋蔥模型,洋蔥模型的大致示意圖是這樣的:

??

??

 

按照這張圖,中間件的執行順序是:

middleware1 -> middleware2 -> middleware3 -> middleware2 -> middleware1

處理順序是先從外到內,再從內到外,這就是中間件的洋蔥模型。

在中間件的應用上,開發者可以將統一邏輯做成一個中間件,這樣就能在其他地方復用這個邏輯。我覺得這其實是中間件這種模式的初心吧,好,那我們先把這個初心放一放。

但實際上這個模式就是一個空殼,通過不同的中間件,就可以實現各種自定義的邏輯。比如:

const handler = compose([(ctx, next) => { 
if (ctx.question === 'hello') {
ctx.answer = 'hello';
return
}
if (next) [
next(ctx)
]
}, (ctx, next) => {
if (/age/.test(ctx.question)) {
ctx.answer = 'i am 5 yours old';
return
}
if (next) [
next(ctx)
]
}])
const ctx = { question: 'hello' };
handler(ctx)
console.log(ctx.answer) // log hello
ctx.question = 'how about your age?'
handler(ctx)
console.log(ctx.answer) // log i am 5 yours old

這樣看起來我們甚至可以去實現一個機器人,把中間件這么拿來用,相當于是把中間件作為一個 if語句展開了,通過不同的中間件對ctx的劫持來分離邏輯,看起來好像也不錯?

得益于中間件的靈活性,每個中間件可以實現:1)實現獨立的某個邏輯;2)控制后續的流程是否執行。

二 聊聊幾個栗子

今年有參與做個小程序的Bridge,先簡單的介紹一下Bridge的功能。

  • 從支付寶小程序的視角來抹平其他小程序的JSAPI。
  • Bridge擁有擴展能力,能夠擴展JSAPI。

看到“擴展能力”,熟練的同學應該就知道我可以切入正題了。

Bridge現在的設計采用插件的形式來注入一系列API,每個插件都有插件名、API名、中間件三個屬性,注入Bridge后,Bridge會將相同API名的插件整合在一起,讓這個API的實現指向這些插件帶有的中間件的 compose ,用這種方式來實現自定義API。

??

??

 

這種方式其實看起來是非常美妙的,因為所有的API都可以通過插件的形式注入到Bridge中,可以很靈活地擴展API。

眾所周知,有得必有失。這種模式其實有自己的缺點,具體的缺點我們可以從“面向開發者”和“面向使用者”兩方面來整理,面向開發者指的是面向寫插件(也就是寫中間件)的開發者,面向使用者(用戶)指的是最終使用Bridge的開發者。

1 面向開發者

API的不確定性

多個中間件注冊在同一個API上面,開發者自己的API是否能夠運行正常有的時候是依賴上下文的,而零散的中間件被載入Bridge,對于上下文的修改是未知的,因此會對API的執行帶來很多不確定性。

從洋蔥模型的圖上面,我們可以發現,內層往往會受外部的影響,當然在回流的時候,外部中間件也會受內部中間件的影響,在開發中間件的時候,我們需要考慮自己的依賴,在已知依賴沒有問題的情況下去做開發,才會比較穩妥,但是當前Bridge這種散裝載入Plugin的方式,讓依賴關系沒有辦法穩定的描述。

API的維護成本高

由于有多個插件注冊到單個API上,維護某個API的情況下就會有比較高的成本,就有點像是現在服務端排查問題的情況了,多個插件的情況下最差情況可能要逐個開發者去做排查,最終才能分鍋,雖然實際情況可能沒有這么糟糕,但還是要考慮一下最差的情況。

那么為什么服務端這種架構是合理的呢,因為服務端的微服務架構確實能夠將多個業務邏輯拆分來解耦比較復雜的邏輯,但是Bridge這里只是想要實現某個API的實現,也很明顯的發現實際在使用過程中,基本都采用了單插件的注冊方式。所以感覺用中間件來實現某個API,有點過渡設計了,反而造成了維護成本的提高。

2 面向使用者

面向使用者其實要分為兩種不同的場景:直接使用插件和通過preset來使用插件的集成。

3 直接使用插件

??

??

 

這種模式下,使用者要自己去引用插件,通過引用一系列插件來獲得一個可以正常使用的API,可是使用者往往期望的是能夠開箱即用,也就是說拿到這個Bridge,看一下文檔,就能夠調用某個API了,如今需要Bridge的使用者通過自己注冊一個Plugin這樣的東西來獲得一個可用的API,顯然是不合理的,不合理的地方主要體現在:

API難理解

Bridge使用者原本只需要理解一下Bridge的文檔就能夠輕松使用API,現在需要理解plugin的運作機制以及如果有若干個插件的話,還要理解插件單獨的運作和相互運作的實現。這些都很難讓一個Bridge使用者接受,對于業務開發來講,成本變高了。

問題排查難度上升

這點和之前提到的使用中間件這種方式會造成API的邏輯不連貫的情況是類似的,Bridge在使用API的時候如果發現有問題,那么排查問題的時候就會因為有多個Plugin實現而增加難度,總的來說他還是需要簡單的去理解每個插件基本實現和插件間的運作機制,對于業務開發來講,成本較高。

4 通過Preset來使用插件的集成

由于上述Bridge使用者直接使用Bridge的問題,其實通過preset的封裝可以解決一部分的痛點,而Bridge的preset的概念就是,通過編寫一個preset,這個preset去維護一個API和多個插件的關系,然后給到用戶的是一個集成好的Bridge,上述的兩個問題都可以被解決。

??

??

 

這個模式看起來形式上就是之前的Bridge用戶選了一個“最懂插件的人”來做他們的替身,做了之前的那個User的角色,讓這個人來理解所有的Plugin,并維護這些API,這個"最懂"趨向極限,基本就等于開發Plugin的人了,那么饒了這么大一圈,做的這么靈活,最后維護插件的人是同一個人,也是這個人對外輸出API,那么這個東西真的有復雜到要這么拆分么。就我個人來講覺得還是直接簡單明了的的實現一個API來的方便。那是中間件這種模式辣雞嗎?

5 抬走,我們來看下一個

除了Bridge,老生常談的還有類似Fetch這樣的基礎庫,Fetch是另一波同學做的了,但是我也是小撇了幾眼代碼,發現居然也用了中間件來做,正好可以看看他們在設計API的時候使用中間件的合理性。先說說Fetch為啥走了這條路吧,看看訴求:

因為實在是有太多種不同的請求類型了,因此想實現在相同的入參下,通過adaptor參數來區分最終走怎樣的請求邏輯。

因此Fetch在設計的時候,是這么使用中間件的:

fetch.use(commonMiddleware) 
fetch.use('adaptor-xxx', [middleware]) // 比如adaptor-json
fetch({ ...requestConfig, adaotpr: 'adaptor-xxx' })

??

??

 

Fetch的中間件使用會相對合理一點,通過利用中間件的特性,對外輸出了相同的出入參,再借助不同的中間件對請求的過程做流式處理。

但實際的使用過程中,也要很多同學反饋,有類似Bridge的使用問題。

6 調用過程排查困難

和Bridge類似,業務在使用過程中如果遇到問題,排查難度會比較高,首先業務開發同學的理解能力就很難了,因為要同時理解這套中間件+每個中間件的實現原理,而adaptor開發同學也比較難排查問題,首先他需要知道業務開發同學本地是如何使用這些適配器的,在知道了之后再零散的逐個插件去排查,相比于直接看某個類型的請求的實現,難度會較高。

三 引出觀點

那么回頭看看這兩個Bridge和Fetch究竟有必要使用中間件么,有沒有更好的選擇。

先考慮假如我們不使用中間件來做,是不是現在的困境都會不存在了,就比如:

fetch.rpc = () => {} 
fetch.mtop = () => {}
fetch.json = () => {}

這樣實現不同類型的請求,每個請求的實現就會比較直觀的收斂在具體的函數中,隨之帶來的應該有如下的問題:

不同請求實現之間的共享邏輯會不那么直觀,說白了就是將中間件前置后置那堆東西拿放到各自的實現中,哪怕是抽了公共函數然后再放到各自函數的實現中,這些共享邏輯都不直觀,而中間件那種共享邏輯的處理,可以減少一定的維護成本。

那么會杠的同學就要開始問了:剛才你說多個中間件會加大維護的成本,現在又說共享的邏輯做成中間件能夠減少維護成本,你這前后矛盾啊!

這波流程Q的不錯。

那終于,要在這里拋一個觀點:

中間件的這種模式,應該作為某個函數的裝飾者模式來使用。

那么既然提到裝飾者模式,我們可以引用一本《維基百科》中的描述:

the decorator pattern is a design pattern) that allows behavior to be added to an individual object), dynamically, without affecting the behavior of other objects from the same class).

裝飾者模式是一個可以在不影響其他相同類的對象的情況下,動態修改某個對象行為的設計模式。

其實這段描述的體感不是很強,因為其實中間件本身已經不是一個對象了,而維基百科中的設計模式針對面向對象的語言做了描述。

為了更有體感一點,附上一張《Head First設計模式》中的一圖:

??

??

 

可以發現幾點:

  • 裝飾器和我們需要擴展的Class都是實現了同一個接口。
  • 裝飾器是通過接收一個Component對象來運作的。

看到上面這兩點就會發現其實裝飾器模式和中間件的概念是大致相同的,只不過在Javascript中,通過一個compose的函數將幾個毫不相干的函數串了起來,但最終的模式是和這個裝飾者模式基本一致的。

另外《Head First設計模式》中還有一張圖:

??

??

 

這是他舉的咖啡計算價格的例子,看到這張圖不是特別眼熟么,這和我們最開始說的洋蔥模型非常相近,這也再一次證明了其實我們用的“中間件設計模式”其實就是“裝飾者模式”。

那么聊了一下裝飾者模式,其實是為了說明我之前闡述的“中間件的這種模式,應該作為某個函數的裝飾者模式來使用”的觀點,因為裝飾器本身是為了解決繼承帶來的類的數量爆炸的問題的,而使用場景正如同它的名字一般,是有裝飾者和被裝飾者的區分的,盡管裝飾者最終也能成為一個被裝飾者,就如同例子中,計算咖啡的價格,裝飾者可以根據加奶或者加奶泡等等來計算收費,但是其實著這個場景下,去做對加奶的裝飾,就沒什么意義了,也很難懂。反推我覺得中間件這種模式,亦是如此。

四 回應

通過如上的分析,我們得知,我們在運用中間件的時候,起碼要有一個主要的函數,而其他的中間件,都是用于裝飾使用。

就比如我們在使用Koa做Node開發的時候,常常把業務邏輯放到某個中間件中,其他的都是一些攔截或者預處理的中間件,在egg中主要的業務邏輯被做成了一個controller,當然他最后肯定還是一個中間件,這是一種API的美化,非常科學。

再比如我們在使用redux的時候,中間件往往都是做一些簡單的預處理或者action監聽等等,當然也有另類的做法,比如redux-saga整個將邏輯接管掉的,這塊另說,我們這次先只聊常規用法。

那回過頭來,想比如Bridge這類如何做修改呢?

我覺得Bridge底層使用中間件來做API的處理流完全沒有問題,但造成現在這樣的問題主要是他的API,就如同egg做了koa的API的美化一般,Bridge也應該在API的設計上美化一下,限制二次開發者的腦洞,API不是越自由就越好,有句話說的好“你在召喚多強大的自由,就是在召喚多強大的奴役”。

那么我們應該如何限制API呢?

依照之前闡述過的說法“中間件的這種模式,應該作為某個函數的裝飾者模式來使用”,因此,首先要有一個顯式申明的主函數,這塊我們的API應該如下設計:

bridge.API('APINAME', handler) 
// 或者更加直接的
bridge.APINAME = handler

這樣一來,開發者在查找API實現的時候,就能夠比較明確的找到這塊的實現,而最底層Bridge還是會吧這個handler丟到一個中間件中去做處理,這樣就能做到對這個handler的裝飾。

在這個的基礎上,再設計一個能夠支持中間件的API:

bridge.use(middleware) // 對所有的API生效 
bridge.use('APINAME', middleware) // 對某個API生效

再回顧一下之前列出來的問題:

API的不確定性

API的實現都會放到handler中,且僅有這個handler會做主要邏輯處理,開發者明確的知道這里寫的就是主邏輯。

API的維護成本高

API的主要實現就在handler中,只需要維護handler就行,有特殊的問題,再去看使用的中間件。

API難理解

用戶明確的知道只需要理解handler的實現就行,中間件的邏輯大部分是用于公共使用,只要統一理解就行。

到這里,會杠的同學還是會問,其實你這好像問題也沒有完全解決,只要開發者想搞你,還是會出現之前的問題,比如就會有騷的人把邏輯寫到中間件里面,不寫到handler里面,你這種設計不還是一樣。

這說的一點都沒錯,因為設計這個API難免的就是要開放給開發者這樣的能力,也就是:1)自定義API;2)對若干API做一些個性化的統一邏輯。API的設計者能夠做到的就是在API上傳達給開發者一種規范,就比如 bridge.plugin() 這種開放性的API,就沒有 bridge.API() 這種好,因為后者很明確的讓開發者申明一個API,而前者不明確,前者讓開發者覺得中間件就是API的實現。

五 結語

本篇我們從中間件聊到中間件的使用實例,再聊到了裝飾器模式,最后聊到了使用中間件的API的設計。在日常API設計中,我不僅會面對底層設計的選型,還會面對對外開放API的設計,兩者都同樣重要。不過本篇僅代表個人觀點,歡迎在評論區指教、討論。

【本文為51CTO專欄作者“阿里巴巴官方技術”原創稿件,轉載請聯系原作者】

 

??戳這里,看該作者更多好文??

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2024-02-06 14:05:00

Go中間件框架

2024-12-09 00:00:15

Gin框架中間件

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發CRUD

2021-06-15 10:01:02

應用系統軟件

2018-07-29 12:27:30

云中間件云計算API

2018-02-01 10:19:22

中間件服務器系統

2016-11-11 21:00:46

中間件

2022-11-18 07:54:02

Go中間件項目

2009-06-16 15:55:06

JBoss企業中間件

2012-11-30 10:21:46

移動中間件

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ

2019-08-12 08:00:00

ASP.NetASP.Net Cor編程語言

2021-01-26 14:57:00

中間件應用模塊化

2023-12-06 07:14:28

前端API中間件

2013-08-08 10:34:16

云計算中間件

2012-11-01 15:16:22

金蝶中間件研究院院長

2011-10-24 07:41:38

SOA中間件應用服務器

2013-03-14 22:54:15

PaaS中間件平臺即服務
點贊
收藏

51CTO技術棧公眾號

麻豆国产欧美日韩综合精品二区| 精品嫩草影院| 亚洲人成亚洲人成在线观看图片| 91丝袜脚交足在线播放| 日韩福利片在线观看| 免费av一区| 欧美放荡的少妇| 91好吊色国产欧美日韩在线| 77777影视视频在线观看| 国产高清成人在线| 日本免费久久高清视频| 男人操女人的视频网站| 亚洲人成网www| 日韩欧美中文字幕一区| 青青草av网站| 毛片在线导航| 国产日韩三级在线| 国产一区二区三区四区hd| 中文字幕人妻精品一区| 中文在线一区| 九色成人免费视频| 中国1级黄色片| 亚洲va久久久噜噜噜久久| 制服视频三区第一页精品| 免费看又黄又无码的网站| 久久综合网导航| 久久久精品人体av艺术| 国产乱码精品一区二区三区日韩精品 | 欧美三区四区| 午夜精品久久久久久久| 久久国产精品免费观看| 成a人片在线观看www视频| 99热这里都是精品| 国产高清在线一区二区| 亚洲性在线观看| 视频在线观看一区二区三区| 97精品国产97久久久久久免费| 欧美激情图片小说| 9999国产精品| 中文字幕亚洲一区二区三区| 国产中年熟女高潮大集合| 丝袜连裤袜欧美激情日韩| 精品免费视频.| 中文字幕亚洲日本| 欧美不卡在线观看| 欧美一区二区三区思思人| 无需播放器的av| 精品网站在线| 欧美午夜片在线看| 91国产精品视频在线观看| 九九热线视频只有这里最精品| 午夜婷婷国产麻豆精品| 国产妇女馒头高清泬20p多| 肉体视频在线| 亚洲va在线va天堂| 少妇高潮喷水在线观看| 国产乱码精品一区二三赶尸艳谈| 亚洲高清视频的网址| 欧美午夜性视频| a在线视频v视频| 性欧美疯狂xxxxbbbb| 怡红院av亚洲一区二区三区h| 2021天堂中文幕一二区在线观| 午夜欧美视频在线观看| 男人日女人下面视频| 一二三四视频在线中文| 欧美日韩亚洲精品内裤| 50路60路老熟妇啪啪| 丝袜美腿一区| 欧美精品v国产精品v日韩精品| 日韩在线第三页| 99电影网电视剧在线观看| 国产精品嫩草影院com| 午夜日韩成人影院| 免费看日本一区二区| 亚洲欧美国产制服动漫| 91在线无精精品白丝| 天天色天天射综合网| 久久影院免费观看| 国产在线视频卡一卡二| 国产精品三上| 成人午夜黄色影院| 五月天激情开心网| 国产网站一区二区三区| 综合一区中文字幕| heyzo一区| 在线这里只有精品| 少妇丰满尤物大尺度写真| 秋霞蜜臀av久久电影网免费| 亚洲一区二区久久久| 欧美xxxx黑人xyx性爽| 国产精品综合| 91午夜理伦私人影院| 三级在线观看网站| 国产精品欧美一区二区三区| 国产91在线亚洲| 欧美激情喷水| 日韩一区国产二区欧美三区| 欧美bbbbb性bbbbb视频| 天天射—综合中文网| 2019日本中文字幕| 国产三级第一页| 久久美女高清视频| 免费极品av一视觉盛宴| 日本精品在线中文字幕| 精品国产乱码91久久久久久网站| 久久精品—区二区三区舞蹈 | 日韩午夜视频在线观看| 性欧美高清come| 欧美羞羞免费网站| 亚洲精品乱码久久| 一本精品一区二区三区| 国产成人在线精品| 色综合久久久久久| 樱桃视频在线观看一区| 免费观看成人网| 精品人人人人| 久久99热精品| 91精品国产乱码久久久| 久久久久久夜精品精品免费| 激情成人开心网| 欧美美女被草| 国产一区二区三区视频在线观看| 久久精品美女视频| 国产一区二区三区四区五区美女| 日韩电影大全在线观看| 女人让男人操自己视频在线观看 | 深夜福利视频在线免费观看| 亚洲激情五月婷婷| 午夜一区二区视频| 成人女性视频| 国产成人精品一区二区在线| 亚洲av成人精品日韩在线播放| 一区二区三区.www| 久久综合在线观看| 久久久久久久久久久久久久久久久久| 国产成人一区二| 每日更新av在线播放| 日韩欧美在线字幕| 亚洲精品理论片| 性高湖久久久久久久久| 精品日产一区2区三区黄免费 | 色综合咪咪久久| 成年人在线观看av| 麻豆91精品| 秋霞毛片久久久久久久久| 国产精欧美一区二区三区蓝颜男同| 亚洲精品在线观看视频| 国产无码精品在线观看| 成人avav影音| 国产免费观看高清视频| 免费看久久久| 欧美在线观看网址综合| 少妇性bbb搡bbb爽爽爽欧美| 色妞www精品视频| 自拍偷拍视频亚洲| 免费看黄色91| 2025韩国大尺度电影| 韩国三级大全久久网站| 欧美精品一二区| 亚洲精品国产精| 亚洲va韩国va欧美va精品| 超碰caoprom| 久久久噜噜噜久久狠狠50岁| 日韩中文一区二区三区| 色诱色偷偷久久综合| 欧美美最猛性xxxxxx| 日本黄色免费视频| 欧美性69xxxx肥| 欧洲性xxxx| 国产精品一级二级三级| 日本精品久久久久久久久久| 亚洲精品国产setv| 国产精品高潮呻吟久久av无限| 日韩黄色影院| 日韩精品一区二区三区视频| 男女啊啊啊视频| 国产欧美日韩另类视频免费观看| 毛片毛片毛片毛| 亚洲日本黄色| 亚洲国产欧美不卡在线观看 | 精品无人乱码一区二区三区的优势| 波多视频一区| 久久视频免费观看| 天天操天天操天天干| 在线精品观看国产| 久草视频在线免费看| 91在线精品一区二区三区| 99sesese| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品88久久久久久| 国产欧美日韩伦理| 成人涩涩视频| 91精品国产免费久久久久久| 无遮挡动作视频在线观看免费入口 | 中文字幕字幕中文在线中不卡视频| 在线观看免费视频国产| 看国产成人h片视频| 国产精品成人久久电影| 国产国产精品| 欧美日韩国产免费一区二区三区| 国产精品日本一区二区三区在线 | 久久综合色天天久久综合图片| 中文字幕 91| 一区二区三区成人精品| 青春草在线视频免费观看| 天堂99x99es久久精品免费| 成人av色在线观看| 成人性教育av免费网址| 欧美黄色片免费观看| 欧美日韩视频在线播放| 亚洲精品国产品国语在线| 国产人妖在线播放| 欧美性极品少妇| 亚洲黄色激情视频| 亚洲一区二区三区四区不卡| 精品视频第一页| 国产午夜亚洲精品不卡| 免费的av网站| 高清不卡一二三区| 国产传媒免费观看| 免费av成人在线| 日韩手机在线观看视频| 最新日韩av| 91动漫在线看| 韩国在线视频一区| 日韩视频一二三| 久久高清精品| 亚洲欧美久久久久一区二区三区| 精品一区欧美| 久久精品五月婷婷| 另类春色校园亚洲| 国产一区二区三区高清| 动漫av一区二区三区| 毛片av一区二区三区| 免费在线激情视频| 国产视频欧美| 毛片在线视频播放| 亚洲日韩视频| 青青青免费在线| 亚洲国产精品一区| 久久综合九色综合88i| 1024精品一区二区三区| 免费看毛片的网址| 在线国产欧美| 亚洲国产精品无码观看久久| 黄色成人在线网址| 欧美中日韩在线| 亚洲网站视频| 欧美亚洲精品一区二区| 国产一区二区精品| 日韩免费毛片视频| 日日夜夜精品视频免费| 久久久久久香蕉| 人妖欧美一区二区| 色噜噜狠狠一区二区| 国产综合色精品一区二区三区| 国内精品久久久久伊人av| 三级视频在线| 国产亚洲精品91在线| √新版天堂资源在线资源| 久久网福利资源网站| 在线观看a级片| 欧美黄色三级网站| 蜜臀久久精品| 国产精品久久一区| 国产精品一区二区精品视频观看| 69堂成人精品视频免费| 国产精品传媒| 日韩免费电影一区二区| 久久久国产精品| 中文字幕日韩精品无码内射| 亚洲美女啪啪| 91激情视频在线| 国内一区二区视频| 男女性杂交内射妇女bbwxz| 久久亚洲一级片| 999久久久国产| 亚洲va欧美va国产va天堂影院| 香蕉影院在线观看| 7777精品伊人久久久大香线蕉经典版下载| 国产福利视频导航| 亚洲美女av在线| 久做在线视频免费观看| 26uuu亚洲国产精品| 久久久久伊人| 国产综合动作在线观看| 欧美丝袜一区| www..com日韩| 免费一级欧美片在线观看| 日本黄色大片在线观看| 久久久久久99久久久精品网站| 国精产品久拍自产在线网站| 亚洲成a人v欧美综合天堂| 亚洲字幕av一区二区三区四区| 亚洲精品一区二区精华| h视频网站在线观看| 久久免费精品视频| 久久天天久久| 麻豆av一区二区三区久久| 亚洲成人精品| 激情视频综合网| 成人听书哪个软件好| 女人裸体性做爰全过| 精品日韩中文字幕| 国产成人精品a视频| 一本色道久久88亚洲综合88| 国产精品一品| 亚洲a一级视频| 狠狠做六月爱婷婷综合aⅴ| 韩日视频在线观看| 激情深爱一区二区| 手机看片日韩av| 欧美日韩国产精品| 性猛交xxxx乱大交孕妇印度| 色偷偷91综合久久噜噜| 香蕉成人av| 美女一区视频| 亚洲精品免费观看| 国产吃瓜黑料一区二区| 综合色天天鬼久久鬼色| 精品国产青草久久久久96| 日韩av在线免费看| 搞黄网站在线看| 97超碰在线播放| 综合久久十次| 亚洲高清av一区二区三区| 中文字幕av一区二区三区高| 国产午夜麻豆影院在线观看| 亚洲国产欧美自拍| 91九色国产在线播放| 99免费在线观看视频| 一区二区三区中文| 17c国产在线| 亚洲欧洲av在线| 91色在线播放| 久久精品人人做人人爽| 欧美日韩视频免费看| 色播五月综合| 免费精品99久久国产综合精品| 成人在线一级片| 91搞黄在线观看| 成人在线观看免费| 国产精品视频内| 日韩系列欧美系列| 成人不卡免费视频| 中文字幕日本不卡| 国产女同91疯狂高潮互磨| 久久天天躁狠狠躁夜夜躁| 二区三区精品| 日本大胆人体视频| 成人一级片在线观看| 国产精品99精品无码视| 亚洲国产精品va在看黑人| 美女高潮在线观看| 日本一区二区三区精品视频| 日韩精品三区四区| 亚洲女人毛茸茸高潮| 欧美一区二区在线免费播放| 图片区小说区亚洲| 国产精品污www一区二区三区| 日韩午夜av在线| 波多野结衣一本| 欧美日韩免费高清一区色橹橹| 麻豆影视在线观看_| 成人高清在线观看| 99精品视频免费| 先锋影音av在线| 91精品国产综合久久久蜜臀粉嫩| 青草青在线视频| 欧美日韩一区在线视频| 久久精品国产第一区二区三区| 国产波霸爆乳一区二区| 亚洲国产精品视频在线观看 | 国产精品久久久久久久美男| 99久久影视| av在线播放网址| 欧美羞羞免费网站| 欧美1—12sexvideos| 欧美日韩免费精品| 国产一区二区毛片| 毛片在线免费视频| 中文字幕精品—区二区| 91免费精品国偷自产在线在线| av网站在线观看不卡| 亚洲欧洲精品一区二区三区| 狠狠人妻久久久久久综合麻豆| 国产精品av网站| 欧美国产精品| www.狠狠爱| 精品日韩欧美在线| 国内精品伊人| 精品这里只有精品| 亚洲精品久久7777| 精品电影在线| 国产精品日韩一区二区免费视频| 日本女人一区二区三区| 国产午夜小视频| 日韩性xxxx爱| 中文字幕av一区二区三区人|