不同時間的 API 架構(gòu)風格,圖源:Rob Crowley

今天,許多 API 的使用者將 REST 稱作“消亡的 REST”(REST in peace),并且為 GraphQL 感到歡欣鼓舞。而十年前,又完全是另一幅光景:REST 是替代 SOAP 的贏家。這些觀點的問題在于,它們的出發(fā)點只是為某種技術背書,而不是去考慮它實際的屬性和特性如何與當前的需求相匹配。

四種 API 架構(gòu)風格

1.RPC:調(diào)用另一個系統(tǒng)的函數(shù)

遠程過程調(diào)用是一種允許在不同上下文中遠程執(zhí)行函數(shù)的規(guī)范。RPC 擴展了本地過程調(diào)用的概念,并將其放在 HTTP API 的上下文中。

最初的 XML-RPC 是存在問題的,因為很難確保 XML 有效負載的數(shù)據(jù)類型。因此,后來 RPC API 開始使用一個更具體的 JSON-RPC 規(guī)范,該規(guī)范被認為是 SOAP 的更簡單的替代方案。gRPC 是 Google 在 2015 年開發(fā)的最新 RPC 版本。gRPC 可插拔支持負載均衡、追蹤、運行狀況檢查和身份驗證,它非常適合連接不同的微服務。

RPC 的工作機制

客戶端調(diào)用一個遠程的過程,將參數(shù)和附加信息序列化為消息,然后將消息發(fā)送到服務端。服務端在接受到消息后,將信息的內(nèi)容反序列化,執(zhí)行所請求的操作,然后將結(jié)果發(fā)送回客戶端。客戶端和服務端各自負責參數(shù)的序列化和反序列化。

遠程過程調(diào)用的機制,圖源:Guru99

RPC 的優(yōu)勢

簡單直接的交互。RPC 使用 GET 來獲取信息,使用 POST 來處理其他所有操作。服務端和客戶端之間交互的機制歸結(jié)為調(diào)用端點并獲得響應。

易于添加新函數(shù)。 如果 API 有了新的需求,我們可以輕松地添加另一個執(zhí)行這個需求的端點:1)編寫一個新函數(shù),并將其放在一個新端點之后;2)現(xiàn)在,客戶可以訪問這個端點,并獲取符合其需求的信息。

高性能。輕量級的有效負載不會對網(wǎng)絡產(chǎn)生壓力,以此提供高性能,這對于共享服務器和在工作站網(wǎng)絡上執(zhí)行并行計算非常重要。RPC 還能夠優(yōu)化網(wǎng)絡層,使得不同服務之間每天發(fā)送海量消息變得非常高效。

RPC 的不足

和底層系統(tǒng)緊密耦合。API 的抽象級別有助于其可重用性。API 與基礎系統(tǒng)的耦合越緊密,對其他系統(tǒng)的可重用性就越差。RPC 與基礎系統(tǒng)的緊密耦合不允許其在系統(tǒng)函數(shù)和外部 API 之間建立抽象層。這很容易引起安全問題,因為關于基礎系統(tǒng)的細節(jié)實現(xiàn)很容易會泄漏到 API 中。

RPC 的緊密耦合使得可伸縮性要求和松散耦合的團隊難以實現(xiàn)。因此,客戶端要么會擔心調(diào)用特定端點的帶來的任何可能的副作用,要么需要嘗試弄清楚要調(diào)用的端點,因為客戶端不了解服務器如何命名其函數(shù)。

可發(fā)現(xiàn)性低。 在 RPC 中,無法對 API 進行檢驗總結(jié),或者發(fā)送請求來開始理解根據(jù)需求應該調(diào)用哪個函數(shù)。

函數(shù)爆炸性增長。創(chuàng)建新函數(shù)非常容易。因此,相較于重新編輯現(xiàn)有的函數(shù),我們會傾向于創(chuàng)建新的功能,最終產(chǎn)生大量難以理解的、功能重疊的函數(shù)。

RPC 的用例

RPC 模式在八十年代開始使用,但這并不意味著它已經(jīng)過時了。諸如 Google、Facebook(Apache Thrift)和 Twitch(Twirp)這樣的大公司如今正在內(nèi)部使用高性能的 RPC 版本,來執(zhí)行極高性能、低開銷的消息傳遞。它們龐大的微服務系統(tǒng)要求內(nèi)部通信在使用短消息的情況下也保持清晰。

命令 API。RPC 是用于將命令發(fā)送到遠程系統(tǒng)的正確選擇。例如,Slack API 是非常以命令為中心的:加入頻道、離開頻道、發(fā)送消息。因此,Slack API 的設計者以類似于 RPC 的樣式對其進行了建模,使其小巧、緊湊并且易于使用。

用于內(nèi)部微服務的客戶特定的 API。由于是在單個提供者和單個使用者之間建立直接的集成,我們不想像 REST API 那樣,花太多時間通過網(wǎng)絡傳輸大量的元數(shù)據(jù)。憑借高消息速率和消息性能,gRPC 和 Twirp 成為了用于微服務的可靠用例。通過在底層使用 HTTP 2,gRPC 能優(yōu)化網(wǎng)絡層,使其非常高效地在不同服務之間每天傳送大量信息。然而,如果你并不是要著眼于提高網(wǎng)絡性能,而是要在發(fā)布高度獨立的微服務團隊之間建立一個穩(wěn)定的 API 聯(lián)系。REST 就能做到。

2.SOAP:使數(shù)據(jù)作為服務可用

SOAP 是一個 XML 格式的、高度標準化的網(wǎng)絡通訊協(xié)議。在 XML-RPC 發(fā)布的一年后,SOAP 由微軟發(fā)布、并繼承了許多 XML-RPC 的特性。在 REST 緊隨其后發(fā)布,一開始它們是被同時使用,但很快 REST 贏得了這次比賽,成為了更流行的協(xié)議。

SOAP 的工作機制

XML 數(shù)據(jù)格式拖累了很多數(shù)據(jù)規(guī)范。伴隨著大量的消息結(jié)構(gòu),XML 數(shù)據(jù)格式使得 SOAP 成為了最冗長的 API 架構(gòu)風格。

SOAP 的消息由這些部件組成:

一個 SOAP 消息的例子,圖源:IBM

SOAP API 的邏輯由 Web 服務描述語言(WSDL)編寫。該 API 描述語言定義了端點并描述了可以執(zhí)行的所有過程。這使得不同的編程語言和 IDE 能夠快速建立通信。

SOAP 支持有狀態(tài)和無狀態(tài)消息傳遞。在有狀態(tài)的情況下,服務器存儲接收到的信息可能非常繁瑣復雜。但這對于涉及多方和復雜交易的操作是合理的。 

SOAP 的優(yōu)勢

獨立于語言和平臺。內(nèi)置創(chuàng)建 Web 服務的功能使得 SOAP 能夠處理消息通信的同時發(fā)送獨立于語言和平臺響應。

綁定到各種協(xié)議。SOAP 在適用于多種場景的傳輸協(xié)議方面是十分靈活的。

內(nèi)置錯誤處理。SOAP API 規(guī)范允許返回帶有錯誤碼及其說明的的 XML 重試消息。

一系列的安全拓展。SOAP 與 ES-Security 集成,因此 SOAP 可滿足企業(yè)級事務要求。它在事務內(nèi)部提供了隱私和完整性,同時允許在消息級別進行加密。

SOAP 消息級別的安全性:在標頭元素的認證數(shù)據(jù)以及加密的正文

SOAP 的不足

如今,由于如下幾種原因,許多開發(fā)人員在聽到必須集成 SOAP API 的想法后都會感到不安。

僅使用 XML。SOAP 消息包含大量的元數(shù)據(jù),并且在請求和響應時僅支持繁冗的 XML 格式。

重量級。由于 XML 文件的大小,SOAP 服務需要很大的帶寬。

非常專業(yè)化的知識。構(gòu)建 SOAP API 服務器需要對所有涉及到的協(xié)議以及它們及其嚴格的限制都有很深的了解。

乏味的消息更新。由于需要額外的工作來添加或者刪除某個消息屬性,這種死板的 SOAP 模式減慢了其被采用的速度。

SOAP 的用例

目前,SOAP 體系結(jié)構(gòu)最常用于企業(yè)內(nèi)部或與其信任的合作伙伴的內(nèi)部集成。

高度安全的數(shù)據(jù)傳輸。SOAP 嚴格的消息結(jié)構(gòu),安全性和授權(quán)功能使其成為在 API 和客戶端之間執(zhí)行正式軟件協(xié)議的最合適的選擇,同時又符合 API 提供者與 API 使用者之間的法律合同。這就是為什么金融組織和其他企業(yè)用戶選擇適用 SOAP 的原因。

3.REST:使數(shù)據(jù)作為資源可用

REST 如今是一種無需解釋的 API 架構(gòu)風格,它由一系列的架構(gòu)約束所定義,旨在被廣泛 API 使用者采用。

當前最常見的 API 架構(gòu)風格最初時由 Roy Fielding 在其博士論文中提出的。REST 使得服務端的數(shù)據(jù)可用,并以簡單的格式(通常是 JSON 和 XML)來表示它。

 REST 的工作機制

REST 的定義并不像 SOAP 那樣嚴格。RESTful 體系結(jié)構(gòu)應該遵守如下六個體系結(jié)構(gòu)約束:

實際上,某些服務僅在某種程度上是 RESTful 的。而它們的內(nèi)核采用了 RPC 樣式,將較大的服務分解為資源,并有效地使用 HTTP 基礎結(jié)構(gòu)。但 REST 的關鍵部分是超媒體(又稱 HATEOAS),是超文本作為應用程序狀態(tài)引擎(Hypertext As The Enginer Of Application State)的縮寫。基本來說,這意味著 REST API 在每個響應中都提供元數(shù)據(jù),該元數(shù)據(jù)鏈接了有關如何使用該 API 的所有相關信息。這樣便可以使客戶端和服務端解耦。因此,API 提供者和 API 使用者都可以獨立發(fā)展,而這并不會阻礙他們的交流。

理查森成熟度模型作為實現(xiàn)真正完整且有用的 API 架構(gòu)的目標。圖源:Kristopher Sandoval

“HATEOAS 才是 REST 的關鍵功能,因為它真正使得 REST 成為 REST。但由于大多數(shù)人不使用 HATEOAS,因此他們實際上是在使用 HTTP RPC。”這是 Reddit 上表達的一些激進觀點。確實,HATEOAS 是 REST 的最成熟版本。

但是,這非常難以實現(xiàn),因為這要求 API 客戶端要比它們?nèi)缃駱?gòu)建和使用的方式變得更先進和智能得多。因此,即便是如今非常好的 REST API 也不一定總是能做到這一點。這就是為什么 HATEOAS 主要是作為 RESTful API 設計的長期開發(fā)的愿景而存在。

當服務端實現(xiàn) REST 的某些功能和 RPC 的某些功能時,在 REST 和 RPC 之間確實可能存在這樣一個灰色區(qū)域。但 REST 是基于資源或名詞的,而不是基于動作或動詞。

以動詞為中心的 RPC 模型和以名詞為中心的 REST 模型中的操作對比

在 REST 中,使用例如 GET、POST、PUT、DELETE、OPTIONS 可能還有 PATCH 等 HTTP 方法來完成操作。

圖源:Thomas David

REST 的優(yōu)勢

客戶端和服務端的解耦:由于 REST 盡可能地解耦了客戶端和服務端,REST 相較于 RPC 可以提供更好的抽象性。具有抽象級別的系統(tǒng)能夠封裝其實現(xiàn)細節(jié),以更好的標示和維持它的屬性。這使得 REST API 足夠靈活,可以隨著時間的推移而發(fā)展,同時保持穩(wěn)定的系統(tǒng)。

可發(fā)現(xiàn)性:客戶端和服務端之間的通信描述了所有內(nèi)容,因此不需要外部文檔即可了解如何與 REST API 進行交互。

緩存友好:REST 重用了許多 HTTP 工具,也是唯一一種可以在 HTTP 層面上緩存數(shù)據(jù)的 API 架構(gòu)風格。與其相對的是,在任何其他 API 上實現(xiàn)緩存都需要配置其他緩存模塊。

多種格式支持:REST 擁有支持多種格式用于存儲和交換數(shù)據(jù)的能力,這是它如今成為搭建公共 API 的主要選擇的原因之一。

REST 的不足

沒有標準的 REST 結(jié)構(gòu):在構(gòu)建 REST API 方面,沒有具體的正確方法。如何對資源進行建模以及哪些資源需要建模取決于不同的情況。這使得 REST 在理論上很簡單,但在實踐中卻很困難。

龐大的負載:REST 會返回大量豐富的元數(shù)據(jù),以便客戶端可以僅從響應中了解有關應用程序狀態(tài)的所有必要信息。對于具有大量帶寬容量的大型網(wǎng)絡系統(tǒng)來說,這種“啰嗦”的通信并不算很大的負載。但帶寬容量并非總是足夠的。這也是 Facebook 在 2012 年提出 GraphQL 架構(gòu)風格的關鍵驅(qū)動因素。

響應過度和響應不足問題。REST 的響應包含的數(shù)據(jù)會過多或不足,通常會導致客戶端需要發(fā)送另一個請求。

REST 的用例

管理 API。在系統(tǒng)中,專注于管理對象并面向許多使用者的 API 是最常見的 API 類型。REST 幫助此類 API 具有強大的可發(fā)現(xiàn)性,良好的文檔編制,因此 REST 非常適合此對象模型。

簡單的資源驅(qū)動型應用程序。在用于連接不需要查詢靈活性的資源驅(qū)動型應用時,REST 是一種非常有效的方法。

4.GraphQL:僅請求所需要的數(shù)據(jù)

REST API 需要被多次調(diào)用才能返回所需要的資源。所以,GraphQL 被發(fā)明了,并改變了這一切游戲的規(guī)則。

GraphQL 是一種語法,它描述了如何進行精確的數(shù)據(jù)請求。有些應用程序的數(shù)據(jù)模型具有許多相互引用的復雜實體,在這種情況下,實現(xiàn) GraphQL 是值得的。

如何從 GraphQL 端點僅獲取所需要的數(shù)據(jù),圖源:Mohit Tikoo

如今,GraphQL 的生態(tài)系統(tǒng)正在蓬勃發(fā)展,出現(xiàn)了例如 Apollo、GraphiQL 和 GraphQL Explorer 等強大的庫和工具。

GraphQL 的工作機制

GraphQL 從構(gòu)建模式(Schema)開始。模式是對于用戶可以在 GraphQL API 中進行的所有查詢及其返回的所有類型的描述。模式構(gòu)建非常困難,因為它需要使用模式定義語言(SDL)進行強類型化。

因為在客戶端進行查詢之前已經(jīng)定義好了模式,所以客戶端可以驗證其查詢語句,以確保服務端能夠?qū)Σ樵冋Z句進行響應。在查詢語句到達后端應用程序時,GraphQL 操作將根據(jù)整個模式進行解釋,并向前端應用程序返回解析到的數(shù)據(jù)。API 向服務端發(fā)送一個龐大的查詢,該 API 返回一個僅包含我們所需數(shù)據(jù)的 JSON 響應。

GraphQL 的查詢語句執(zhí)行,圖源:Jonas Helfer

除了包含 RESTful 的 CRUD 操作,GraphQL 還有訂閱(subscriptions)機制,允許接收來自服務端的實時通知。

GraphQL 的優(yōu)勢

具有類型的模式GraphQL 提前公開了它能做什么,從而提高了其可發(fā)現(xiàn)性。通過將客戶端指向 GraphQL API,我們可以發(fā)現(xiàn)什么查詢語句是可用的。

沒有版本控制:版本控制的最佳實踐是不要對 API 進行版本控制。

盡管 REST 提供了不同的 API 版本,GraphQL 使用的是不斷更新的單一版本,這使用戶可以持續(xù)訪問新功能,并有助于提供更整潔、更可維護的服務器代碼。

詳細的錯誤消息:GraphQL 以類似于 SOAP 的方式提供所發(fā)生錯誤的詳細信息。它的錯誤消息包括所有解析器,并指向確切的發(fā)生故障時的查詢部分。

靈活的權(quán)限:GraphQL 允許選擇性地公開某些功能,同時保留私人信息。而相對應的是,REST 體系架構(gòu)不能僅顯示部分數(shù)據(jù),要么是全部數(shù)據(jù),要么是沒有數(shù)據(jù)。

GraphQL 的不足

性能問題。GraphQL 權(quán)衡了復雜性,來實現(xiàn)其強大功能。一個請求中的嵌套字段太多會導致系統(tǒng)過載。因此,對于復雜的查詢,REST 仍然是更好的選擇。

緩存復雜度。由于 GraphQL 不再使用 HTTP 緩存語義,因此使用者需要額外自定義緩存。

大量的預開發(fā)教育。由于沒有足夠的時間來了解 GraphQL 的某個操作和 SDL,因此許多項目決定采用眾所周知的 REST 方法。

GraphQL 的用例

移動 API。在這種情況下,網(wǎng)絡性能和單個消息有效負載優(yōu)化很重要。因此,GraphQL 為移動設備提供了更有效的數(shù)據(jù)加載方式。

復雜的系統(tǒng)和微服務。GraphQL 能夠隱藏其 API 背后的多個系統(tǒng)集成的復雜性。GraphQL 從多個地方聚合數(shù)據(jù),并將它們合并為一個全局的模式。對于隨時間推移而逐漸擴展的遺留基礎架構(gòu)或第三方 API 來說,這尤其重要。

5.哪種 API 模式最適用你的用例?

每個 API 項目都有不同的限制和需求。通常,API 架構(gòu)的選擇取決于:

在了解了每種設計風格的利與弊之后,API 設計人員可以選擇最適合項目的那一種。

具有強耦合性的 RPC 很適用于內(nèi)部微服務,但它對外部 API 或者 API 服務而言不是一個好的選擇。

SOAP 的使用有些麻煩,但它強大的安全拓展使它在計費操作、預訂系統(tǒng)和支付方面是無可替代的。

REST 是針對 API 的最高級別的抽象和最佳模型。但它往往會有些“啰嗦”而增加系統(tǒng)的負擔 —— 如果你使用的是移動設備,這是個問題。

GraphQL 在數(shù)據(jù)獲取方面向前邁出了一大步,但并不是每個人都有足夠的時間后精力來掌握它。

歸根結(jié)底,去針對一些小型的用例來嘗試某種特定 API 架構(gòu),并去了解它是否適合你的用例以及是否解決了你的問題,這樣做是比較合適的。如果它適用于你的用例,就可以嘗試擴展并查看它是否適用于更多的用例。

原文鏈接:

https://levelup.gitconnected.com/comparing-api-architectural-styles-soap-vs-rest-vs-graphql-vs-rpc-84a3720adefa

文章轉(zhuǎn)自:微信公眾號@InfoQ

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業(yè)工程師共享工作效率翻倍的秘密
返回頂部
上一篇
gRPC 與 REST:API 開發(fā)方法的對比分析
下一篇
微服務架構(gòu)中API的開發(fā)與治理
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
国产电影一区在线| 国产精品一二三四区| 亚洲风情在线资源站| 色综合久久久久久久久久久| 亚洲欧洲日韩综合一区二区| 不卡av免费在线观看| 久久久久国产成人精品亚洲午夜| 久久99日本精品| 日韩欧美中文字幕制服| 免费观看在线综合| 久久九九99视频| 97久久人人超碰| 亚洲国产精品综合小说图片区| 欧美丝袜丝交足nylons| 久久精品国产澳门| 亚洲免费观看在线观看| 91精品欧美福利在线观看 | 99久久免费视频.com| 亚洲图片欧美色图| 26uuu亚洲婷婷狠狠天堂| 成人免费视频视频| 日韩av电影一区| 成人免费在线观看入口| 欧美一区二区三区在| 国产成人一区二区精品非洲| 中文字幕永久在线不卡| 日韩欧美国产一区二区三区| 日本丶国产丶欧美色综合| 国产一区二区久久| 日韩精品欧美成人高清一区二区| 国产农村妇女毛片精品久久麻豆| 欧美日韩综合一区| 91丝袜高跟美女视频| 狠狠色丁香久久婷婷综| 亚洲国产成人va在线观看天堂| 国产午夜精品久久| 精品国产髙清在线看国产毛片| 色综合激情五月| 97精品久久久午夜一区二区三区 | 欧美成人bangbros| 69堂成人精品免费视频| 色综合欧美在线| 成人午夜免费视频| 国产黄色精品视频| 国产91清纯白嫩初高中在线观看| 久久国产精品免费| 麻豆一区二区99久久久久| 午夜视频久久久久久| 午夜久久久久久久久| 亚洲一区二区三区不卡国产欧美| 亚洲免费资源在线播放| 国产精品久久久久久久蜜臀| 国产欧美日韩卡一| 亚洲欧美一区二区三区孕妇| |精品福利一区二区三区| 亚洲精品欧美激情| 婷婷丁香激情综合| 美女任你摸久久| 国产一区二区毛片| 99久久99久久综合| 日本电影欧美片| 欧美一区二区在线不卡| 久久久久国产成人精品亚洲午夜| 国产欧美精品在线观看| 亚洲精品精品亚洲| 免费高清在线视频一区·| 国产剧情在线观看一区二区 | 国产一区二区三区蝌蚪| jizzjizzjizz欧美| 欧美撒尿777hd撒尿| 精品国产免费人成在线观看| 国产精品乱人伦中文| 亚洲成人自拍偷拍| 国产一区二区三区久久久| 91热门视频在线观看| 91精品国产欧美一区二区18 | 中文一区二区在线观看| 亚洲一二三四区不卡| 国内外精品视频| 在线观看日韩av先锋影音电影院| 精品理论电影在线观看| 亚洲一二三区视频在线观看| 久久99久久99精品免视看婷婷 | 日本韩国视频一区二区| 精品乱码亚洲一区二区不卡| 国产精品国产精品国产专区不蜜 | 精品亚洲成a人| 欧美三级视频在线| 国产精品三级视频| 毛片不卡一区二区| 欧美少妇bbb| 亚洲视频在线一区观看| 六月婷婷色综合| 欧美日本韩国一区| 综合久久久久久| 成人午夜激情影院| 久久久久国色av免费看影院| 日韩成人免费在线| 精品视频资源站| 亚洲婷婷综合色高清在线| 狠狠色丁香久久婷婷综合丁香| 欧美福利视频一区| 亚洲成人午夜影院| 欧美三级电影网| 亚洲大片精品永久免费| 在线看国产日韩| 一区二区在线电影| 91免费看视频| 亚洲精品日韩综合观看成人91| 成人中文字幕在线| 日韩久久一区二区| 欧美自拍偷拍一区| 亚洲一区二区三区国产| 欧美制服丝袜第一页| 亚洲国产日韩一区二区| 欧美三级中文字幕在线观看| 一级日本不卡的影视| 欧美亚洲国产bt| 日韩1区2区3区| 久久久久国产精品麻豆ai换脸| 国产高清不卡二三区| 中文字幕一区二| 欧美日韩视频在线观看一区二区三区 | 国产精品白丝av| 国产欧美精品国产国产专区| 成人精品国产福利| 一级精品视频在线观看宜春院| 色综合天天综合狠狠| 亚洲成人在线免费| 亚洲精品一区二区三区福利| 成人美女视频在线看| 亚洲最新在线观看| 日韩精品一区国产麻豆| 成人黄色一级视频| 亚洲国产人成综合网站| 精品国产a毛片| 色偷偷88欧美精品久久久| 午夜日韩在线电影| 亚洲国产成人在线| 欧美一区二区三区小说| 菠萝蜜视频在线观看一区| 日韩在线一二三区| 亚洲婷婷综合色高清在线| 精品久久久久久久久久久久包黑料| 91亚洲永久精品| 国产一区二区91| 水蜜桃久久夜色精品一区的特点 | 韩国欧美一区二区| 亚欧色一区w666天堂| 中文字幕欧美激情一区| 欧美美女喷水视频| 在线视频观看一区| 99久久免费视频.com| 国产剧情一区二区三区| 精品中文字幕一区二区小辣椒| 亚洲国产sm捆绑调教视频| 综合久久综合久久| 国产精品色哟哟网站| 久久免费电影网| 精品久久久三级丝袜| 欧美日韩国产一区二区三区地区| 成人永久免费视频| 豆国产96在线|亚洲| 国产米奇在线777精品观看| 欧美96一区二区免费视频| 亚洲一本大道在线| 亚洲国产视频a| 天天av天天翘天天综合网色鬼国产| 一区二区三区在线视频观看58| 中文字幕一区二区三区在线播放 | 色婷婷综合久久久中文字幕| 成人动漫在线一区| jvid福利写真一区二区三区| 床上的激情91.| 91麻豆高清视频| 精品视频一区二区三区免费| 91黄色免费网站| 欧美日韩精品一区二区三区蜜桃 | 欧美综合在线视频| 欧美电影影音先锋| 欧美成人性福生活免费看| 久久久久久99精品| 国产精品美女久久久久高潮| 综合欧美一区二区三区| 亚洲一区二区三区四区的| 无吗不卡中文字幕| 黑人巨大精品欧美一区| 99久久99久久精品免费看蜜桃| 国产91精品露脸国语对白| 一本在线高清不卡dvd| 欧美另类久久久品| 日韩女优视频免费观看| 欧美激情一区二区三区在线| 一区二区在线看| 国产一区二三区好的| 97久久人人超碰| 日韩精品中文字幕在线不卡尤物| 国产精品久久三| 日本不卡视频在线观看| 91视频免费播放|