3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者簡(jiǎn)介

古映杰,攜程研發(fā)高級(jí)經(jīng)理,負(fù)責(zé)前端框架和基礎(chǔ)設(shè)施的設(shè)計(jì)、研發(fā)與維護(hù)。開源項(xiàng)目react-lite和react-imvc作者。

前言

隨著多終端、多平臺(tái)、多業(yè)務(wù)形態(tài)、多技術(shù)選型等各方面的發(fā)展,前后端的數(shù)據(jù)交互,日益復(fù)雜。

同一份數(shù)據(jù),可能以多種不同的形態(tài)和結(jié)構(gòu),在多種場(chǎng)景下被消費(fèi)。

在理想情況下,這些復(fù)雜性可以全部由后端承擔(dān)。前端只管從后端接口里,拿到已然整合完善的數(shù)據(jù)。

然而,不管是因?yàn)楹蠖说念I(lǐng)域模型,還是因?yàn)槲⒎?wù)架構(gòu)。作為前端,我們感受到的是,后端提供的接口,越發(fā)不夠前端友好。我們必須自行組合多個(gè)后端接口,才能獲取到完整的數(shù)據(jù)結(jié)構(gòu)。

面向領(lǐng)域模型的后端需求,跟面向頁(yè)面呈現(xiàn)的前端需求,出現(xiàn)了不可調(diào)和的矛盾。

我們?cè)?jīng)試圖用 RESTful 風(fēng)格的無(wú)線 API 聚合層來(lái)解決問(wèn)題。這一層完全由后端工程師開發(fā)和迭代(前端作為下游等待聚合接口的契約),他們既要理解背后對(duì)接的微服務(wù)體系,又要理解每個(gè)前端頁(yè)面的展現(xiàn)需求。

隨著頁(yè)面數(shù)量的增加,接口調(diào)用方越來(lái)越多,后端 API 聚合層的邏輯越來(lái)越重。聚合層自身成為新的瓶頸所在。實(shí)際情況是,作為中間層的后端,既難以充分對(duì)接背后的微服務(wù)體系,也難以充分理解前端的頁(yè)面展現(xiàn)需求。

他們的整體定位很尷尬,代碼里既有 UI 展示相關(guān)的話術(shù)等信息,又有大量接口相關(guān)的業(yè)務(wù)邏輯處理。每次發(fā)布迭代,都要跟上下游做大量的溝通和聯(lián)調(diào)。

我們最終意識(shí)到,讓最了解頁(yè)面數(shù)據(jù)邏輯的前端接管中間層,讓后端回到他們擅長(zhǎng)的領(lǐng)域模型,可能是更好的做法。可以減少大家溝通成本,提高前后端的專業(yè)化程度,降低聯(lián)調(diào)壓力,加快彼此的開發(fā)效率。

在這種背景下,我們最后選擇使用 Node.js 搭建專門服務(wù)于前端頁(yè)面呈現(xiàn)的后端,亦即 Backend-For-Frontend,簡(jiǎn)稱 BFF。

我們面臨了很多不同的技術(shù)選型,主要圍繞在權(quán)衡 RESTful API 和 GraphQL。

正如標(biāo)題所示,我們最終選用的是 GraphQL as BFF。

本文將介紹我們對(duì) GraphQL 所作的考察、探索、權(quán)衡、技術(shù)選型與設(shè)計(jì)等多方面的內(nèi)容,希望能給大家?guī)?lái)一些啟發(fā)。

一、GraphQL 模式出現(xiàn)的必然性

面向前端頁(yè)面的數(shù)據(jù)聚合層,其接口很容易在迭代過(guò)程中,變得愈加復(fù)雜;最終發(fā)展成一個(gè)超級(jí)接口。

它有很多調(diào)用方,各種不同的調(diào)用場(chǎng)景,甚至多個(gè)不同版本的接口并存,同時(shí)提供數(shù)據(jù)服務(wù)。

所有這些復(fù)雜性,都會(huì)反映到接口參數(shù)上。

接口調(diào)用的場(chǎng)景越多,它對(duì)接口參數(shù)結(jié)構(gòu)的表達(dá)能力,要求越高。如果只有一個(gè) boolean 類型的參數(shù),只能滿足 true | false 兩種場(chǎng)景罷了。

以產(chǎn)品詳情接口為例,一種很自然的請(qǐng)求參數(shù)結(jié)構(gòu)如下:

里面包含 ChannelCode 渠道信息,IsOp 身份信息,MarketingInfo 營(yíng)銷相關(guān)的信息,PlatformId 平臺(tái)信息,QueryNode 查詢的節(jié)點(diǎn)信息,以及 Version 版本信息。最核心的參數(shù) ProductId,被大量場(chǎng)景相關(guān)的參數(shù)所圍繞。

審視一下 QueryNode 參數(shù),很容易可以發(fā)現(xiàn),它正是 GraphQL 的雛形。只不過(guò)它用的是更復(fù)雜的 JSON 來(lái)描述查詢字段,而 GraphQL 用更簡(jiǎn)潔的查詢語(yǔ)句,完成同樣的目的。

并且,QueryNode 參數(shù),只支持一個(gè)層級(jí)的字段篩選;而 GraphQL 則支持多層級(jí)的篩選。

GraphQL 可以看作是 QueryNode 這種形式的參數(shù)設(shè)計(jì)的專業(yè)化。相比用 JSON 來(lái)描述查詢結(jié)果,GraphQL 設(shè)計(jì)了一個(gè)更完整的 DSL,把字段、結(jié)構(gòu)、參數(shù)等,都整合到一起。

仿照格林斯潘第十定律:

任何C或Fortran程序復(fù)雜到一定程度之后,都會(huì)包含一個(gè)臨時(shí)開發(fā)的、不合規(guī)范的、充滿程序錯(cuò)誤的、運(yùn)行速度很慢的、只有一半功能的Common Lisp實(shí)現(xiàn)。

https://zh.wikipedia.org/wiki/%E6%A0%BC%E6%9E%97%E6%96%AF%E6%BD%98%E7%AC%AC%E5%8D%81%E5%AE%9A%E5%BE%8B

或許可以說(shuō):

任何接口設(shè)計(jì)復(fù)雜到一定程度后,都會(huì)包含一個(gè)臨時(shí)開發(fā)的、不合規(guī)范的、只有一半功能的 GraphQL 實(shí)現(xiàn)。

從 SearchParams, FormData 到 JSON,再到 GraphQL 查詢語(yǔ)句,我們看到不斷有新的數(shù)據(jù)通訊方式出現(xiàn),滿足不同的場(chǎng)景和復(fù)雜度的要求。

站在這個(gè)層面上看,GraphQL 模式的出現(xiàn),有一定的必然性。

二、GraphQL 語(yǔ)言設(shè)計(jì)中的必然性

作為一個(gè)查詢相關(guān)的 DSL,GraphQL 的語(yǔ)言設(shè)計(jì),也不是隨意的。

我們可以做一個(gè)思想實(shí)驗(yàn)。

假設(shè)你是一名架構(gòu)師,你接到一項(xiàng)任務(wù),設(shè)計(jì)一門前端友好的查詢語(yǔ)言。要求:

1)查詢語(yǔ)法跟查詢結(jié)果相近

2)能精確查詢想要的字段

3)能合并多個(gè)請(qǐng)求到一個(gè)查詢語(yǔ)句

4)無(wú)接口版本管理問(wèn)題

5)代碼即文檔

我們知道查詢結(jié)果是 JSON 數(shù)據(jù)格式。而 JSON 是一個(gè) key-value pair 風(fēng)格的數(shù)據(jù)表示,因此可以從結(jié)果倒推出查詢語(yǔ)句。

上圖是一個(gè)查詢結(jié)果。很顯然,它的查詢語(yǔ)句不可能包含 value 部分。我們刪去 value 后,它變成下面這樣。

查詢語(yǔ)句跟查詢結(jié)果擁有相同的 key 及其層次結(jié)構(gòu)關(guān)系。這是我們想要的。

我們可以再進(jìn)一步,將冗余的雙引號(hào),逗號(hào)等部分刪掉。

我們得到了一個(gè)精簡(jiǎn)的寫法,它已經(jīng)是一段合法的 GraphQL 查詢語(yǔ)句了。

其中的設(shè)計(jì)思路和過(guò)程是如此簡(jiǎn)單直接,很難想象還有別的方案比目前這個(gè)更滿足要求。

當(dāng)然,只有字段和層級(jí),并不足夠。符合這種結(jié)構(gòu)的數(shù)據(jù)太多了,不可能把整個(gè)數(shù)據(jù)庫(kù)都查詢出來(lái)。我們還需要設(shè)計(jì)參數(shù)傳遞的方式,以便能縮小數(shù)據(jù)范圍。

上圖是一個(gè)自然而然的做法。用括號(hào)表示函數(shù)調(diào)用,里面可以添加參數(shù),可謂經(jīng)典的設(shè)計(jì)。

它跟 ES2015 里的 (Method Definitions Shorthand) 也高度相似。如下所示:

前面演示的 GraphQL 參數(shù)寫法,參數(shù)值用的是字面量 userId: 123。這不是一個(gè)特別安全的做法,開發(fā)者會(huì)在代碼里,用拼接字符串的方式將字面量值注入到查詢語(yǔ)句,也就給了惡意攻擊者注入代碼的機(jī)會(huì)。

我們需要設(shè)計(jì)一個(gè)參數(shù)變量語(yǔ)法,明確參數(shù)位置和數(shù)量。

我們可以選用 $xxx 這種常見(jiàn)的標(biāo)記方法,它被很多語(yǔ)言采用來(lái)表示變量。沿用這種風(fēng)格,可以大大減少開發(fā)者的學(xué)習(xí)成本。

前后端通訊的另一個(gè)痛點(diǎn)是,命名。前端經(jīng)常吐槽后端的字段名過(guò)于冗長(zhǎng),或者不知所云,或者拼寫錯(cuò)誤,或者不符合前端表述習(xí)慣。最常見(jiàn)的情況是,后端字段名以大寫字母開頭,而前端習(xí)慣 Class 或者 Component 是大寫字母開頭,實(shí)例和數(shù)據(jù),則以小寫字母開頭。

我們期望有機(jī)會(huì)進(jìn)行字段名調(diào)整。

別名映射(Alias)語(yǔ)法,正是為了這個(gè)目的而出現(xiàn)的。

上面這種別名映射的語(yǔ)法,在其它語(yǔ)言里也很常見(jiàn)。如果不這樣寫,頂多就是變成:

uid as Uid 或者 uid = Uid 這類做法,差別不大。我認(rèn)為選用冒號(hào)更佳,它跟 ES2015 的解構(gòu)語(yǔ)法很接近。

至此,我們擁有了 key 層級(jí)結(jié)構(gòu),參數(shù)傳遞,變量寫法,別名映射等語(yǔ)法,可以編寫足夠復(fù)雜的查詢語(yǔ)句了。不過(guò),還有幾個(gè)小欠缺。

比如對(duì)字段的條件表達(dá)。假設(shè)有兩次查詢,它們唯一的差別就是,一個(gè)有 A 字段,另一個(gè)沒(méi)有 A 字段,其它字段及其結(jié)構(gòu)都是相同的。為了這么小的差別 ,前端難道要編寫兩個(gè)查詢語(yǔ)句?

這顯然不現(xiàn)實(shí),我們需要設(shè)計(jì)一個(gè)語(yǔ)法描述和解決這個(gè)問(wèn)題。

它就是——指令(Directive)。

指令,可以對(duì)字段做一些額外描述,比如?

@include,是否包含該字段;

@skip,是否不包含該字段;

@deprecate,是否廢棄該字段;

除了上述默認(rèn)指令外,我們還可以支持自定義指令等功能。

指令的語(yǔ)法設(shè)計(jì),在其它語(yǔ)言里也可以找到借鑒目標(biāo)。Java,Phthon 以及 ESNext 都用了 @ 符號(hào)表示注解、裝飾器等特性。

有了指令,我們可以把兩個(gè)高度相似的查詢語(yǔ)句,合并到一起,然后通過(guò)條件參數(shù)來(lái)切換。這是一個(gè)不錯(cuò)的做法。不過(guò),指令是跟著單個(gè)字段走的,它不能解決多字段的問(wèn)題。

比如,字段 A 和字段 B,擁有相同的總體結(jié)構(gòu),僅僅只有 1 個(gè)字段名的差異。前端并不想編寫一樣的 key 值重復(fù)多次。

這意味著,我們需要設(shè)計(jì)一個(gè)片段語(yǔ)法(Fragment)。

如上所示,用 fragment 聲明一個(gè)片段,然后用三個(gè)點(diǎn)表示將片段在某個(gè)對(duì)象字段里展開。我們可以只編寫一次公共結(jié)構(gòu),然后輕易地在多個(gè)對(duì)象字段里復(fù)用。

這種設(shè)計(jì)也是一個(gè)經(jīng)典做法,跟 JavaScript 里的 Spread Properties 很相近。

至此,我們得到了一個(gè)相對(duì)完整的,對(duì)前端友好的查詢語(yǔ)言設(shè)計(jì)。它幾乎就是 GraphQL 當(dāng)前的形態(tài)。

如你所見(jiàn),GraphQL 的查詢語(yǔ)言設(shè)計(jì),借鑒了主流開發(fā)語(yǔ)言里的眾多成熟設(shè)計(jì)。使得任何擁有豐富的編程經(jīng)驗(yàn)的開發(fā)者,很容易上手 GraphQL。

按照同樣的要求,重新來(lái)一遍,大概率得到跟當(dāng)前形態(tài)高度接近的設(shè)計(jì)。這是我理解的 GraphQL 語(yǔ)言設(shè)計(jì)里包含的必然性。

三、GraphQL 的組成與鏈路

查詢語(yǔ)法,是 GraphQL 面向前端,或者說(shuō)面向數(shù)據(jù)消費(fèi)端的部分。

除此之外,GraphQL 還提供了面向后端,或者說(shuō)面向數(shù)據(jù)提供方的部分。它就是基于 GraphQL 的 Type System 構(gòu)建的 Schema。

一個(gè) GraphQL 服務(wù)和查詢的鏈路,大致如下:

首先,服務(wù)端編寫數(shù)據(jù)類型,構(gòu)建一個(gè)數(shù)據(jù)結(jié)構(gòu)之間的關(guān)聯(lián)網(wǎng)絡(luò)。其中 Query 對(duì)象是數(shù)據(jù)消費(fèi)的入口。所有查詢,都是對(duì) Query 對(duì)象下的字段的查詢。可以把 Query 下的字段,理解為一個(gè)個(gè) RESTful API。比如上圖中的,Query.post 和 Query.author,相當(dāng)于 /post 和 /author 接口。

GraphQL Schema 描述了數(shù)據(jù)的類型與結(jié)構(gòu),但它只是形狀(Shape),它不包含真正的數(shù)據(jù)。我們需要編寫 Resolver 函數(shù),在里面去獲取真正的數(shù)據(jù)。

Resolver 的簡(jiǎn)單形式如下

每個(gè) Query 對(duì)象下的字段,都有一個(gè)取值函數(shù),它能獲取到前端傳遞過(guò)來(lái)的 query 查詢語(yǔ)句里包含的參數(shù),然后以任意方式獲取數(shù)據(jù)。Resolver 函數(shù)可以是異步的。

有了 Resolver 和 Schema,我們既定義了數(shù)據(jù)的形狀,也定義了數(shù)據(jù)的獲取方式。可以構(gòu)建一個(gè)完整的 GraphQL 服務(wù)。

但它們只是類型定義和函數(shù)定義,如果沒(méi)有調(diào)用函數(shù),就不會(huì)產(chǎn)生真正的數(shù)據(jù)交互。

前端傳遞的 query 查詢語(yǔ)句,正是觸發(fā) Resolver 調(diào)用的源頭。

如上所示,我們發(fā)起了查詢,傳遞了參數(shù)。GraphQL 會(huì)解析我們的查詢語(yǔ)句,然后跟 Schema 進(jìn)行數(shù)據(jù)形狀的驗(yàn)證,確保我們查詢的結(jié)構(gòu)是存在的,參數(shù)是足夠的,類型是一致的。任何環(huán)節(jié)出現(xiàn)問(wèn)題,都將返回錯(cuò)誤信息。

數(shù)據(jù)形狀驗(yàn)證通過(guò)后,GraphQL 將會(huì)根據(jù) query 語(yǔ)句包含的字段結(jié)構(gòu),一一觸發(fā)對(duì)應(yīng)的 Resolver 函數(shù),獲取查詢結(jié)果。也就是說(shuō),如果前端沒(méi)有查詢某個(gè)字段,就不會(huì)觸發(fā)該字段對(duì)應(yīng)的 Resolver 函數(shù),也就不會(huì)產(chǎn)生對(duì)數(shù)據(jù)的獲取行為。

此外,如果 Resolver 返回的數(shù)據(jù),大于 Schema 里描繪的結(jié)構(gòu);那么多出來(lái)的部分將被忽略,不會(huì)傳遞給前端。這是一個(gè)合理的設(shè)計(jì)。我們可以通過(guò)控制 Schema,來(lái)控制前端的數(shù)據(jù)訪問(wèn)權(quán)限,防止意外的將用戶賬號(hào)和密碼泄露出去。?

正是如此,GraphQL 服務(wù)能實(shí)現(xiàn)按需獲取數(shù)據(jù),精確傳遞數(shù)據(jù)。

四、澄清關(guān)于 GraphQL 的幾個(gè)迷思

有相當(dāng)多的開發(fā)者,對(duì) GraphQL 有各種各樣的誤解。在這里挑選幾個(gè)重要的例子,加以澄清,幫助大家更全面的認(rèn)識(shí) GraphQL。

4.1 GraphQL 不一定要操作數(shù)據(jù)庫(kù)?

有一些開發(fā)者認(rèn)為 GraphQL 需要操作數(shù)據(jù)庫(kù),因此實(shí)現(xiàn)起來(lái),幾乎等于要推翻當(dāng)前后端的所有架構(gòu)。這是一個(gè)重大誤解。

GraphQL 不僅可以不操作數(shù)據(jù)庫(kù),它甚至可以不從其它地方獲取數(shù)據(jù),而直接寫死數(shù)據(jù)在 Resolver 函數(shù)里。查看 graphql.js 的官方文檔,我們輕易可以找到案例:

上圖定義了一個(gè) schema,只有一個(gè)類型為 String 的 hello 字段,它的 resolver 函數(shù)里,無(wú)視所有參數(shù),直接 return 一個(gè) hello world 字符串。

可以看到,GraphQL 只是關(guān)于 schema 和 resolver 的一一對(duì)應(yīng)和調(diào)用,它并未對(duì)數(shù)據(jù)的獲取方式和來(lái)源等做任何假設(shè)。

4.2?GraphQL 跟 RESTful API 不是對(duì)立的

在網(wǎng)絡(luò)上,有相當(dāng)多的 GraphQL 文章,將它跟 RESTful API 對(duì)立起來(lái),仿佛要么全盤 GraphQL,要么全盤 RESTful API。這也是一個(gè)重大誤解。

GraphQL 和 RESTful API 不僅不對(duì)立,還是互相協(xié)作的關(guān)系。

在前面關(guān)于 Resolver 函數(shù)的圖片中,我們看到,可以在 GraphQL Schema 的 Resolver 函數(shù)里,調(diào)用 RESTful API 去獲取數(shù)據(jù)。

當(dāng)然,也可以調(diào)用 RPC 或者 ORM 等方式,從別的數(shù)據(jù)接口或者數(shù)據(jù)庫(kù)里獲取數(shù)據(jù)。

因此,實(shí)現(xiàn)一個(gè) GraphQL 服務(wù),并不需要挑戰(zhàn)當(dāng)前整個(gè)后端體系。它具有高度靈活的適配能力,可以低侵入性的嵌入當(dāng)前系統(tǒng)中。

4.3?GraphQL 不一定是一個(gè)后端服務(wù)

盡管絕大多數(shù) GraphQL,都以 server 的形式存在。?但是,GraphQL 作為一門語(yǔ)言,它并沒(méi)有限制在后端場(chǎng)景。

上圖還是前面展示過(guò)的 graphql.js 的官方文檔,最下面一行,就是一個(gè)普通的函數(shù)調(diào)用,它發(fā)起了一次 graphql 查詢,其 response 結(jié)果如下:

這段代碼,不只能在 node.js 里運(yùn)行,在瀏覽器里也可以運(yùn)行(可訪問(wèn):https://codesandbox.io/s/hidden-water-zfq2t?查看運(yùn)行結(jié)果)

因此,我們完全可以將 GraphQL 用在純前端,去實(shí)現(xiàn) State Management 狀態(tài)管理。Relay 等框架,即包含了用在前端的 graphql。

4.4 GraphQL 不一定需要?Schema

這是一個(gè)有趣的事實(shí),GraphQL 語(yǔ)言設(shè)計(jì)里的兩個(gè)組成部分:

1)數(shù)據(jù)提供方編寫 GraphQL Schema;

2)數(shù)據(jù)消費(fèi)方編寫 GraphQL Query;

這種組合,是官方提供的最佳實(shí)踐。但它并不是一個(gè)實(shí)踐意義上的最低配置。

GraphQL Type System 是一個(gè)靜態(tài)的類型系統(tǒng)。我們可以稱之為靜態(tài)類型 GraphQL。此外,社區(qū)還有一種動(dòng)態(tài)類型的 GraphQL 實(shí)踐。

graphql-anywhere: Run a GraphQL query anywhere, without a GraphQL server or a schema.?

https://github.com/apollographql/apollo-client/tree/master/packages/graphql-anywhere

它跟靜態(tài)類型的 GraphQL 差別在于,沒(méi)有了基于 Schema 的數(shù)據(jù)形狀驗(yàn)證階段,而是直接無(wú)腦地根據(jù) query 查詢語(yǔ)句里的字段,去觸發(fā) Resolver 函數(shù)。

它也不管 Resolver 函數(shù)返回的數(shù)據(jù)類型對(duì)不對(duì),獲取到什么,就是什么。一個(gè)字段,不必先定義好,才能被前端消費(fèi),它可以動(dòng)態(tài)的計(jì)算出來(lái)。

在某些場(chǎng)景下,動(dòng)態(tài)類型的 GraphQL 有一定的便利性。不過(guò),它同時(shí)喪失了 GraphQL 的部分精髓,這塊后面將會(huì)詳細(xì)描述。

值得一提的是,不管是靜態(tài)類型的 GraphQL 還是動(dòng)態(tài)類型的 GraphQL,都是既可以運(yùn)行在服務(wù)端,也可以運(yùn)行在前端。

4.5?GraphQL 不一定返回 JSON?數(shù)據(jù)格式

這是另一個(gè)有趣的事實(shí)。最初我們演示了,如何基于 JSON 數(shù)據(jù)結(jié)果,反推出 GraphQL 查詢語(yǔ)法的設(shè)計(jì)。而現(xiàn)在,我們卻說(shuō) GraphQL 可以不返回 JSON 數(shù)據(jù)格式。

沒(méi)錯(cuò)。當(dāng)一個(gè)新事物出現(xiàn)之后,隨著它的不斷發(fā)展,它可以脫離其初衷,衍生出不同的形態(tài)。

上圖還是來(lái)自 graphql-anywhere 里的例子。

在這里,它實(shí)現(xiàn)了一個(gè) gqlToReact 的 Resolver,可以把一個(gè) graphql 查詢轉(zhuǎn)換為 ReactElement 結(jié)構(gòu)。

不只是動(dòng)態(tài)類型的 GraphQL 有這個(gè)能力,靜態(tài)類型的 GraphQL 也有可能實(shí)現(xiàn)一樣的效果。

不過(guò)這種做法,目前僅僅停留在能力演示階段。其妙用還有待社區(qū)去挖掘和探索。

五、GraphQL 的幾種使用模式

到目前為止,我們見(jiàn)識(shí)到了 GraphQL 的高自由度和靈活性。在搭建 GraphQL Server 時(shí),也可以根據(jù)實(shí)際需求和場(chǎng)景,采用不同的模式。

5.1 RESTful-Like 模式

這個(gè)模式就是簡(jiǎn)單粗暴的把 RESTful API 服務(wù),替換成 GraphQL 實(shí)現(xiàn)。之前有多少 RESTful 服務(wù),重構(gòu)后就有多少 GraphQL 服務(wù)。它是一個(gè)簡(jiǎn)單的一對(duì)一關(guān)系。

默認(rèn)情況下,面向兩個(gè) GraphQL 服務(wù)發(fā)起的查詢是兩次請(qǐng)求,而不是一次。舉個(gè)例子:

前端需要產(chǎn)品數(shù)據(jù)時(shí),從之前調(diào)用產(chǎn)品相關(guān)的 RESTful API,變成查詢產(chǎn)品相關(guān)的 GraphQL。不過(guò),需要訂單相關(guān)的數(shù)據(jù)時(shí),可能要查詢另一個(gè) GraphQL 服務(wù)。

有一些公司拿 GraphQL 小試牛刀時(shí),采取了這個(gè)做法;將 GraphQL 用在特定服務(wù)里。

不過(guò),這種模式難以發(fā)揮 GraphQL 合并請(qǐng)求和關(guān)聯(lián)請(qǐng)求的能力。只是起到了按需查詢,精確查詢字段的作用,價(jià)值有限。

因此,他們?cè)趯?shí)踐后,發(fā)現(xiàn)收效甚微;認(rèn)為 GraphQL 不過(guò)如此,還不如 RESTful API 架構(gòu)簡(jiǎn)單和成熟。

其實(shí)這是一種選型上的失誤。

5.2 GraphQL as an API Gateway 模式

在這個(gè)模式里,GraphQL 接管了前端的一整塊數(shù)據(jù)查詢需求。

前端不再直接調(diào)用具體的 RESTful 等接口,而是通過(guò) GraphQL 去間接獲取產(chǎn)品、訂單、搜索等數(shù)據(jù)。

在 GraphQL 這個(gè)中間層里,我們將各個(gè)微服務(wù),按照它們的數(shù)據(jù)關(guān)聯(lián),整合成一個(gè)基于 GraphQL Schema 的數(shù)據(jù)關(guān)系網(wǎng)絡(luò)。前端可以通過(guò) GraphQL 查詢語(yǔ)句,同時(shí)發(fā)起對(duì)多個(gè)微服務(wù)的數(shù)據(jù)的獲取、篩選、裁剪等行為。

值得一提的是,作為 API Gateway 的 GraphQL 服務(wù),可以在其 Resolver 內(nèi),向前面提到的 RESTful-like 的 GraphQL 發(fā)起查詢請(qǐng)求。

如此,既避免了前端需要一對(duì)多的問(wèn)題,也解決了 API Gateway GraphQL 需要請(qǐng)求 RESTful 全量數(shù)據(jù)接口的內(nèi)部冗余問(wèn)題。讓服務(wù)到服務(wù)之間的數(shù)據(jù)調(diào)用,也可以做到更精確。

GraphQL 服務(wù)是一個(gè)對(duì)數(shù)據(jù)消費(fèi)方友好的模式。而數(shù)據(jù)消費(fèi)方,既可以是前端,也可以是其它服務(wù)。

當(dāng)數(shù)據(jù)消費(fèi)方是其它服務(wù)時(shí),通過(guò) GraphQL 查詢語(yǔ)句,彼此之間可以更精確獲取數(shù)據(jù),避免冗余的數(shù)據(jù)傳輸和接口調(diào)用。

當(dāng)數(shù)據(jù)消費(fèi)方是前端時(shí),由于前端需要跟多個(gè)數(shù)據(jù)提供方打交道,如果每個(gè)數(shù)據(jù)提供方都是單獨(dú)的 GraphQL,那并不能得到本質(zhì)上的改善。此時(shí)若有一個(gè) Gateway 角色的 GraphQL,可以真正減少前端調(diào)用的復(fù)雜度。

5.2.1 兩類 GraphQL API Gateway 服務(wù)

同樣是 API Gateway 角色的 GraphQL 服務(wù),在實(shí)現(xiàn)方式上也有不同的分類。

1)包含大量真實(shí)的數(shù)據(jù)操作和處理的 GraphQL

2)轉(zhuǎn)發(fā)數(shù)據(jù)請(qǐng)求,聚合數(shù)據(jù)結(jié)果的 GraphQL

第一類,是傳統(tǒng)意義上的后端服務(wù);第二類,則是我們今天的重點(diǎn),GraphQL as BFF。

這兩類 GraphQL 服務(wù)的要求是不同的,前者可能包含大量 CPU 密集的計(jì)算,而后者總體而言主要是 Network I/O 相關(guān)的行為。

許多公司并不提倡使用 Node.js 構(gòu)建第一種服務(wù),不管是構(gòu)建 RESTful 還是 GraphQL。我們也一樣。

因此,后面我們討論的 GraphQL,如果沒(méi)有特別聲明,都可以理解為上面所說(shuō)的第二種類型。

5.3 GraphQL as a Backend Framework

在澄清關(guān)于 GraphQL 的迷思時(shí),我們指出,GraphQL 可以不作為 Server。

這意味著,一個(gè)包含 GraphQL 實(shí)現(xiàn)的 Server,不一定通過(guò) GraphQL 查詢語(yǔ)句進(jìn)行前后端數(shù)據(jù)交互,它可以繼續(xù)沿用 RESTful API 風(fēng)格。

也就是說(shuō),我們可以把 GraphQL 當(dāng)作一個(gè)服務(wù)端開發(fā)框架,然后在 RESTful 的各個(gè)接口里,發(fā)起 graphql 查詢。

不管是前端還是其它后端服務(wù),都不必知道 GraphQL 的存在。前端的調(diào)用方式,還是 RESTful API,在 RESTful 服務(wù)內(nèi)部,它自己向自己發(fā)起了 GraphQL 查詢。

那么,這個(gè)模式有什么好處跟價(jià)值?

設(shè)想一下,你用 RESTful API 風(fēng)格實(shí)現(xiàn) BFF。由于 PC 端和移動(dòng)端的場(chǎng)景不同,它們對(duì)同一份數(shù)據(jù)的消費(fèi)方式差異很大。

在 PC 端,它可以一次請(qǐng)求全量數(shù)據(jù)。

在移動(dòng)端,因?yàn)樗聊恍?#xff0c;它要分多次去請(qǐng)求數(shù)據(jù)。首屏一次,非首屏一次,滾動(dòng)按需加載 N 次,多個(gè) 2 級(jí)頁(yè)面里 M 次。

我們要么實(shí)現(xiàn)一個(gè)超級(jí)接口,根據(jù)請(qǐng)求參數(shù)適配不同場(chǎng)景(即實(shí)現(xiàn)一個(gè)半吊子的 GraphQL);要么實(shí)現(xiàn)多個(gè)功能相似,但又不同的 RESTful 接口。

其中的差異太大了,所以很多公司索性就把 BFF 分成,PC-BFF 和 Mobile-BFF 兩個(gè) BFF 服務(wù)。

我們可以把 PC-BFF 和 Mobile-BFF 整合成一個(gè) GraphQL-BFF 服務(wù)。即便前后端不通過(guò) GraphQL 查詢語(yǔ)句進(jìn)行交互,我們也可以在各個(gè)接口里,編寫相對(duì)簡(jiǎn)單的查詢語(yǔ)句,代替更高成本的接口實(shí)現(xiàn)。

也即是說(shuō),使用 GraphQL 搭建 BFF,如果出現(xiàn)前后端分工、溝通等方面的矛盾。我們可以將 GraphQL 服務(wù)降級(jí)為 RESTful 服務(wù),無(wú)非就是把需要前端編寫的查詢語(yǔ)句,寫死在后端接口里面罷了。

如果實(shí)現(xiàn)的是 RESTful 服務(wù),要轉(zhuǎn)換成 GraphQL 服務(wù),就沒(méi)有那么簡(jiǎn)單了。

有了這種優(yōu)雅降級(jí)的能力,我們可以更加放心大膽的推動(dòng) GraphQL-BFF 方案。

六、GraphQL 精髓

理解 GraphQL 的精髓所在,可以幫助我們更正確地實(shí)踐 GraphQL。

首先來(lái)想一下,GraphQL 為什么要叫 GraphQL,其中的 Graph 體現(xiàn)在什么地方?

GraphQL 的查詢語(yǔ)句,看起來(lái)是 JSON 寫法的一種簡(jiǎn)化。而 JSON 是一個(gè) Tree 樹形數(shù)據(jù)結(jié)構(gòu)。為什么不叫 TreeQL,而是 GraphQL 呢?

6.1?Tree VS Graph

一個(gè)重要的前置知識(shí)是,什么是 Tree,什么是 Graph,它們有什么關(guān)系?

下圖是一個(gè) Tree 的結(jié)構(gòu)示意圖。

Tree 有且只有一個(gè) Root 節(jié)點(diǎn),并且對(duì)于每個(gè)非 Root 節(jié)點(diǎn),有且只有一個(gè)父節(jié)點(diǎn);它們組成了一個(gè)層次結(jié)構(gòu)。其中任意兩個(gè)節(jié)點(diǎn),有且只有一條連接路徑;沒(méi)有循環(huán),也沒(méi)有遞歸引用。

下圖是一個(gè) Graph 的結(jié)構(gòu)示意圖。

而 Graph 里的節(jié)點(diǎn)之間,可能存在不只一種連接路徑,可能存在循環(huán),可能存在遞歸引用,可能沒(méi)有 Root 節(jié)點(diǎn)。它們組成了一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)。

我們可以把 Graph 這種網(wǎng)絡(luò)結(jié)構(gòu),通過(guò)裁剪連接路徑,把它壓縮成任意節(jié)點(diǎn)只有唯一連接路徑的簡(jiǎn)化形態(tài)。如此網(wǎng)絡(luò)結(jié)構(gòu)退化成層次結(jié)構(gòu),它變成了 Tree。

也就是說(shuō),Graph 是比 Tree 更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),后者是它的簡(jiǎn)化形式。擁有 Graph,我們可以按照不同的裁剪方式,衍生出不同的 Tree。而 Tree 里包含的信息,如果不增加其它額外數(shù)據(jù),不足以構(gòu)建足夠復(fù)雜的 Graph 結(jié)構(gòu)。

6.2?GraphQL 里的 Graph 結(jié)構(gòu)

在 GraphQL 里,承擔(dān)構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu)的,并非 GraphQL 查詢語(yǔ)句,而是基于 GraphQL Type System 構(gòu)建的 Schema。

上圖是一個(gè) GraphQL Schema,定義了 A, B, C, D 和 E 五種數(shù)據(jù)類型,它們分別掛載到?入口類型 Query 里的 a, b, c, d 和 e 字段里。

A, B, C, D, E 里面,包含著遞歸的結(jié)構(gòu)。A 里面包含 B 和 C,B 里面包含 C 和 D,D 里面包含 E,E 里面又包含 A,又回到了 A。

這是一個(gè)復(fù)雜的關(guān)系網(wǎng)絡(luò)。要構(gòu)建遞歸關(guān)聯(lián),并不需要這么復(fù)雜。直接 A 里包含 B,和 B 里包含 A 也行,此處是一個(gè)演示。

有了這個(gè)基于數(shù)據(jù)類型的 Graph 關(guān)系網(wǎng)絡(luò),我們可以實(shí)現(xiàn)從 Graph 中派生出 JSON Tree 的能力。

上圖是一個(gè) GraphQL 的查詢語(yǔ)句,它是一個(gè)包含很多 key 的層次結(jié)構(gòu),亦即一個(gè) Tree。

它從根節(jié)點(diǎn)里取 a 字段,然后向下分層,找到了 e。而 e 節(jié)點(diǎn)里也包含一個(gè)跟根節(jié)點(diǎn)同類型的 a 字段,因此它可以繼續(xù)向下分層,重來(lái)一遍,又到了 e 節(jié)點(diǎn),此時(shí)它只取了 data 字段,查詢中止。

我編寫了一個(gè)簡(jiǎn)單的 Resolver 函數(shù),用來(lái)演示查詢結(jié)果。

它很簡(jiǎn)單。Query 里返回跟字段名一樣的字母,任何子節(jié)點(diǎn)的數(shù)據(jù),都是拼接父節(jié)點(diǎn)的字母串。如此我們可以從查詢結(jié)果看出數(shù)據(jù)流動(dòng)的層次。

查詢結(jié)果如下:

第一個(gè) e 節(jié)點(diǎn)的 data 字段里,拿到了父節(jié)點(diǎn)里的 data 數(shù)據(jù),其父節(jié)點(diǎn)的 data 數(shù)據(jù)又是通過(guò)它的父節(jié)點(diǎn)里獲取的,因此有一個(gè)數(shù)據(jù)鏈條。

而第二個(gè) e 節(jié)點(diǎn)同理,它有兩段鏈條。

只要不編寫后續(xù)字段,我們可以停留在任意節(jié)點(diǎn)的 data 字段里。

也就是說(shuō),我們用作為 Tree 的 Query 語(yǔ)句,去裁剪了作為 Graph 的 Schema 數(shù)據(jù)關(guān)聯(lián)網(wǎng)絡(luò),得到了我們想要的 JSON 結(jié)構(gòu)。

通過(guò)這個(gè)角度,我們可以理解為什么 GraphQL 不允許 Query 語(yǔ)句停留在 Object 類型,一定要明確的寫出對(duì)象內(nèi)部的字段,直到所有 Leaf Node 都是 Scalar 類型。

這不僅僅是一個(gè)所謂的最佳實(shí)踐,這也是 Graph 本身的特征。對(duì)象節(jié)點(diǎn)里,可能通過(guò)循環(huán)或者遞歸關(guān)系,拓展出無(wú)限大的數(shù)據(jù)結(jié)構(gòu)。Query 語(yǔ)句必須寫清楚,才能幫助 GraphQL 去裁剪掉不必要的數(shù)據(jù)關(guān)聯(lián)路徑。

6.3?Graph 網(wǎng)絡(luò)結(jié)構(gòu)的實(shí)際價(jià)值

前面的 A, B, C, D, E 案例,并不能直觀的讓大家感受到,Graph 網(wǎng)絡(luò)結(jié)構(gòu)的實(shí)際價(jià)值。它看起來(lái)像一個(gè)連線游戲。

放到 Facebook 的社交網(wǎng)絡(luò)場(chǎng)景下,其必要性和價(jià)值就凸顯了。

假設(shè)我們要一次性獲取用戶的好友的好友的好友的好友的好友,基于 RESTful API 我們有什么特別好的方法嗎?很難說(shuō)。

而 Graph 這種遞歸關(guān)聯(lián)的結(jié)構(gòu),實(shí)現(xiàn)這種查詢輕而易舉。

我們定義了一個(gè) User 類型,掛到 Query 入口上的 user 字段里。User 類型的 friends 字段又是一個(gè) User 類型的列表。這樣就構(gòu)建了一個(gè)遞歸關(guān)聯(lián)。

getFriends 查詢語(yǔ)句,可以不斷地從任意用戶開始,關(guān)聯(lián)其 friends,得到 friends 數(shù)組結(jié)果。任意一個(gè) friend 也是 User,它也有自己的 friends。查詢語(yǔ)句在最外層的 friends 停了下來(lái),它只查詢了 id 和 name 字段。

看到這里,另一個(gè)經(jīng)典的關(guān)于 GraphQL 的誤解出現(xiàn)了:只有像 Facebook,Twitter 這類社交關(guān)系網(wǎng)絡(luò),才適合 GraphQL,而我們的場(chǎng)景下,GraphQL 并不適用。

其實(shí)不然,社交關(guān)系網(wǎng)絡(luò)里使用 GraphQL 特別有效,不意味著其它場(chǎng)景下,GraphQL 不能帶來(lái)收益。

設(shè)想一個(gè)電商平臺(tái)的場(chǎng)景,它有用戶、產(chǎn)品和訂單這組鐵三角,其它庫(kù)存、價(jià)格,優(yōu)惠券,收藏等先不提。在最簡(jiǎn)單的場(chǎng)景下,GraphQL 依然可以發(fā)揮作用。

我們構(gòu)建了 User,Product 和 Order 三個(gè)類型,它們彼此之間有字段上的遞歸關(guān)聯(lián)關(guān)系,是一個(gè) Graph 結(jié)構(gòu)。在 Query 入口類型上,分別有 user, product 和 order 三個(gè)字段。

據(jù)此,我們可以實(shí)現(xiàn)從 user, product 和 order 任意維度出發(fā),通過(guò)它們的關(guān)聯(lián)關(guān)系,實(shí)現(xiàn)豐富而靈活的查詢。

比如,查看用戶的所有訂單及其跟訂單相關(guān)的產(chǎn)品,Query 語(yǔ)句如下:

我們查詢了 id 為 123 的用戶,他的名字和訂單列表,對(duì)于每個(gè)訂單,我們獲取該訂單的創(chuàng)建時(shí)間,購(gòu)買價(jià)格和關(guān)聯(lián)產(chǎn)品,對(duì)于訂單關(guān)聯(lián)的產(chǎn)品,我們獲取了產(chǎn)品 id,產(chǎn)品標(biāo)題,產(chǎn)品描述和產(chǎn)品價(jià)格。

當(dāng)我們的后端人員組織架構(gòu)是按照領(lǐng)域模型來(lái)劃分時(shí),用戶,產(chǎn)品和訂單,通常是 3 個(gè)團(tuán)隊(duì),他們各自提供領(lǐng)域相關(guān)的接口。通過(guò) GraphQL 我們可以很容易將它們整合到一起。

再比如,查看一個(gè)產(chǎn)品下的所有訂單及其關(guān)聯(lián)用戶,Query 語(yǔ)句如下:

我們查詢了 id 為 123 的產(chǎn)品,它的產(chǎn)品標(biāo)題,產(chǎn)品描述和價(jià)格,以及關(guān)聯(lián)的訂單。對(duì)于每個(gè)關(guān)聯(lián)訂單,我們查詢了訂單的創(chuàng)建時(shí)間,購(gòu)買價(jià)格以及下訂單的用戶,對(duì)于下訂單的用戶,我們查詢了他的用戶 id 和名稱。

如你所見(jiàn),只要構(gòu)建出了 Graph 結(jié)構(gòu)的數(shù)據(jù)網(wǎng)絡(luò),它不像 Tree 那樣有唯一的 Root 節(jié)點(diǎn)。從任意入口出發(fā),它都可以通過(guò)關(guān)聯(lián)路徑,不斷的衍生出數(shù)據(jù),得到 JSON 結(jié)果。

我們不必疲于編寫面向產(chǎn)品詳情頁(yè)的接口,面向訂單詳情頁(yè)的接口,面向用戶信息的接口。我們編寫了一個(gè)數(shù)據(jù)關(guān)系網(wǎng)絡(luò),就足以適配不同的場(chǎng)景。

此處演示的,只是用戶,產(chǎn)品和訂單這三個(gè)資源的關(guān)系網(wǎng)絡(luò),已經(jīng)可以看出 GraphQL 的適用性。在實(shí)際場(chǎng)景中,我們能搭建出更復(fù)雜的數(shù)據(jù)網(wǎng)絡(luò),它具備更強(qiáng)大的數(shù)據(jù)表達(dá)能力,可以給我們的業(yè)務(wù)帶來(lái)更多收益。

七、我們的 GraphQL-BFF 實(shí)踐模式

在掌握上述關(guān)于 GraphQL 的綱領(lǐng)知識(shí)后,我們來(lái)看一下在實(shí)踐中 ,GraphQL-BFF 的一種實(shí)際做法。

首先是技術(shù)選型,我們主要采用了如下技術(shù)棧。

開發(fā)語(yǔ)言選用了 TypeScript,跑在 Node.js v10.x 版本上,服務(wù)端框架是 Koa v2.x 版本,使用 apollo-server-koa 模塊去運(yùn)行 GraphQL 服務(wù)。

Apollo-GraphQL 是 Node.js 社區(qū)里,比較知名和成熟的 GraphQL 框架。做了很多的細(xì)節(jié)工作,也有一些相對(duì)前沿的探索,比如 Apollo Federation 架構(gòu)等。

不過(guò),有兩點(diǎn)值得一提:

1)Apollo-GraphQL 屬于 GraphQL 社區(qū)的一部分,而非 Facebook 官方的 GraphQL 開發(fā)團(tuán)隊(duì)。Apollo-GraphQL 在官方 GraphQL 的基礎(chǔ)上進(jìn)行了帶有他們自身理念特點(diǎn)的封裝和設(shè)計(jì)。像 Apollo Federation 這類目前看來(lái)比較激進(jìn)的方案,即使是 GraphQL 官方的開發(fā)人員,對(duì)此也持保留態(tài)度。

2)Apollo-GraphQL 的重心是前文所說(shuō)的第一類 API Gateway 角色的 GraphQL 服務(wù),本文探討的是第二類。因此,Apollo-GraphQL 里有很多功能對(duì)我們來(lái)說(shuō)沒(méi)必要,有一些功能的使用方式,跟我們的場(chǎng)景也不契合。

我們主要使用的是 Apollo-GraphQL 的 graphql-tools 和 apollo-server-koa 兩個(gè)模塊,并在此基礎(chǔ)上,進(jìn)行了符合我們場(chǎng)景的設(shè)計(jì)和改編。

7.1?我們的 GraphQL-BFF 架構(gòu)設(shè)計(jì)

GraphQL-BFF 的核心思路是,將多個(gè) services 整合成一個(gè)中心化 data graph。

每個(gè) service 的數(shù)據(jù)結(jié)構(gòu)契約,都放入了一個(gè)大而全的 GraphQL Schema 里;如果不做任何模塊化和解耦,開發(fā)體驗(yàn)將會(huì)非常糟糕。每個(gè)團(tuán)隊(duì)成員,都去修改同一份 Schema 文件。

這明顯是不合理的。GraphQL-BFF 的開發(fā)模式,應(yīng)該跟 service 的領(lǐng)域模型,有一一對(duì)應(yīng)的關(guān)系。然后通過(guò)某種形式,多個(gè) services 自然整合到一起。

因此,我們?cè)O(shè)計(jì)了 GraphQL-Service 的概念。

7.1.1?GraphQL-Service

GraphQL-Service 是一個(gè)由 Schema + Resolver 兩部分組成的 JS 模塊,它對(duì)應(yīng)基于領(lǐng)域模型的后端的某個(gè) Servcie。每個(gè) GraphQL-Service 應(yīng)該可以按照模塊化的方式編寫,跟其它 GraphQL-Service 組合起來(lái)后,構(gòu)建出更大的 GraphQL-Server。

GraphQL-Service 通過(guò) GraphQL 的 Type Extensions 構(gòu)建數(shù)據(jù)關(guān)聯(lián)關(guān)系。

如上所示,我們的 UserService 里面,只涉及到了 User 相關(guān)的類型處理。它定義了自己的基本字段,id 和 name。通過(guò) extend type 定義了它在 Order 和 Product 數(shù)據(jù)里的關(guān)聯(lián)字段,以及定義在 Query 里的入口字段。

從 User Schema 里我們可以看到,User 有兩類查詢路徑。

1)通過(guò)根節(jié)點(diǎn) Query 以傳遞參數(shù)的方式,獲取到 User 信息。

2)通過(guò) Product 或 Order 節(jié)點(diǎn),以數(shù)據(jù)關(guān)聯(lián)的方式,獲取到 User 信息。

上圖是 OrderService 的 Schema,它也只涉及了 Order 相關(guān)的類型邏輯。同樣是通過(guò) extend type 定義了在 User 和 Product 里的關(guān)聯(lián)字段,以及定義了在根節(jié)點(diǎn) Query 里的入口字段。

Order 數(shù)據(jù)跟 User 一樣,有兩種消費(fèi)路徑。一種通過(guò) Query 節(jié)點(diǎn),另一種是通過(guò)數(shù)據(jù)關(guān)聯(lián)節(jié)點(diǎn)。

前面我們演示 User, Order 和 Product 鐵三角關(guān)系時(shí),是在同一個(gè) Schema 里編寫它們的關(guān)聯(lián)。我們把多個(gè) GraphQL-Service 的 Schema 整合到一起后,可以生成同樣的結(jié)果:

上圖不是我們手動(dòng)編寫的,而是 merge 多個(gè) GraphQL-Service 的 Schema 后生成的結(jié)果。可以看出來(lái),跟之前手寫的版本,總體上是一樣的。

有了解耦的 Schema 并不足夠,它只定義了數(shù)據(jù)類型及其關(guān)聯(lián)。我們需要 Resolver 去定義數(shù)據(jù)的具體獲取方式,Resolver 也需要解耦。

7.1.2?GraphQL-Resolver

不管是在官方的 GraphQL 文檔里,還是 Apollo-GraphQL 的文檔里,Resolver 都是以普通函數(shù)的形態(tài)出現(xiàn)。

這在簡(jiǎn)單場(chǎng)景下,沒(méi)有什么問(wèn)題。正如在簡(jiǎn)單場(chǎng)景下,用 node.js 的 http.createServer 就可以創(chuàng)建一個(gè) server。

如上,設(shè)置狀態(tài)碼,設(shè)置響應(yīng)的 Content-Type,返回內(nèi)容即可。

然而,在更復(fù)雜的真實(shí)項(xiàng)目中,我們實(shí)際上需要 express、koa 等服務(wù)端框架,用中間件的模式編寫我們的服務(wù)端處理邏輯,由框架將它們整合為一個(gè)requestListener 函數(shù),注冊(cè)到 http.createServer(requestListener) 里。

在 GraphQL Server 里,雖然 endpoint 只有 /graphql 一個(gè),但不代表它只需要一組 Koa 中間件。

正如一開始我們指出的,每個(gè)超級(jí)接口里都包含一半功能的 GraphQL 實(shí)現(xiàn)。GraphQL 是往超級(jí)接口的方向更進(jìn)一步,不能簡(jiǎn)單地以普通接口的眼光去看待它。

在 Query 下的每個(gè)字段,都可能對(duì)應(yīng) 1 到多個(gè)內(nèi)部服務(wù)的 API 的調(diào)用和處理。只用普通函數(shù)構(gòu)成的 resolverMap,不足以充分表達(dá)其中的邏輯復(fù)雜度。

不管是用 endpoint 來(lái)表示資源,還是用 GraphQL Field 字段來(lái)表示資源,它們只是外在形式略有不同,不會(huì)改變業(yè)務(wù)邏輯的復(fù)雜度。

因此,采用比普通函數(shù)具有更好的表達(dá)能力的中間件,組合出一個(gè)個(gè) Resolver,再整合到一個(gè) ResolverMap 里。可以更好的解決之前解決不了,或者很難的問(wèn)題。

所謂的架構(gòu)能力,體現(xiàn)在理解我們面對(duì)的問(wèn)題的復(fù)雜度及其本質(zhì)特征,并能選擇和設(shè)計(jì)出合適的程序表達(dá)模型。

后面我們將演示,正確的架構(gòu),如何輕易地克服之前難以解決的問(wèn)題。

7.1.3?用 koa-compose 組織我們的 Resolver

或許很多同學(xué)并不清楚,express 或 koa 里的中間件模式,可以脫離作為服務(wù)端框架的它們而單獨(dú)使用。正如 GraphQL 可以單獨(dú)不作為 server,在任意支持 JavaScript 運(yùn)行的地方使用一樣。

我們將使用 koa-compose 這個(gè) npm 模塊,去構(gòu)造我們的 Resolver。

前文里提到的 gql 函數(shù),接受一個(gè) Schema 返回一個(gè) GraphQL-Service,每個(gè) GraphQL-Service 都有一個(gè) resolve 方法:

resolve 方法,接受兩個(gè)參數(shù)。第一個(gè)是 typeName,對(duì)應(yīng) GraphQL-Schema 里的 Object Type 的類型名稱;第二個(gè)是 fieldHandlers,每個(gè) handler 支持中間件模式,最終它們將被 koa-compose 整合成一個(gè) Resolver。

以 UserService 為例,其 Resolver 寫起來(lái)如下:

作為普通函數(shù)的 Resolver 接收的所有參數(shù),都被整合到了 ctx 里面。ctx.result 則是該字段的最終輸出,類似于 koa server 里的 ctx.body。我們刻意采用了 ctx.result 這個(gè)不同于 ctx.body 的屬性,明確區(qū)分我們處理的是一個(gè)接口還是一個(gè)字段。

在簡(jiǎn)單場(chǎng)景下,中間件模式的 Resolver 跟普通函數(shù)的 Resolver,僅僅是參數(shù)的數(shù)量和返回值的方式不同。并不會(huì)增加大量的代碼復(fù)雜度。

當(dāng)我們多個(gè)字段要復(fù)用相同的邏輯時(shí),編寫成中間件,然后將 handler 變成數(shù)組形式即可。(在代碼里我們用 json 模擬了數(shù)據(jù)庫(kù)表,所以是同步代碼,實(shí)際項(xiàng)目里,它可以是異步的調(diào)用接口或者查詢數(shù)據(jù)庫(kù))。

上面的 logger,只是一個(gè)簡(jiǎn)單案例。除此之外,我們可以編寫 requireLogin 中間件,決定一個(gè)字段是否只對(duì)登陸用戶可用。我們可以編寫不同的工具型中間件,注入 ctx.fetch, ctx.post, ctx.xxx 等方法,以供后續(xù)中間件使用。

每個(gè) GraphQL Field 字段,都擁有獨(dú)立的一組中間件和 ctx 對(duì)象,跟其他字段互相不影響。我們同時(shí),可以把所有字段共享的中間件,放到 koa server 里的中間件里。

如上圖所示,綠框是 endpoint,可以編寫 koa server 層面的 middleware。而藍(lán)框是 GraphQL Field 字段,可以編寫 Resolver 層面的 middleware。endpoint 層面的 middleware 對(duì) ctx 的修改,會(huì)影響到后面所有字段。

也就是說(shuō),我們可以像上面那樣。掛接口層面的 logger,可以知道整個(gè) graphql 查詢的耗時(shí)。編寫一個(gè)中間件,在 next 之前,掛載一些方法,供后續(xù)中間件使用;在 next 之后,拿到 graphql 的查詢結(jié)果,進(jìn)行額外的處理。

7.2?解決 mock 難題

GraphQL 是天生 mock 友好的模式,因?yàn)槠?Schema 里已經(jīng)指明了所有數(shù)據(jù)的類型及其關(guān)聯(lián);很容易可以通過(guò) faker data 之類的手段,自動(dòng)根據(jù)類型生成假數(shù)據(jù)。

然而,在實(shí)踐中,實(shí)現(xiàn) GraphQL Mocking 還是有不少的挑戰(zhàn)。

如上圖所示,在 Apollo GraphQL 里,mock 看似很簡(jiǎn)單,只需要在創(chuàng)建服務(wù)時(shí),設(shè)置 mock 為 true,或者提供一個(gè) mock resolver 即可。但是,一個(gè)全局的,跟著服務(wù)創(chuàng)建走的 mock,太過(guò)粗暴。

mock 的價(jià)值在于提供更好的數(shù)據(jù)靈活性以加速開發(fā)效率。它既可以在沒(méi)有數(shù)據(jù)時(shí),提供假數(shù)據(jù);也可以在真數(shù)據(jù)的接口有問(wèn)題時(shí),不用重啟服務(wù),也能降級(jí)為假數(shù)據(jù)。它既可以是整個(gè) GraphQL 查詢級(jí)別的 mock,也可以是字段級(jí)別的 mock。

作為超級(jí)接口的 GraphQL 服務(wù),全局的,在啟動(dòng)階段就固化的 mocking,意義不大。

Apollo GraphQL 的 mocking 實(shí)踐問(wèn)題,正是它采用普通函數(shù)來(lái)描述 Resolver 所帶來(lái)的;它很難簡(jiǎn)單的通過(guò)拓展某個(gè) resolver 而支持 mocking。它不得不在創(chuàng)建服務(wù)時(shí),額外新增一個(gè) mock resolver map 去承擔(dān) mocking 職能。

而我們的 composed resolver 處理動(dòng)態(tài) mocking 卻異常簡(jiǎn)單。

它不僅可以在運(yùn)行時(shí)動(dòng)態(tài)確定,它不僅可以細(xì)化到字段級(jí)別,它甚至可以跟著某次查詢走 mock 邏輯(通過(guò)添加 @mock 指令)。

上圖是默認(rèn)情況下,基于 faker 這個(gè) npm 包,根據(jù)數(shù)據(jù)類型生成的 mock data。

在我們的設(shè)計(jì)里,默認(rèn)的 mocking,其內(nèi)部實(shí)現(xiàn)方式很簡(jiǎn)單。我們先是編寫了上圖,根據(jù) GraphQL Type 調(diào)用 faker 模塊對(duì)應(yīng)的方法,生成假數(shù)據(jù)。

然后在 createResolver 這個(gè)將中間件整合成 resolver 的函數(shù)里,先判斷中間件里是否存在自定義的 mock handler 函數(shù),如果沒(méi)有,就追加前面編寫的 mocker 處理函數(shù)。

我們還提供了 mock 中間件,讓開發(fā)者能指定 mock 數(shù)據(jù)來(lái)源,比如指定 mock json 文件。

mock 中間件,接收字符串參數(shù)時(shí),它會(huì)搜尋本地的 mock 目錄下是否有同名文件,作為當(dāng)前字段的返回值。它也接收函數(shù)作為參數(shù),在該函數(shù)里,我們可以手動(dòng)編寫更復(fù)雜的 mock 數(shù)據(jù)邏輯。

有趣的地方是,mock/user.json 文件里,只包含上圖紅框的數(shù)據(jù),其關(guān)聯(lián)出來(lái)的 collections 字段,是真實(shí)的。這是合理的做法,mock 應(yīng)該跟著 resolver 走。關(guān)聯(lián)字段擁有自己的 resolver,可能調(diào)用自己的接口;不應(yīng)該因?yàn)楦腹?jié)點(diǎn)是 mock 的,子節(jié)點(diǎn)也進(jìn)入 mock 模式。

如此,我們可以在父節(jié)點(diǎn) resolver 對(duì)應(yīng)的后端接口掛掉后,mock 它,讓沒(méi)掛掉的子節(jié)點(diǎn) resolver 正常運(yùn)行。如果我們希望子節(jié)點(diǎn) resolver 也進(jìn)入 mock。很簡(jiǎn)單,添加一個(gè) @mock 指令即可。

如上所示,user 字段和 collections 字段的 resolver 都進(jìn)入了 mock 模式。

自定義 mock resolver 函數(shù)的方式如上圖所示,mock 中間件保證了,只有在該字段進(jìn)入 mock 模式時(shí),才執(zhí)行 mock resolver function。并且,mock resolver function 內(nèi)部依然有機(jī)會(huì)通過(guò)調(diào)用 next 函數(shù),觸發(fā)后面的真實(shí)數(shù)據(jù)獲取邏輯。

以上所有這些靈活性,都來(lái)自于我們選用了表達(dá)能力和可組合性更好的中間件模式,代替普通該函數(shù),承擔(dān) resolver 的職能。

總結(jié)

至此,我們得到了一個(gè)簡(jiǎn)單而靈活的實(shí)踐模式。我們用 Schema 去構(gòu)建 Data Graph 數(shù)據(jù)關(guān)聯(lián)圖,我們用 Middleware 去構(gòu)建 Resolver Map,它們都具備很強(qiáng)的表達(dá)能力。

在開發(fā) GraphQL-BFF 時(shí),我們的 GraphQL-Service 跟后端基于領(lǐng)域模型的 Service,具有總體上的一一對(duì)應(yīng)關(guān)系。不會(huì)產(chǎn)生后端數(shù)據(jù)層解耦后,在 GraphQL 層重新耦合的尷尬現(xiàn)象。

關(guān)于 GraphQL 還有很多話題可以討論,比如 batching , caching 等。這部分內(nèi)容在網(wǎng)絡(luò)上很多 GraphQL 的文檔和教程里都可以找到,這里我們不再贅述。

總的而言,根據(jù)我們對(duì) GraphQL 的考察和實(shí)踐,我們認(rèn)為它可以比 RESTful API 更好的解決我們面對(duì)的問(wèn)題。

我們對(duì) GraphQL 的期望,不僅僅停留在 BFF 層。我們希望通過(guò)積累在 BFF 層使用 GraphQL 的成功經(jīng)驗(yàn),幫助我們摸索出在 Micro Frontend 架構(gòu)上使用 GraphQL 模式的合理設(shè)計(jì)。

如前面所演示的,像 User,Product 和 Order 這種公共級(jí)別的數(shù)據(jù)類型,不可能只由一個(gè)團(tuán)隊(duì)去維護(hù),它們需要被其它團(tuán)隊(duì)所拓展。使得我們可以通過(guò)用戶,找到它關(guān)聯(lián)的訂單,收藏,優(yōu)惠券等由其它團(tuán)隊(duì)維護(hù)的數(shù)據(jù)。

放到 Micro Frontend 架構(gòu)上,一個(gè)支付按鈕,也夾雜了多種類型的數(shù)據(jù),產(chǎn)品信息,用戶信息,庫(kù)存信息,UI 展示信息,交互狀態(tài)信息等等,綜合了這些信息,支付按鈕被點(diǎn)擊時(shí),才得到了充分的數(shù)據(jù),可以決定是否去支付。

樸素 Micro Frontend 的設(shè)計(jì),用 Vue, React, Angular 不同框架,分別維護(hù)不同組件,通過(guò) router/message-passing 等方式互相通訊。在我看來(lái),這是對(duì)后端微服務(wù)架構(gòu)的拙劣模仿。

后端服務(wù),各自部署在獨(dú)立環(huán)境中,對(duì)體積不敏感;因而可以采用不同的語(yǔ)言和技術(shù)棧。這不意味著將它簡(jiǎn)單的放到前端里一樣成立。無(wú)法共享前端開發(fā)的基礎(chǔ)設(shè)施,這不是微前端,這是一種人員組織架構(gòu)上的混亂。

GraphQL 讓我們看到,基于領(lǐng)域模型的微前端架構(gòu),可能是更好的方向。一個(gè)簡(jiǎn)單的支付按鈕,也綜合了多個(gè)領(lǐng)域模型,由多個(gè)開發(fā)者有組織的協(xié)同開發(fā)。并不因?yàn)樗砻嫔峡雌饋?lái)是一個(gè) Button 組件,就由某個(gè)團(tuán)隊(duì)單獨(dú)維護(hù)。

當(dāng)然,探索 GraphQL 的其它方向的前提是,GraphQL-BFF 架構(gòu)得到成功的驗(yàn)證。就現(xiàn)階段的實(shí)踐成果來(lái)看,我們對(duì)此充滿了信心。

盡管我們的代碼暫無(wú)開源計(jì)劃,不過(guò)相信這篇文章,足夠完整和清楚地介紹了我們的 GraphQL-BFF 方案。希望它能給大家?guī)?lái)一點(diǎn)幫助。

總結(jié)

以上是生活随笔為你收集整理的干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

www国产亚洲精品久久网站 | 蜜桃av抽搐高潮一区二区 | 在线看片无码永久免费视频 | 国产97人人超碰caoprom | 99精品视频在线观看免费 | 天堂无码人妻精品一区二区三区 | 黑人大群体交免费视频 | 玩弄人妻少妇500系列视频 | 国产网红无码精品视频 | 日本又色又爽又黄的a片18禁 | 国产精品免费大片 | 特级做a爰片毛片免费69 | 少妇久久久久久人妻无码 | 99麻豆久久久国产精品免费 | 日本成熟视频免费视频 | 人人爽人人爽人人片av亚洲 | 四虎国产精品免费久久 | 亚洲乱码国产乱码精品精 | 中文亚洲成a人片在线观看 | aⅴ在线视频男人的天堂 | 国产人妻人伦精品1国产丝袜 | 国产97色在线 | 免 | www国产亚洲精品久久久日本 | 久久久精品国产sm最大网站 | 久久99久久99精品中文字幕 | 狠狠色色综合网站 | 亚洲理论电影在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 红桃av一区二区三区在线无码av | 成人性做爰aaa片免费看不忠 | 好男人www社区 | 97精品国产97久久久久久免费 | 成 人影片 免费观看 | 草草网站影院白丝内射 | 国产色视频一区二区三区 | 久久久成人毛片无码 | 偷窥村妇洗澡毛毛多 | 天天爽夜夜爽夜夜爽 | 国产高清av在线播放 | 久久久亚洲欧洲日产国码αv | 亚洲国产精品久久久天堂 | 无码纯肉视频在线观看 | 久久久久人妻一区精品色欧美 | 高潮毛片无遮挡高清免费 | 无码国模国产在线观看 | 日韩亚洲欧美中文高清在线 | 熟妇人妻无乱码中文字幕 | 久久国产自偷自偷免费一区调 | 欧洲美熟女乱又伦 | 麻豆国产丝袜白领秘书在线观看 | 国产又粗又硬又大爽黄老大爷视 | 中文字幕中文有码在线 | 国产精品视频免费播放 | 亚洲男人av天堂午夜在 | 精品无人区无码乱码毛片国产 | 欧美阿v高清资源不卡在线播放 | 精品无码国产自产拍在线观看蜜 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲精品成人福利网站 | 无码国模国产在线观看 | 中文字幕+乱码+中文字幕一区 | 国产精品人妻一区二区三区四 | 国产精品永久免费视频 | 精品久久8x国产免费观看 | 免费中文字幕日韩欧美 | 色五月五月丁香亚洲综合网 | 中文字幕av日韩精品一区二区 | 在线观看免费人成视频 | 真人与拘做受免费视频 | 色综合久久88色综合天天 | 久久人人97超碰a片精品 | 高潮毛片无遮挡高清免费 | 成人亚洲精品久久久久软件 | 成人精品视频一区二区三区尤物 | 国产精品.xx视频.xxtv | 亚洲国产欧美国产综合一区 | 欧美老熟妇乱xxxxx | 日本一卡2卡3卡四卡精品网站 | 精品偷自拍另类在线观看 | 午夜福利一区二区三区在线观看 | 曰韩少妇内射免费播放 | 又湿又紧又大又爽a视频国产 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲色www成人永久网址 | 欧美老熟妇乱xxxxx | 久久久久人妻一区精品色欧美 | 人人澡人人妻人人爽人人蜜桃 | 精品国产aⅴ无码一区二区 | 国产亚洲精品久久久久久大师 | 未满成年国产在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩欧美群交p片內射中文 | 日韩人妻系列无码专区 | 国产成人人人97超碰超爽8 | 亚洲 激情 小说 另类 欧美 | 日本护士xxxxhd少妇 | 久久伊人色av天堂九九小黄鸭 | 疯狂三人交性欧美 | 欧美日韩综合一区二区三区 | 亚洲另类伦春色综合小说 | 亚洲熟妇色xxxxx欧美老妇y | 好爽又高潮了毛片免费下载 | 欧美兽交xxxx×视频 | 性生交大片免费看女人按摩摩 | 亚洲の无码国产の无码步美 | 蜜桃视频韩日免费播放 | 久久人人爽人人爽人人片av高清 | 日本一区二区更新不卡 | 领导边摸边吃奶边做爽在线观看 | 波多野结衣av在线观看 | 乱人伦人妻中文字幕无码 | 红桃av一区二区三区在线无码av | 亚洲自偷自拍另类第1页 | 国产办公室秘书无码精品99 | 波多野42部无码喷潮在线 | 精品久久久无码中文字幕 | 日本乱人伦片中文三区 | 伊人久久婷婷五月综合97色 | 99久久婷婷国产综合精品青草免费 | 国产色xx群视频射精 | 日韩成人一区二区三区在线观看 | 美女极度色诱视频国产 | 国产亚洲精品精品国产亚洲综合 | 欧美老妇交乱视频在线观看 | 亚洲成av人在线观看网址 | 国产av一区二区三区最新精品 | 最近的中文字幕在线看视频 | 国产成人无码a区在线观看视频app | 国产精品a成v人在线播放 | 久久精品女人的天堂av | 国产人妖乱国产精品人妖 | 国产av人人夜夜澡人人爽麻豆 | 超碰97人人做人人爱少妇 | 亚洲综合在线一区二区三区 | 亚洲日韩中文字幕在线播放 | 丝袜 中出 制服 人妻 美腿 | 亚洲成a人一区二区三区 | 亚洲国产午夜精品理论片 | 任你躁国产自任一区二区三区 | 免费看少妇作爱视频 | 国产色xx群视频射精 | 成人无码精品一区二区三区 | 丝袜足控一区二区三区 | 久久综合狠狠综合久久综合88 | 国产精品久久久av久久久 | 老熟女重囗味hdxx69 | 国产乱人无码伦av在线a | 日本一卡2卡3卡四卡精品网站 | 午夜精品久久久久久久久 | 午夜性刺激在线视频免费 | 久久久久se色偷偷亚洲精品av | 日韩视频 中文字幕 视频一区 | 99久久久无码国产aaa精品 | 爽爽影院免费观看 | 国产乱人伦av在线无码 | aⅴ亚洲 日韩 色 图网站 播放 | 无码人妻黑人中文字幕 | 成人亚洲精品久久久久软件 | 激情五月综合色婷婷一区二区 | 少妇性l交大片欧洲热妇乱xxx | 国产绳艺sm调教室论坛 | 欧美人与物videos另类 | 亚洲爆乳无码专区 | 国产特级毛片aaaaaaa高清 | 国产成人精品久久亚洲高清不卡 | 日本熟妇浓毛 | 色偷偷人人澡人人爽人人模 | 99麻豆久久久国产精品免费 | 亚洲精品一区二区三区大桥未久 | 精品国产成人一区二区三区 | 在线播放亚洲第一字幕 | 精品水蜜桃久久久久久久 | 老司机亚洲精品影院无码 | 亚洲七七久久桃花影院 | 中文字幕日韩精品一区二区三区 | 久久精品国产日本波多野结衣 | 亚洲最大成人网站 | 亚洲男人av天堂午夜在 | 最新版天堂资源中文官网 | 亚洲精品一区三区三区在线观看 | 国产亚洲精品久久久久久久久动漫 | 亚洲精品国产精品乱码视色 | 日本一区二区更新不卡 | 丝袜足控一区二区三区 | 黑人粗大猛烈进出高潮视频 | 乱人伦人妻中文字幕无码 | 欧美日韩视频无码一区二区三 | 亚洲乱码国产乱码精品精 | 少妇久久久久久人妻无码 | 午夜时刻免费入口 | 欧美亚洲日韩国产人成在线播放 | www国产亚洲精品久久网站 | 中文字幕av伊人av无码av | 少妇无码吹潮 | 欧美一区二区三区 | 51国偷自产一区二区三区 | а√天堂www在线天堂小说 | 国产肉丝袜在线观看 | 午夜精品久久久久久久久 | 亚洲色偷偷偷综合网 | 国产极品美女高潮无套在线观看 | 色综合久久中文娱乐网 | 人妻有码中文字幕在线 | 国产莉萝无码av在线播放 | 国产片av国语在线观看 | 久激情内射婷内射蜜桃人妖 | 色 综合 欧美 亚洲 国产 | 中文字幕 亚洲精品 第1页 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品福利视频导航 | 人人澡人摸人人添 | 青草青草久热国产精品 | 亚洲欧洲无卡二区视頻 | 狂野欧美激情性xxxx | 国产亚洲精品久久久久久 | 久久久久成人精品免费播放动漫 | 午夜精品一区二区三区在线观看 | 人人妻人人澡人人爽欧美精品 | 欧美性黑人极品hd | 日本熟妇人妻xxxxx人hd | 国产人成高清在线视频99最全资源 | 在教室伦流澡到高潮hnp视频 | 亚洲va中文字幕无码久久不卡 | 久久精品中文闷骚内射 | 亚洲成av人片在线观看无码不卡 | 无码人妻出轨黑人中文字幕 | 性欧美牲交在线视频 | 久久精品国产一区二区三区肥胖 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人午夜福利在线播放 | 国产成人综合色在线观看网站 | 日本丰满熟妇videos | 久久精品中文字幕大胸 | 清纯唯美经典一区二区 | 亚洲成色www久久网站 | 欧美亚洲日韩国产人成在线播放 | 又大又硬又黄的免费视频 | 无码国产色欲xxxxx视频 | 久久精品国产亚洲精品 | 国产内射爽爽大片视频社区在线 | 波多野结衣乳巨码无在线观看 | 成人亚洲精品久久久久软件 | 成人无码影片精品久久久 | 波多野结衣av一区二区全免费观看 | 国产成人综合色在线观看网站 | 一本精品99久久精品77 | 一个人看的www免费视频在线观看 | 久久国产精品精品国产色婷婷 | 亚洲色大成网站www | 日韩视频 中文字幕 视频一区 | 高清不卡一区二区三区 | 国产极品美女高潮无套在线观看 | 无码人妻丰满熟妇区五十路百度 | 久久久久久av无码免费看大片 | 狠狠色噜噜狠狠狠7777奇米 | 中文字幕久久久久人妻 | 国产免费观看黄av片 | 97人妻精品一区二区三区 | 精品久久久久香蕉网 | 无套内谢老熟女 | 亚洲成a人片在线观看无码3d | 久久久亚洲欧洲日产国码αv | 美女极度色诱视频国产 | 久久国产精品萌白酱免费 | 免费乱码人妻系列无码专区 | 国产在线aaa片一区二区99 | 成人aaa片一区国产精品 | 久久精品国产大片免费观看 | 精品国产国产综合精品 | 波多野结衣av在线观看 | 国产成人精品三级麻豆 | 久久亚洲精品中文字幕无男同 | 在线亚洲高清揄拍自拍一品区 | 国产偷抇久久精品a片69 | а天堂中文在线官网 | 精品无码一区二区三区爱欲 | 精品乱码久久久久久久 | 国内精品一区二区三区不卡 | 东京热无码av男人的天堂 | 精品一区二区三区无码免费视频 | 亚洲中文字幕无码中字 | 亚洲第一网站男人都懂 | 中文字幕人妻丝袜二区 | 国产口爆吞精在线视频 | 日本欧美一区二区三区乱码 | 美女毛片一区二区三区四区 | 国产精品欧美成人 | 女人高潮内射99精品 | 成人无码精品1区2区3区免费看 | 漂亮人妻洗澡被公强 日日躁 | 精品乱子伦一区二区三区 | 亚洲国精产品一二二线 | 帮老师解开蕾丝奶罩吸乳网站 | 丰腴饱满的极品熟妇 | 樱花草在线社区www | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲欧美国产精品专区久久 | 成年女人永久免费看片 | 在线观看欧美一区二区三区 | 蜜桃无码一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 国产suv精品一区二区五 | 97夜夜澡人人双人人人喊 | 国产午夜无码视频在线观看 | 麻豆国产人妻欲求不满谁演的 | 国产精品亚洲一区二区三区喷水 | 日韩精品a片一区二区三区妖精 | 久久久久av无码免费网 | 99在线 | 亚洲 | 夜夜夜高潮夜夜爽夜夜爰爰 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲色大成网站www | 男女爱爱好爽视频免费看 | 欧美乱妇无乱码大黄a片 | 国産精品久久久久久久 | 久久久精品欧美一区二区免费 | 狠狠cao日日穞夜夜穞av | 曰韩无码二三区中文字幕 | 久久97精品久久久久久久不卡 | 日日干夜夜干 | 国产精品国产自线拍免费软件 | a在线观看免费网站大全 | 成年美女黄网站色大免费视频 | 亚洲男人av天堂午夜在 | 无码成人精品区在线观看 | 东北女人啪啪对白 | 亚洲 激情 小说 另类 欧美 | 高清不卡一区二区三区 | 亚洲国产高清在线观看视频 | v一区无码内射国产 | 国产人妻大战黑人第1集 | 少妇无码av无码专区在线观看 | 精品国精品国产自在久国产87 | 欧美人与善在线com | 麻豆精品国产精华精华液好用吗 | 四虎影视成人永久免费观看视频 | 少妇太爽了在线观看 | 5858s亚洲色大成网站www | 一本久久a久久精品vr综合 | 天天做天天爱天天爽综合网 | 强奷人妻日本中文字幕 | 色综合久久中文娱乐网 | 四虎影视成人永久免费观看视频 | 成人aaa片一区国产精品 | 97se亚洲精品一区 | 大屁股大乳丰满人妻 | a国产一区二区免费入口 | 狠狠色色综合网站 | 给我免费的视频在线观看 | 最新国产乱人伦偷精品免费网站 | 国产精品久久久午夜夜伦鲁鲁 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲性无码av中文字幕 | 美女张开腿让人桶 | 天天躁夜夜躁狠狠是什么心态 | 久久综合色之久久综合 | 欧美亚洲日韩国产人成在线播放 | 麻豆果冻传媒2021精品传媒一区下载 | 99久久人妻精品免费一区 | 麻豆国产97在线 | 欧洲 | 性生交大片免费看女人按摩摩 | 高潮毛片无遮挡高清免费视频 | 精品国产麻豆免费人成网站 | 国产精品嫩草久久久久 | 娇妻被黑人粗大高潮白浆 | 97资源共享在线视频 | 国产手机在线αⅴ片无码观看 | 狠狠cao日日穞夜夜穞av | 亚洲 日韩 欧美 成人 在线观看 | 无码毛片视频一区二区本码 | 欧美人与善在线com | 激情综合激情五月俺也去 | 国产精品久免费的黄网站 | 水蜜桃av无码 | 日本丰满护士爆乳xxxx | 18禁黄网站男男禁片免费观看 | 六月丁香婷婷色狠狠久久 | 国精产品一区二区三区 | 狠狠噜狠狠狠狠丁香五月 | 亚洲精品中文字幕久久久久 | 日日鲁鲁鲁夜夜爽爽狠狠 | 精品无码国产一区二区三区av | 六月丁香婷婷色狠狠久久 | 极品嫩模高潮叫床 | 欧美阿v高清资源不卡在线播放 | 青青青手机频在线观看 | 丝袜 中出 制服 人妻 美腿 | 少妇厨房愉情理9仑片视频 | 国内精品人妻无码久久久影院 | 久久亚洲中文字幕精品一区 | 色综合久久久无码中文字幕 | 国产av一区二区三区最新精品 | 樱花草在线播放免费中文 | 国产精品-区区久久久狼 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产猛烈高潮尖叫视频免费 | 国产va免费精品观看 | 婷婷丁香五月天综合东京热 | 久久午夜无码鲁丝片午夜精品 | 亚洲伊人久久精品影院 | www国产亚洲精品久久久日本 | 日本肉体xxxx裸交 | 人妻夜夜爽天天爽三区 | 亚洲国产精品成人久久蜜臀 | 成人av无码一区二区三区 | 三级4级全黄60分钟 | 99久久精品日本一区二区免费 | 亚洲一区二区三区国产精华液 | 亚洲国产精品美女久久久久 | 国内精品人妻无码久久久影院蜜桃 | 精品欧美一区二区三区久久久 | 日本欧美一区二区三区乱码 | 丰满护士巨好爽好大乳 | 欧美性生交xxxxx久久久 | 亚洲成av人在线观看网址 | 亚洲va欧美va天堂v国产综合 | 亚洲 激情 小说 另类 欧美 | 精品国产av色一区二区深夜久久 | 日韩av无码一区二区三区不卡 | 毛片内射-百度 | 少妇高潮一区二区三区99 | 亚洲精品久久久久久一区二区 | 免费无码的av片在线观看 | 狠狠色丁香久久婷婷综合五月 | 国产在线精品一区二区高清不卡 | 日本一区二区三区免费高清 | 亚洲男人av香蕉爽爽爽爽 | 日本一本二本三区免费 | 在线观看欧美一区二区三区 | 初尝人妻少妇中文字幕 | 亚洲欧美精品aaaaaa片 | 国产色精品久久人妻 | 狂野欧美性猛交免费视频 | 国产精品无码一区二区桃花视频 | 黑人巨大精品欧美一区二区 | 性生交大片免费看l | 欧美精品免费观看二区 | 无码av中文字幕免费放 | 中文字幕日韩精品一区二区三区 | 久久国产36精品色熟妇 | 麻豆国产97在线 | 欧洲 | 亚洲成av人片天堂网无码】 | 亚洲男女内射在线播放 | 国产精品久久久午夜夜伦鲁鲁 | 国产热a欧美热a在线视频 | 三上悠亚人妻中文字幕在线 | 国产97在线 | 亚洲 | 乱人伦人妻中文字幕无码久久网 | 人妻少妇被猛烈进入中文字幕 | 欧美真人作爱免费视频 | 又紧又大又爽精品一区二区 | 玩弄人妻少妇500系列视频 | 精品国产aⅴ无码一区二区 | 2019nv天堂香蕉在线观看 | 国产精品久久久久久亚洲毛片 | 真人与拘做受免费视频 | 人妻少妇精品无码专区二区 | 亚洲乱码国产乱码精品精 | 一本大道伊人av久久综合 | 99精品无人区乱码1区2区3区 | 一本大道久久东京热无码av | 日本在线高清不卡免费播放 | 国产亚洲精品久久久ai换 | 亚洲国产精品毛片av不卡在线 | 国产精品二区一区二区aⅴ污介绍 | 丁香啪啪综合成人亚洲 | 丁香啪啪综合成人亚洲 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 久久人人爽人人爽人人片av高清 | 国产99久久精品一区二区 | 亚洲高清偷拍一区二区三区 | 日韩亚洲欧美精品综合 | 女人和拘做爰正片视频 | 国产精品久久久久无码av色戒 | 色偷偷人人澡人人爽人人模 | 亚洲中文字幕在线观看 | 天堂а√在线地址中文在线 | 欧美亚洲日韩国产人成在线播放 | 俄罗斯老熟妇色xxxx | 国产艳妇av在线观看果冻传媒 | 国产成人精品三级麻豆 | 欧美熟妇另类久久久久久不卡 | 中文字幕av伊人av无码av | 成人一在线视频日韩国产 | 久久久亚洲欧洲日产国码αv | 亚洲精品www久久久 | 好爽又高潮了毛片免费下载 | 亚洲欧美国产精品久久 | 女高中生第一次破苞av | 国产一区二区三区日韩精品 | 久久精品一区二区三区四区 | 免费播放一区二区三区 | 久久久精品国产sm最大网站 | 啦啦啦www在线观看免费视频 | 久久综合给久久狠狠97色 | 亚洲の无码国产の无码影院 | 亚洲爆乳精品无码一区二区三区 | 国产精品成人av在线观看 | 亚洲成av人片在线观看无码不卡 | 少妇无码一区二区二三区 | 日韩av无码中文无码电影 | 亚洲七七久久桃花影院 | 精品水蜜桃久久久久久久 | 色综合久久88色综合天天 | 乱人伦人妻中文字幕无码 | 欧美性色19p | 中文字幕av日韩精品一区二区 | 国产97色在线 | 免 | 久久亚洲日韩精品一区二区三区 | 大地资源中文第3页 | 国产成人无码区免费内射一片色欲 | 中文字幕av日韩精品一区二区 | 97久久国产亚洲精品超碰热 | 欧美丰满熟妇xxxx性ppx人交 | 日韩欧美中文字幕在线三区 | 亚洲人成网站在线播放942 | 人妻夜夜爽天天爽三区 | 99精品视频在线观看免费 | 中文字幕亚洲情99在线 | 亚洲无人区午夜福利码高清完整版 | 精品久久久无码人妻字幂 | 国产美女精品一区二区三区 | 中文精品无码中文字幕无码专区 | 国产亚洲精品久久久久久国模美 | 亚洲日本在线电影 | 国产人妻人伦精品1国产丝袜 | 国产69精品久久久久app下载 | 国产极品美女高潮无套在线观看 | 国产精品亚洲五月天高清 | 精品久久久无码中文字幕 | 成在人线av无码免观看麻豆 | 成熟妇人a片免费看网站 | 国产两女互慰高潮视频在线观看 | 无码人妻精品一区二区三区不卡 | 国内精品人妻无码久久久影院 | 国产精品毛片一区二区 | 夜夜躁日日躁狠狠久久av | 狠狠cao日日穞夜夜穞av | 成人免费视频在线观看 | 精品人妻中文字幕有码在线 | 亚洲色欲色欲欲www在线 | 又粗又大又硬毛片免费看 | 无套内射视频囯产 | 3d动漫精品啪啪一区二区中 | 麻豆国产人妻欲求不满 | 一本色道婷婷久久欧美 | 国产精品久久久久久亚洲毛片 | 国产成人无码av片在线观看不卡 | 55夜色66夜色国产精品视频 | 疯狂三人交性欧美 | 久久综合网欧美色妞网 | 一本久道久久综合婷婷五月 | 奇米影视888欧美在线观看 | 青青久在线视频免费观看 | 日韩 欧美 动漫 国产 制服 | 欧美老熟妇乱xxxxx | 国产精品怡红院永久免费 | 99久久人妻精品免费一区 | 日韩人妻无码中文字幕视频 | 亚洲精品无码国产 | 黑人粗大猛烈进出高潮视频 | 18无码粉嫩小泬无套在线观看 | 精品亚洲成av人在线观看 | 日日天日日夜日日摸 | 欧美激情综合亚洲一二区 | 欧美三级不卡在线观看 | 国产偷国产偷精品高清尤物 | 日产精品99久久久久久 | 少妇邻居内射在线 | 欧洲极品少妇 | 一本一道久久综合久久 | 少妇激情av一区二区 | 国产成人无码av一区二区 | 久久精品人人做人人综合 | 少妇人妻av毛片在线看 | 76少妇精品导航 | 小sao货水好多真紧h无码视频 | 国产人妻精品一区二区三区不卡 | 性欧美大战久久久久久久 | 免费播放一区二区三区 | 欧美精品国产综合久久 | 亚洲日本一区二区三区在线 | 18黄暴禁片在线观看 | 国产卡一卡二卡三 | 亚洲午夜无码久久 | 精品国产一区av天美传媒 | 秋霞成人午夜鲁丝一区二区三区 | 熟妇激情内射com | 2020最新国产自产精品 | 人人妻人人澡人人爽欧美一区九九 | 风流少妇按摩来高潮 | 男女性色大片免费网站 | 亚洲一区二区观看播放 | 久久人妻内射无码一区三区 | 一本久道高清无码视频 | 欧美日本精品一区二区三区 | 波多野结衣乳巨码无在线观看 | 思思久久99热只有频精品66 | 成年美女黄网站色大免费全看 | 东京热男人av天堂 | 国产福利视频一区二区 | 一个人免费观看的www视频 | 小鲜肉自慰网站xnxx | av无码电影一区二区三区 | 中文字幕无码av波多野吉衣 | 日日噜噜噜噜夜夜爽亚洲精品 | 一本大道久久东京热无码av | 娇妻被黑人粗大高潮白浆 | 国产三级精品三级男人的天堂 | 久久99精品国产麻豆 | 亚洲中文字幕va福利 | 欧美野外疯狂做受xxxx高潮 | 国产欧美熟妇另类久久久 | 狠狠色噜噜狠狠狠狠7777米奇 | 中文无码成人免费视频在线观看 | 正在播放东北夫妻内射 | 美女极度色诱视频国产 | 久久亚洲中文字幕无码 | 欧美变态另类xxxx | 无码吃奶揉捏奶头高潮视频 | 人妻尝试又大又粗久久 | 人人妻人人澡人人爽人人精品 | 精品无码一区二区三区爱欲 | 人妻少妇精品无码专区动漫 | 粉嫩少妇内射浓精videos | 国产激情无码一区二区app | 无码国模国产在线观看 | 久久精品女人天堂av免费观看 | 成年女人永久免费看片 | 欧美freesex黑人又粗又大 | 久久国产精品_国产精品 | 免费观看的无遮挡av | 鲁一鲁av2019在线 | 精品国产aⅴ无码一区二区 | 蜜桃臀无码内射一区二区三区 | 在线播放亚洲第一字幕 | 亚洲伊人久久精品影院 | 精品成人av一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 人人妻人人澡人人爽精品欧美 | 国产精品亚洲五月天高清 | 久久无码人妻影院 | 久久久精品成人免费观看 | 国产精品va在线观看无码 | 国产精品久久福利网站 | 国产人成高清在线视频99最全资源 | 亚洲成a人片在线观看日本 | 国产内射老熟女aaaa | 亚洲精品一区三区三区在线观看 | 亚洲熟女一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 乱人伦中文视频在线观看 | 黑人玩弄人妻中文在线 | 大乳丰满人妻中文字幕日本 | 成人无码视频免费播放 | 一个人看的视频www在线 | 国产午夜无码视频在线观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 中文字幕无码日韩专区 | 又大又黄又粗又爽的免费视频 | 国产激情综合五月久久 | 对白脏话肉麻粗话av | 亚洲精品无码人妻无码 | 图片小说视频一区二区 | 国产成人一区二区三区在线观看 | 国产亚洲欧美在线专区 | 欧美乱妇无乱码大黄a片 | 十八禁真人啪啪免费网站 | 波多野结衣高清一区二区三区 | 少妇人妻偷人精品无码视频 | 久久精品国产大片免费观看 | 人人妻人人澡人人爽人人精品 | 国产精品无套呻吟在线 | 亚洲中文字幕无码中字 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 久久99精品久久久久久 | 99er热精品视频 | 1000部夫妻午夜免费 | 蜜桃臀无码内射一区二区三区 | 色综合视频一区二区三区 | 日本一卡二卡不卡视频查询 | 欧美兽交xxxx×视频 | 综合网日日天干夜夜久久 | 无人区乱码一区二区三区 | 欧美35页视频在线观看 | 狠狠噜狠狠狠狠丁香五月 | 东京一本一道一二三区 | 精品夜夜澡人妻无码av蜜桃 | 国产亚洲精品久久久久久国模美 | 欧美熟妇另类久久久久久多毛 | 亚洲小说春色综合另类 | av无码久久久久不卡免费网站 | 美女张开腿让人桶 | 亚洲天堂2017无码中文 | 熟女少妇人妻中文字幕 | 日本精品人妻无码免费大全 | 精品久久久久久亚洲精品 | 搡女人真爽免费视频大全 | 国产婷婷色一区二区三区在线 | 丝袜美腿亚洲一区二区 | 久久精品女人的天堂av | 亚洲日韩乱码中文无码蜜桃臀网站 | 日韩人妻系列无码专区 | 久久视频在线观看精品 | 麻豆成人精品国产免费 | 国产精品二区一区二区aⅴ污介绍 | 十八禁视频网站在线观看 | 男女猛烈xx00免费视频试看 | 久久久久久久人妻无码中文字幕爆 | 久久亚洲日韩精品一区二区三区 | 人人澡人人透人人爽 | 国产无遮挡又黄又爽又色 | 亚洲高清偷拍一区二区三区 | 中文字幕无码av激情不卡 | 97久久精品无码一区二区 | 国内精品人妻无码久久久影院蜜桃 | 亚洲欧美日韩国产精品一区二区 | 久久亚洲精品成人无码 | 人妻有码中文字幕在线 | 日韩人妻少妇一区二区三区 | 精品国产aⅴ无码一区二区 | 色婷婷香蕉在线一区二区 | 日韩精品一区二区av在线 | 狠狠色丁香久久婷婷综合五月 | 国产精品高潮呻吟av久久 | 久久人妻内射无码一区三区 | 国产精品美女久久久久av爽李琼 | 天海翼激烈高潮到腰振不止 | 亚洲伊人久久精品影院 | 双乳奶水饱满少妇呻吟 | 精品 日韩 国产 欧美 视频 | 国产一区二区不卡老阿姨 | 日韩精品乱码av一区二区 | 夜精品a片一区二区三区无码白浆 | 午夜成人1000部免费视频 | 亚洲爆乳精品无码一区二区三区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 中文字幕无码av波多野吉衣 | 久久国产劲爆∧v内射 | 精品无码国产一区二区三区av | 久久午夜无码鲁丝片 | 国产偷自视频区视频 | 风流少妇按摩来高潮 | 亚洲熟妇自偷自拍另类 | www一区二区www免费 | 欧美成人午夜精品久久久 | 4hu四虎永久在线观看 | 国产真实夫妇视频 | 少妇一晚三次一区二区三区 | 亚洲の无码国产の无码影院 | 免费人成网站视频在线观看 | 性欧美大战久久久久久久 | 一区二区三区高清视频一 | 亚拍精品一区二区三区探花 | 少妇性l交大片欧洲热妇乱xxx | 日本精品人妻无码免费大全 | 久精品国产欧美亚洲色aⅴ大片 | 秋霞特色aa大片 | 鲁一鲁av2019在线 | 免费乱码人妻系列无码专区 | 2020最新国产自产精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲成av人在线观看网址 | 免费国产成人高清在线观看网站 | 亚洲国产精品久久人人爱 | 日日麻批免费40分钟无码 | 中国女人内谢69xxxx | 久久99精品国产麻豆 | 我要看www免费看插插视频 | 丝袜足控一区二区三区 | 亚无码乱人伦一区二区 | 国产色精品久久人妻 | 无码av最新清无码专区吞精 | 亚洲国产精品久久久久久 | 无码乱肉视频免费大全合集 | 18禁止看的免费污网站 | 欧美xxxx黑人又粗又长 | 伊人久久大香线焦av综合影院 | 欧美日本免费一区二区三区 | 国产午夜手机精彩视频 | 久久久久亚洲精品男人的天堂 | 天天摸天天碰天天添 | 亚洲色在线无码国产精品不卡 | 娇妻被黑人粗大高潮白浆 | 日日天日日夜日日摸 | 国产精品理论片在线观看 | 丰腴饱满的极品熟妇 | 亚洲一区二区三区在线观看网站 | 男女超爽视频免费播放 | 久久久久久久女国产乱让韩 | 亚洲自偷精品视频自拍 | 久久午夜无码鲁丝片 | 亚洲成av人综合在线观看 | 成人欧美一区二区三区 | 久久aⅴ免费观看 | 国产sm调教视频在线观看 | 亚洲中文字幕久久无码 | 伊人久久大香线蕉av一区二区 | 18精品久久久无码午夜福利 | 好男人www社区 | 国产精品人人妻人人爽 | 少妇性l交大片欧洲热妇乱xxx | 少妇无码一区二区二三区 | 国产精品igao视频网 | 天天摸天天碰天天添 | 中文字幕无码免费久久99 | 人人妻在人人 | 久久久久久九九精品久 | 日本熟妇乱子伦xxxx | 亚洲成a人一区二区三区 | 99久久人妻精品免费一区 | 老熟妇乱子伦牲交视频 | 天天爽夜夜爽夜夜爽 | 久久精品一区二区三区四区 | 清纯唯美经典一区二区 | 日韩无套无码精品 | 亚洲自偷自拍另类第1页 | 亚洲精品一区三区三区在线观看 | 精品国产乱码久久久久乱码 | 亚洲成av人综合在线观看 | 国内精品一区二区三区不卡 | 秋霞成人午夜鲁丝一区二区三区 | 国产做国产爱免费视频 | 亚洲成色www久久网站 | 高清不卡一区二区三区 | 亚洲成av人影院在线观看 | 国产一区二区不卡老阿姨 | 精品国产成人一区二区三区 | 牲交欧美兽交欧美 | 亚洲综合精品香蕉久久网 | 欧美精品无码一区二区三区 | 国产高清av在线播放 | 成人一在线视频日韩国产 | 精品无码成人片一区二区98 | 全球成人中文在线 | 亚洲熟女一区二区三区 | 88国产精品欧美一区二区三区 | 国产一区二区三区影院 | www成人国产高清内射 | 学生妹亚洲一区二区 | 国产乡下妇女做爰 | 最近中文2019字幕第二页 | 丝袜足控一区二区三区 | 国产亚洲精品久久久久久国模美 | 狂野欧美性猛交免费视频 | 东京一本一道一二三区 | 一二三四社区在线中文视频 | 无码人妻av免费一区二区三区 | 窝窝午夜理论片影院 | 内射巨臀欧美在线视频 | 久久无码专区国产精品s | 日韩av无码一区二区三区不卡 | 日日摸天天摸爽爽狠狠97 | 荫蒂被男人添的好舒服爽免费视频 | 无码播放一区二区三区 | 国产一区二区三区精品视频 | 妺妺窝人体色www婷婷 | 国产精品无码一区二区三区不卡 | 国产午夜福利亚洲第一 | 在线播放免费人成毛片乱码 | 久久午夜无码鲁丝片秋霞 | 又紧又大又爽精品一区二区 | 久久国产自偷自偷免费一区调 | 亚洲综合另类小说色区 | 精品成在人线av无码免费看 | 熟妇人妻无码xxx视频 | 无码人妻出轨黑人中文字幕 | 日日碰狠狠丁香久燥 | 人人澡人摸人人添 | 亚洲精品成人av在线 | 成人亚洲精品久久久久 | 性欧美大战久久久久久久 | 嫩b人妻精品一区二区三区 | √天堂资源地址中文在线 | 国产亚洲视频中文字幕97精品 | 国产乱人伦av在线无码 | 国产无遮挡吃胸膜奶免费看 | 荫蒂被男人添的好舒服爽免费视频 | 一本久久伊人热热精品中文字幕 | 人人妻人人澡人人爽人人精品 | 99久久久无码国产精品免费 | 内射巨臀欧美在线视频 | 成人性做爰aaa片免费看不忠 | 亚洲成色在线综合网站 | 少妇激情av一区二区 | 日韩 欧美 动漫 国产 制服 | 欧美大屁股xxxxhd黑色 | 国产精品亚洲五月天高清 | 少妇久久久久久人妻无码 | 亚洲成av人影院在线观看 | 久久久久亚洲精品中文字幕 | 乱码av麻豆丝袜熟女系列 | 精品欧洲av无码一区二区三区 | 亚洲第一无码av无码专区 | 亚洲熟悉妇女xxx妇女av | 亚洲一区二区观看播放 | 亚洲精品一区三区三区在线观看 | 成人精品视频一区二区三区尤物 | 国产精品美女久久久久av爽李琼 | 最近的中文字幕在线看视频 | 日韩欧美成人免费观看 | 日日干夜夜干 | www一区二区www免费 | 国产精品a成v人在线播放 | 国产麻豆精品一区二区三区v视界 | 亚洲精品久久久久avwww潮水 | 色偷偷人人澡人人爽人人模 | 亚洲毛片av日韩av无码 | 色噜噜亚洲男人的天堂 | 免费无码的av片在线观看 | 人妻无码αv中文字幕久久琪琪布 | 国产熟女一区二区三区四区五区 | 99久久无码一区人妻 | 日韩视频 中文字幕 视频一区 | 欧美日本精品一区二区三区 | 国产乱码精品一品二品 | 欧美日韩亚洲国产精品 | 国产精品无码一区二区三区不卡 | 鲁大师影院在线观看 | 熟妇人妻无乱码中文字幕 | 欧美精品无码一区二区三区 | 国产69精品久久久久app下载 | 东京热无码av男人的天堂 | 乌克兰少妇xxxx做受 | 天天做天天爱天天爽综合网 | 欧洲极品少妇 | 成在人线av无码免观看麻豆 | 欧美精品无码一区二区三区 | 欧美成人午夜精品久久久 | 色老头在线一区二区三区 | 人人妻人人澡人人爽欧美精品 | 无码av最新清无码专区吞精 | 水蜜桃亚洲一二三四在线 | 在线а√天堂中文官网 | 亚洲欧美色中文字幕在线 | 中文无码精品a∨在线观看不卡 | 国产农村乱对白刺激视频 | 欧美喷潮久久久xxxxx | 成人性做爰aaa片免费看 | 日韩成人一区二区三区在线观看 | 亚洲国产欧美国产综合一区 | 亚洲精品国产第一综合99久久 | 久久久久成人片免费观看蜜芽 | 青草视频在线播放 | 久久综合九色综合欧美狠狠 | 77777熟女视频在线观看 а天堂中文在线官网 | 乱人伦中文视频在线观看 | 中文字幕人成乱码熟女app | 国产亚洲欧美日韩亚洲中文色 | 久久综合九色综合97网 | 樱花草在线社区www | 久久久久se色偷偷亚洲精品av | 亚洲欧美精品aaaaaa片 | 扒开双腿吃奶呻吟做受视频 | 最新国产麻豆aⅴ精品无码 | 亚洲熟妇色xxxxx亚洲 | 人人爽人人爽人人片av亚洲 | 久久亚洲精品中文字幕无男同 | 狠狠亚洲超碰狼人久久 | 最近免费中文字幕中文高清百度 | 久久精品中文字幕一区 | 中文字幕无线码 | 亚洲人交乣女bbw | 99久久精品午夜一区二区 | 中文字幕+乱码+中文字幕一区 | 成人无码精品一区二区三区 | 色婷婷久久一区二区三区麻豆 | 国产成人无码av片在线观看不卡 | 精品熟女少妇av免费观看 | 超碰97人人射妻 | 国产人妻人伦精品1国产丝袜 | 精品国偷自产在线 | 免费无码午夜福利片69 | 一本久道久久综合婷婷五月 | 亚洲天堂2017无码中文 | 377p欧洲日本亚洲大胆 | 好爽又高潮了毛片免费下载 | 人妻人人添人妻人人爱 | 天天拍夜夜添久久精品大 | 亚洲天堂2017无码 | 国产亚洲人成a在线v网站 | 欧美一区二区三区视频在线观看 | 丝袜人妻一区二区三区 | 天天拍夜夜添久久精品 | 无码中文字幕色专区 | 丰满人妻翻云覆雨呻吟视频 | 女人被男人爽到呻吟的视频 | 好男人www社区 | 国产成人精品三级麻豆 | 无人区乱码一区二区三区 | 初尝人妻少妇中文字幕 | 日产国产精品亚洲系列 | 精品国产一区二区三区av 性色 | 久久国产精品萌白酱免费 | 亚洲成在人网站无码天堂 | 国产高潮视频在线观看 | 亚洲大尺度无码无码专区 | 中文字幕人妻无码一夲道 | 亚洲一区二区三区播放 | 99久久精品午夜一区二区 | 久久99精品国产.久久久久 | 国产精品va在线播放 | 男女下面进入的视频免费午夜 | 久久无码中文字幕免费影院蜜桃 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲精品鲁一鲁一区二区三区 | 国产精品香蕉在线观看 | 1000部夫妻午夜免费 | 亚洲熟悉妇女xxx妇女av | 日韩欧美群交p片內射中文 | 人妻少妇精品视频专区 | 好男人社区资源 | 无码免费一区二区三区 | 欧洲熟妇精品视频 | 青春草在线视频免费观看 | 青青草原综合久久大伊人精品 | 国产av人人夜夜澡人人爽麻豆 | 免费网站看v片在线18禁无码 | 亚洲精品鲁一鲁一区二区三区 | 天干天干啦夜天干天2017 | 色婷婷久久一区二区三区麻豆 | 99re在线播放 | 女高中生第一次破苞av | 女人色极品影院 | 又黄又爽又色的视频 | 人妻少妇精品无码专区动漫 | 高清不卡一区二区三区 | 亚洲欧洲无卡二区视頻 | 中文字幕无码热在线视频 | 国产真实乱对白精彩久久 | 综合激情五月综合激情五月激情1 | 精品国精品国产自在久国产87 | 老熟女重囗味hdxx69 | 久久综合久久自在自线精品自 | 人人妻人人澡人人爽人人精品浪潮 | 久久精品成人欧美大片 | 成人精品一区二区三区中文字幕 | 国产色精品久久人妻 | 国产亚洲精品久久久久久大师 | 欧美日本免费一区二区三区 | 成人欧美一区二区三区 | 久久99精品国产麻豆 | a片在线免费观看 | 老子影院午夜精品无码 | 熟妇人妻无码xxx视频 | 国产69精品久久久久app下载 | 青春草在线视频免费观看 | 人人澡人人妻人人爽人人蜜桃 | а√资源新版在线天堂 | 国产99久久精品一区二区 | 狂野欧美性猛xxxx乱大交 | 国产亚洲tv在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 熟妇人妻无码xxx视频 | 国产午夜无码精品免费看 | 久久久久久九九精品久 | 亚洲欧美国产精品专区久久 | 美女毛片一区二区三区四区 | 牲交欧美兽交欧美 | av小次郎收藏 | 国产精品18久久久久久麻辣 | 97久久超碰中文字幕 | 色情久久久av熟女人妻网站 | 午夜福利试看120秒体验区 | 亚洲 日韩 欧美 成人 在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 欧美人与动性行为视频 | 国产区女主播在线观看 | 国产精品久久久久久亚洲影视内衣 | 小泽玛莉亚一区二区视频在线 | 精品久久久久久人妻无码中文字幕 | 精品偷拍一区二区三区在线看 | 亚洲熟女一区二区三区 | www国产亚洲精品久久网站 | 狠狠色噜噜狠狠狠7777奇米 | 无码成人精品区在线观看 | 国产熟女一区二区三区四区五区 | 国产av剧情md精品麻豆 | 久久精品国产一区二区三区 | 99er热精品视频 | 欧美怡红院免费全部视频 | 亚洲一区av无码专区在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产美女极度色诱视频www | 野狼第一精品社区 | www国产精品内射老师 | 国产日产欧产精品精品app | 精品久久久久久人妻无码中文字幕 | 99精品无人区乱码1区2区3区 | 久久综合香蕉国产蜜臀av | 久久久www成人免费毛片 | 久久精品人人做人人综合试看 | 久久精品女人的天堂av | 东京热一精品无码av | 亚洲精品国产品国语在线观看 | 亚洲综合久久一区二区 | 色狠狠av一区二区三区 | 性欧美熟妇videofreesex | 日韩人妻无码一区二区三区久久99 | 久久久国产一区二区三区 | 中文字幕无码热在线视频 | 国产精品人人爽人人做我的可爱 | 男女下面进入的视频免费午夜 | 日日碰狠狠丁香久燥 | 亚洲无人区午夜福利码高清完整版 | 澳门永久av免费网站 | 欧美性生交xxxxx久久久 | 青草视频在线播放 | 熟女体下毛毛黑森林 | 午夜福利电影 | 亚洲中文无码av永久不收费 | 日日碰狠狠丁香久燥 | 人人妻人人澡人人爽人人精品浪潮 | 日韩视频 中文字幕 视频一区 | 正在播放东北夫妻内射 | 亚洲色在线无码国产精品不卡 | 国产精品第一国产精品 | 熟妇人妻无乱码中文字幕 | 精品无码成人片一区二区98 | 成熟女人特级毛片www免费 | √天堂资源地址中文在线 | 亚洲人交乣女bbw | 中文字幕亚洲情99在线 | 久久久中文久久久无码 | 九月婷婷人人澡人人添人人爽 | 国产电影无码午夜在线播放 | 久久久久久久女国产乱让韩 | av无码久久久久不卡免费网站 | 一区二区传媒有限公司 | 久久久精品456亚洲影院 | 国产av无码专区亚洲awww | 蜜桃av抽搐高潮一区二区 | 少妇人妻偷人精品无码视频 | 久久精品丝袜高跟鞋 | 日日橹狠狠爱欧美视频 | 国产熟妇高潮叫床视频播放 | 久久久久成人精品免费播放动漫 | 亚无码乱人伦一区二区 | 免费播放一区二区三区 | 亚洲人成人无码网www国产 | 免费人成网站视频在线观看 | 成 人 网 站国产免费观看 | 国产成人人人97超碰超爽8 | 国产无套内射久久久国产 | 波多野结衣aⅴ在线 | 一个人看的www免费视频在线观看 | 成在人线av无码免费 | 欧美性猛交xxxx富婆 | 成年女人永久免费看片 | 午夜无码区在线观看 | 无码国产色欲xxxxx视频 | 国产人成高清在线视频99最全资源 | 中文字幕日韩精品一区二区三区 | 一本大道伊人av久久综合 | 国产福利视频一区二区 | 亚洲欧美精品aaaaaa片 | 国产成人综合美国十次 | 欧美丰满熟妇xxxx | www国产亚洲精品久久网站 | 十八禁视频网站在线观看 | 久久亚洲国产成人精品性色 | 亚洲色欲色欲天天天www | 成人精品一区二区三区中文字幕 | 无码一区二区三区在线 | 成人无码视频在线观看网站 | 大屁股大乳丰满人妻 | 夫妻免费无码v看片 | 麻豆国产97在线 | 欧洲 | 久精品国产欧美亚洲色aⅴ大片 | 在线精品国产一区二区三区 | 久久99精品国产麻豆蜜芽 | 中文字幕乱码亚洲无线三区 | 日韩欧美中文字幕在线三区 | 亚洲日韩av一区二区三区中文 | 九九热爱视频精品 | 大地资源中文第3页 | 人妻少妇被猛烈进入中文字幕 | 国产莉萝无码av在线播放 | 色一情一乱一伦 | 内射巨臀欧美在线视频 | 一本久道高清无码视频 | 99久久久国产精品无码免费 | 色 综合 欧美 亚洲 国产 | 色婷婷久久一区二区三区麻豆 | 老熟妇乱子伦牲交视频 | 国产在线精品一区二区高清不卡 | 一二三四社区在线中文视频 | 色综合久久久无码网中文 | 日本一本二本三区免费 | 亚洲一区二区三区香蕉 | 天堂а√在线地址中文在线 | 中文字幕精品av一区二区五区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产偷抇久久精品a片69 | 蜜桃av抽搐高潮一区二区 | a片在线免费观看 | 亚洲一区二区三区播放 | 国产精品美女久久久久av爽李琼 | av无码久久久久不卡免费网站 | 麻豆av传媒蜜桃天美传媒 | 久久zyz资源站无码中文动漫 | 大胆欧美熟妇xx | 国产激情一区二区三区 | 亚洲欧美日韩综合久久久 | 国产高清av在线播放 | 精品国产国产综合精品 | 成人片黄网站色大片免费观看 | 荫蒂添的好舒服视频囗交 | 天天拍夜夜添久久精品 | 亚洲小说图区综合在线 | 中文字幕日产无线码一区 | 东京热一精品无码av | 给我免费的视频在线观看 | 图片区 小说区 区 亚洲五月 | 国产一区二区三区影院 | 欧美日韩一区二区综合 | 国产97色在线 | 免 | 国产网红无码精品视频 | 狠狠躁日日躁夜夜躁2020 | 野外少妇愉情中文字幕 | 牲欲强的熟妇农村老妇女视频 | 国产极品视觉盛宴 | 亚洲熟妇色xxxxx欧美老妇 | 成人精品天堂一区二区三区 | 理论片87福利理论电影 | 亚洲欧美国产精品久久 | 日本一区二区三区免费播放 | 欧美老熟妇乱xxxxx | 精品人人妻人人澡人人爽人人 | 三级4级全黄60分钟 | 亚洲国产精品美女久久久久 | 精品偷拍一区二区三区在线看 | 国产精品对白交换视频 | 十八禁视频网站在线观看 | 99re在线播放 | 久久亚洲中文字幕精品一区 | 青春草在线视频免费观看 | 蜜桃视频韩日免费播放 | 97人妻精品一区二区三区 | 日本熟妇大屁股人妻 | 装睡被陌生人摸出水好爽 | 色欲av亚洲一区无码少妇 | 最近中文2019字幕第二页 | 水蜜桃色314在线观看 | 爆乳一区二区三区无码 | 亚洲成a人片在线观看无码3d | 天干天干啦夜天干天2017 | 国产综合在线观看 | 久久国内精品自在自线 | 亚洲性无码av中文字幕 | 中文字幕无码乱人伦 | 亚洲色无码一区二区三区 | 亚洲精品久久久久久久久久久 | 中文字幕人妻丝袜二区 | 国产综合久久久久鬼色 | 亚拍精品一区二区三区探花 | 国产激情精品一区二区三区 | 又大又硬又黄的免费视频 | 久久久精品人妻久久影视 | 久久亚洲中文字幕精品一区 | 欧美猛少妇色xxxxx | 高潮毛片无遮挡高清免费 | 国产成人精品一区二区在线小狼 | 女人被爽到呻吟gif动态图视看 | 小泽玛莉亚一区二区视频在线 | 欧美性生交活xxxxxdddd | 国产精品a成v人在线播放 | 免费无码肉片在线观看 | 日韩少妇内射免费播放 | av人摸人人人澡人人超碰下载 | 色婷婷久久一区二区三区麻豆 | 国产香蕉尹人视频在线 | av无码久久久久不卡免费网站 | 欧美高清在线精品一区 | 人妻少妇被猛烈进入中文字幕 | 久久99久久99精品中文字幕 | 未满小14洗澡无码视频网站 | 亚洲啪av永久无码精品放毛片 | 国产精品亚洲综合色区韩国 | 免费无码的av片在线观看 | 偷窥日本少妇撒尿chinese | 精品久久久久久人妻无码中文字幕 | 狠狠色欧美亚洲狠狠色www | 国产猛烈高潮尖叫视频免费 | 国产极品视觉盛宴 | 日韩精品无码一本二本三本色 | 熟女少妇在线视频播放 | 成年美女黄网站色大免费全看 | 亚洲熟妇色xxxxx欧美老妇y | 老司机亚洲精品影院 | a在线观看免费网站大全 | 性做久久久久久久免费看 | 日本大香伊一区二区三区 | 亚洲娇小与黑人巨大交 | 亚洲精品一区二区三区大桥未久 | 国产精品99爱免费视频 | 99视频精品全部免费免费观看 | 在线播放免费人成毛片乱码 | 亚洲另类伦春色综合小说 | 少妇高潮喷潮久久久影院 | 亚洲成a人片在线观看无码 | 久久精品国产亚洲精品 | 欧美 日韩 亚洲 在线 | 国产两女互慰高潮视频在线观看 | 大屁股大乳丰满人妻 | 国产深夜福利视频在线 | 久久精品中文字幕一区 | 国产后入清纯学生妹 | 精品久久久中文字幕人妻 | 特黄特色大片免费播放器图片 | 亚洲狠狠色丁香婷婷综合 | 中文久久乱码一区二区 | 久久精品国产大片免费观看 | 在线 国产 欧美 亚洲 天堂 | 日本饥渴人妻欲求不满 | 日本熟妇乱子伦xxxx | 久久久亚洲欧洲日产国码αv | 国产精品99久久精品爆乳 | 精品欧洲av无码一区二区三区 | 日韩少妇内射免费播放 | 亚洲午夜无码久久 | 1000部啪啪未满十八勿入下载 | 亚洲熟妇色xxxxx欧美老妇y | 麻花豆传媒剧国产免费mv在线 | 亚洲乱亚洲乱妇50p | 国产亚洲精品久久久久久大师 | 亚洲中文字幕成人无码 | 久久久久人妻一区精品色欧美 | 欧美日韩一区二区综合 | 97夜夜澡人人双人人人喊 | 国内综合精品午夜久久资源 | 亚洲理论电影在线观看 | 欧美日韩一区二区免费视频 | 思思久久99热只有频精品66 | 久久亚洲中文字幕精品一区 | 免费无码肉片在线观看 | 青春草在线视频免费观看 | 欧美日韩色另类综合 | 亚洲精品国产精品乱码视色 | 青草视频在线播放 | 国产香蕉尹人综合在线观看 | 国产肉丝袜在线观看 | 久久久久久a亚洲欧洲av冫 | 国产午夜手机精彩视频 | 亚洲精品www久久久 | 国产乱人无码伦av在线a | 国产亚洲欧美日韩亚洲中文色 | 成人三级无码视频在线观看 | 欧美一区二区三区视频在线观看 | 夜夜高潮次次欢爽av女 | 中文字幕+乱码+中文字幕一区 | 亚洲经典千人经典日产 | av无码不卡在线观看免费 | 美女极度色诱视频国产 | 伊人色综合久久天天小片 | 国产熟女一区二区三区四区五区 | 熟女俱乐部五十路六十路av | 国产偷国产偷精品高清尤物 | 国产在线aaa片一区二区99 | 牲欲强的熟妇农村老妇女 | 在线精品亚洲一区二区 | 久久国产精品精品国产色婷婷 | 国产一区二区不卡老阿姨 | 熟妇女人妻丰满少妇中文字幕 | 白嫩日本少妇做爰 | 蜜桃无码一区二区三区 | 美女极度色诱视频国产 | 2019nv天堂香蕉在线观看 | 少妇人妻大乳在线视频 | 久久久精品欧美一区二区免费 | 又紧又大又爽精品一区二区 | 久久国产精品_国产精品 | 精品夜夜澡人妻无码av蜜桃 | 免费看男女做好爽好硬视频 | 国产熟妇高潮叫床视频播放 | 亚洲乱码国产乱码精品精 | 在线看片无码永久免费视频 | 亚洲精品成a人在线观看 | 亚洲国产成人a精品不卡在线 | 成人免费视频视频在线观看 免费 | 激情人妻另类人妻伦 | 97人妻精品一区二区三区 | 亚洲国产高清在线观看视频 | 性史性农村dvd毛片 | 在线观看免费人成视频 | 国产精品无套呻吟在线 | 日韩av无码中文无码电影 | 人妻无码久久精品人妻 | 国产精品久久国产三级国 | 1000部啪啪未满十八勿入下载 | 夜夜高潮次次欢爽av女 | 国产美女精品一区二区三区 | 黑人巨大精品欧美一区二区 | 永久免费观看国产裸体美女 | 亚洲男女内射在线播放 | 免费看少妇作爱视频 | ass日本丰满熟妇pics | 亚洲小说图区综合在线 | 国产精品久久久久影院嫩草 | 免费人成在线视频无码 | 天堂无码人妻精品一区二区三区 | 免费无码一区二区三区蜜桃大 | 无码帝国www无码专区色综合 | 欧洲熟妇色 欧美 | 久久精品一区二区三区四区 | 国产亚洲日韩欧美另类第八页 | 在线精品亚洲一区二区 | 欧美日韩一区二区免费视频 | 黄网在线观看免费网站 | 日韩在线不卡免费视频一区 | 成人女人看片免费视频放人 | 国产福利视频一区二区 | 国产内射爽爽大片视频社区在线 | 国产成人无码一二三区视频 | 无码福利日韩神码福利片 | 人妻少妇精品视频专区 | 成人三级无码视频在线观看 | 少妇性俱乐部纵欲狂欢电影 | 日本xxxx色视频在线观看免费 | 亚洲日本va午夜在线电影 | 亚洲a无码综合a国产av中文 | 成人亚洲精品久久久久 | 国产九九九九九九九a片 | 玩弄中年熟妇正在播放 | 色婷婷综合中文久久一本 | 国产精品18久久久久久麻辣 | 乱人伦人妻中文字幕无码久久网 | 国产乱人无码伦av在线a | 成人毛片一区二区 | 日本精品人妻无码77777 天堂一区人妻无码 | 无码人妻出轨黑人中文字幕 | 午夜时刻免费入口 | 亚洲色欲色欲欲www在线 | 麻豆蜜桃av蜜臀av色欲av | 婷婷综合久久中文字幕蜜桃三电影 | 国语自产偷拍精品视频偷 | 正在播放老肥熟妇露脸 | 婷婷色婷婷开心五月四房播播 | 老熟妇乱子伦牲交视频 | 国产精品va在线观看无码 | 久久久无码中文字幕久... | 久久久久久av无码免费看大片 | 好男人社区资源 | 婷婷六月久久综合丁香 | 国产美女精品一区二区三区 | 三级4级全黄60分钟 | 在线精品国产一区二区三区 | 日韩精品无码一本二本三本色 | 免费乱码人妻系列无码专区 | 男女猛烈xx00免费视频试看 | 丰满护士巨好爽好大乳 | 国产免费久久精品国产传媒 | 亚洲成a人一区二区三区 | 欧美成人高清在线播放 | 欧美高清在线精品一区 | 狂野欧美性猛xxxx乱大交 | 亚洲熟女一区二区三区 | 成人免费视频视频在线观看 免费 | 亚洲一区二区三区含羞草 | 一个人看的视频www在线 | 欧美乱妇无乱码大黄a片 | 亚洲中文字幕久久无码 | 精品日本一区二区三区在线观看 | 国产精品美女久久久久av爽李琼 | 亚洲a无码综合a国产av中文 | 人妻人人添人妻人人爱 | 欧美三级a做爰在线观看 | 成人毛片一区二区 | 久久99精品国产麻豆蜜芽 | 中文精品久久久久人妻不卡 | 日韩欧美成人免费观看 | 成在人线av无码免费 | 日韩精品久久久肉伦网站 | 麻豆蜜桃av蜜臀av色欲av | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美精品在线观看 | 少妇高潮一区二区三区99 | 亚洲色欲久久久综合网东京热 | 水蜜桃色314在线观看 | 久久久精品欧美一区二区免费 | 东京一本一道一二三区 | 永久免费观看国产裸体美女 | 精品国偷自产在线 | 午夜精品久久久久久久 | 国产成人综合在线女婷五月99播放 | 色综合久久88色综合天天 | 少妇性l交大片欧洲热妇乱xxx | 亚洲乱码中文字幕在线 | 成熟人妻av无码专区 | 1000部夫妻午夜免费 | 奇米影视888欧美在线观看 | 乱人伦中文视频在线观看 | 国产黑色丝袜在线播放 | 国产免费无码一区二区视频 | 亚洲精品综合五月久久小说 | 少妇厨房愉情理9仑片视频 | 亚洲国产综合无码一区 | 国产猛烈高潮尖叫视频免费 | 国产精品高潮呻吟av久久 | 少妇邻居内射在线 | 成人亚洲精品久久久久 | 熟妇人妻激情偷爽文 | 又色又爽又黄的美女裸体网站 | 天天综合网天天综合色 | 久久精品人人做人人综合试看 | 性色av无码免费一区二区三区 | 国内精品人妻无码久久久影院 | 97夜夜澡人人双人人人喊 | 久久久国产精品无码免费专区 | 又紧又大又爽精品一区二区 | 久久久精品国产sm最大网站 | 亚洲精品国产精品乱码视色 | 丰满岳乱妇在线观看中字无码 | 亚洲狠狠色丁香婷婷综合 | 亲嘴扒胸摸屁股激烈网站 | 国产免费观看黄av片 | 未满小14洗澡无码视频网站 | 狠狠噜狠狠狠狠丁香五月 | 亚洲精品鲁一鲁一区二区三区 | 中文字幕无码免费久久99 | 久久精品中文字幕大胸 | 亚洲国产av美女网站 | 88国产精品欧美一区二区三区 | 亚洲热妇无码av在线播放 | 天天躁日日躁狠狠躁免费麻豆 | 无码人妻丰满熟妇区毛片18 | 一本久道高清无码视频 | 亚洲中文字幕av在天堂 | 欧美高清在线精品一区 | 一区二区传媒有限公司 | 亚洲中文字幕无码中字 | 亚洲国产av精品一区二区蜜芽 | 成人欧美一区二区三区黑人免费 | 国产精品人妻一区二区三区四 | 婷婷色婷婷开心五月四房播播 | 激情内射亚州一区二区三区爱妻 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 四虎永久在线精品免费网址 | 少妇人妻偷人精品无码视频 | 97久久超碰中文字幕 | 亚洲の无码国产の无码步美 | 精品熟女少妇av免费观看 | 青草青草久热国产精品 | 精品欧洲av无码一区二区三区 | 亚洲中文字幕av在天堂 | 国产精品久久久午夜夜伦鲁鲁 | 高清无码午夜福利视频 | 任你躁在线精品免费 | 男人和女人高潮免费网站 | 精品 日韩 国产 欧美 视频 | 精品一区二区三区无码免费视频 | 日本护士毛茸茸高潮 | 日日摸日日碰夜夜爽av | 欧美日韩一区二区免费视频 | 少妇性俱乐部纵欲狂欢电影 | 无套内谢的新婚少妇国语播放 | 国产三级精品三级男人的天堂 | 日韩人妻无码中文字幕视频 | 老熟妇仑乱视频一区二区 | 成 人 免费观看网站 | 日本精品少妇一区二区三区 | 久久视频在线观看精品 | 午夜无码人妻av大片色欲 | 老头边吃奶边弄进去呻吟 | 在线亚洲高清揄拍自拍一品区 | 久久人人97超碰a片精品 | 久久久中文字幕日本无吗 | 九月婷婷人人澡人人添人人爽 | 人人妻人人澡人人爽人人精品 | 国产精品久久久久久无码 | 乱人伦中文视频在线观看 | 亚洲综合伊人久久大杳蕉 | 日韩无套无码精品 | 精品夜夜澡人妻无码av蜜桃 | 水蜜桃色314在线观看 | 日本爽爽爽爽爽爽在线观看免 | 老司机亚洲精品影院无码 | 99久久久无码国产aaa精品 | 国产69精品久久久久app下载 | 成人性做爰aaa片免费看不忠 | 亚洲成av人综合在线观看 | 亚洲一区二区三区含羞草 | 色婷婷综合激情综在线播放 | 亚洲精品一区三区三区在线观看 | 麻豆国产丝袜白领秘书在线观看 | 国内少妇偷人精品视频免费 | 性欧美大战久久久久久久 | 无码人妻丰满熟妇区五十路百度 | 丰满肥臀大屁股熟妇激情视频 | 天堂无码人妻精品一区二区三区 | 无遮挡国产高潮视频免费观看 | 成人无码精品1区2区3区免费看 | 最新版天堂资源中文官网 | 色情久久久av熟女人妻网站 | 99久久亚洲精品无码毛片 | 日韩欧美群交p片內射中文 | 欧美激情综合亚洲一二区 | 国产 浪潮av性色四虎 | 亚洲综合精品香蕉久久网 | 中文字幕av日韩精品一区二区 | 东京无码熟妇人妻av在线网址 | 国产精品第一国产精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲男女内射在线播放 | 久久久久亚洲精品中文字幕 | 国产精品亚洲五月天高清 | 男女猛烈xx00免费视频试看 | 国产午夜无码精品免费看 | 亚洲欧美日韩成人高清在线一区 | 国产在热线精品视频 | 国产精品久久精品三级 | 日韩视频 中文字幕 视频一区 | 人妻少妇精品无码专区二区 | 日本免费一区二区三区最新 | 性欧美牲交在线视频 | 成人综合网亚洲伊人 | 亚洲第一网站男人都懂 | 国产精品手机免费 | 欧美丰满老熟妇xxxxx性 | 国产精品嫩草久久久久 | 国产麻豆精品一区二区三区v视界 | 久久99精品国产.久久久久 | 熟女少妇在线视频播放 | 久久人人爽人人爽人人片av高清 | 欧美激情内射喷水高潮 | 香港三级日本三级妇三级 | 国产性生交xxxxx无码 | 日本爽爽爽爽爽爽在线观看免 | 蜜桃臀无码内射一区二区三区 | 美女张开腿让人桶 | 成人精品天堂一区二区三区 | 亚洲成a人片在线观看日本 | 两性色午夜免费视频 | 任你躁国产自任一区二区三区 | 亚洲自偷自偷在线制服 | 男女下面进入的视频免费午夜 | 曰本女人与公拘交酡免费视频 | 国产在线无码精品电影网 | 午夜福利一区二区三区在线观看 | 国产美女极度色诱视频www | 亚洲综合伊人久久大杳蕉 | 日本大乳高潮视频在线观看 | 亚洲性无码av中文字幕 | 国产精品a成v人在线播放 | 国产69精品久久久久app下载 | 波多野结衣 黑人 | 亚洲午夜久久久影院 | 性生交片免费无码看人 | 两性色午夜免费视频 | 草草网站影院白丝内射 | 天下第一社区视频www日本 | 丰满少妇弄高潮了www | 日本一区二区三区免费高清 | 国产精品欧美成人 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲日韩av一区二区三区四区 | 中文字幕乱妇无码av在线 | 国产精品久久久一区二区三区 | 在线播放亚洲第一字幕 | 日韩精品无码免费一区二区三区 | 精品无码成人片一区二区98 | 成熟妇人a片免费看网站 | 又粗又大又硬又长又爽 | 国产激情无码一区二区 | 中文字幕+乱码+中文字幕一区 | 国产麻豆精品精东影业av网站 | 免费乱码人妻系列无码专区 | а√天堂www在线天堂小说 | 久久国产精品偷任你爽任你 | 国产无av码在线观看 | 亚洲综合色区中文字幕 | 99久久精品午夜一区二区 | 久久久亚洲欧洲日产国码αv | 1000部啪啪未满十八勿入下载 | 国产精品久久久av久久久 | 无码福利日韩神码福利片 |