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

如何手擼一個較為完整的RPC框架?

開發(fā) 后端
最近在公司分享了手擼RPC,因此做一個總結(jié)。一起來看一下吧 。

概念篇

RPC 是什么?

RPC 稱遠程過程調(diào)用(Remote Procedure Call),用于解決分布式系統(tǒng)中服務(wù)之間的調(diào)用問題。通俗地講,就是開發(fā)者能夠像調(diào)用本地方法一樣調(diào)用遠程的服務(wù)。所以,RPC的作用主要體現(xiàn)在這兩個方面:

  • 屏蔽遠程調(diào)用跟本地調(diào)用的區(qū)別,讓我們感覺就是調(diào)用項目內(nèi)的方法;
  • 隱藏底層網(wǎng)絡(luò)通信的復(fù)雜性,讓我們更專注于業(yè)務(wù)邏輯。

RPC 框架基本架構(gòu)

下面我們通過一幅圖來說說 RPC 框架的基本架構(gòu)

RPC 框架包含三個最重要的組件,分別是客戶端、服務(wù)端和注冊中心。在一次 RPC 調(diào)用流程中,這三個組件是這樣交互的:

  • 服務(wù)端在啟動后,會將它提供的服務(wù)列表發(fā)布到注冊中心,客戶端向注冊中心訂閱服務(wù)地址;
  • 客戶端會通過本地代理模塊 Proxy 調(diào)用服務(wù)端,Proxy 模塊收到負責(zé)將方法、參數(shù)等數(shù)據(jù)轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)流;
  • 客戶端從服務(wù)列表中選取其中一個的服務(wù)地址,并將數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送給服務(wù)端;
  • 服務(wù)端接收到數(shù)據(jù)后進行解碼,得到請求信息;
  • 服務(wù)端根據(jù)解碼后的請求信息調(diào)用對應(yīng)的服務(wù),然后將調(diào)用結(jié)果返回給客戶端。

RPC 框架通信流程以及涉及到的角色

從上面這張圖中,可以看見 RPC 框架一般有這些組件:服務(wù)治理(注冊發(fā)現(xiàn))、負載均衡、容錯、序列化/反序列化、編解碼、網(wǎng)絡(luò)傳輸、線程池、動態(tài)代理等角色,當然有的RPC框架還會有連接池、日志、安全等角色。

具體調(diào)用過程


  1. 服務(wù)消費方(client)以本地調(diào)用方式調(diào)用服務(wù)
  2. client stub 接收到調(diào)用后負責(zé)將方法、參數(shù)等封裝成能夠進行網(wǎng)絡(luò)傳輸?shù)南Ⅲw
  3. client stub 將消息進行編碼并發(fā)送到服務(wù)端
  4. server stub 收到消息后進行解碼
  5.  server stub 根據(jù)解碼結(jié)果調(diào)用本地的服務(wù)
  6. 本地服務(wù)執(zhí)行并將結(jié)果返回給 server stub
  7. server stub 將返回導(dǎo)入結(jié)果進行編碼并發(fā)送至消費方
  8. client stub 接收到消息并進行解碼
  9. 服務(wù)消費方(client)得到結(jié)果

RPC 消息協(xié)議

RPC調(diào)用過程中需要將參數(shù)編組為消息進行發(fā)送,接收方需要解組消息為參數(shù),過程處理結(jié)果同樣需要經(jīng)編組、解組。消息由哪些部分構(gòu)成及消息的表示形式就構(gòu)成了消息協(xié)議。

RPC調(diào)用過程中采用的消息協(xié)議稱為RPC消息協(xié)議。

實戰(zhàn)篇

從上面的概念我們知道一個RPC框架大概有哪些部分組成,所以在設(shè)計一個RPC框架也需要從這些組成部分考慮。從RPC的定義中可以知道,RPC框架需要屏蔽底層細節(jié),讓用戶感覺調(diào)用遠程服務(wù)像調(diào)用本地方法一樣簡單,所以需要考慮這些問題:

  • 用戶使用我們的RPC框架時如何盡量少的配置
  • 如何將服務(wù)注冊到ZK(這里注冊中心選擇ZK)上并且讓用戶無感知
  • 如何調(diào)用透明(盡量用戶無感知)的調(diào)用服務(wù)提供者
  • 啟用多個服務(wù)提供者如何做到動態(tài)負載均衡
  • 框架如何做到能讓用戶自定義擴展組件(比如擴展自定義負載均衡策略)
  • 如何定義消息協(xié)議,以及編解碼
  • ...等等

上面這些問題在設(shè)計這個RPC框架中都會給予解決。

技術(shù)選型

  • 注冊中心 目前成熟的注冊中心有Zookeeper,Nacos,Consul,Eureka,這里使用ZK作為注冊中心,沒有提供切換以及用戶自定義注冊中心的功能。
  •  IO通信框架 本實現(xiàn)采用 Netty 作為底層通信框架,因為Netty 是一個高性能事件驅(qū)動型的非阻塞的IO(NIO)框架,沒有提供別的實現(xiàn),也不支持用戶自定義通信框架
  • 消息協(xié)議 本實現(xiàn)使用自定義消息協(xié)議,后面會具體說明

項目總體結(jié)構(gòu)

從這個結(jié)構(gòu)中可以知道,以rpc命名開頭的是rpc框架的模塊,也是本項目RPC框架的內(nèi)容,而consumer是服務(wù)消費者,provider是服務(wù)提供者,provider-api是暴露的服務(wù)API。

整體依賴情況

項目實現(xiàn)介紹

要做到用戶使用我們的RPC框架時盡量少的配置,所以把rpc框架設(shè)計成一個starter,用戶只要依賴這個starter,基本那就可以了。

為什么要設(shè)計成兩個 starter (client-starter/server-starter) ?

這個是為了更好的體現(xiàn)出客戶端和服務(wù)端的概念,消費者依賴客戶端,服務(wù)提供者依賴服務(wù)端,還有就是最小化依賴。

為什么要設(shè)計成 starter ?

基于spring boot自動裝配機制,會加載starter中的 spring.factories 文件,在文件中配置以下代碼,這里我們starter的配置類就生效了,在配置類里面配置一些需要的bean。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.rrtv.rpc.client.config.RpcClientAutoConfiguration

發(fā)布服務(wù)和消費服務(wù)

  • 對于發(fā)布服務(wù)

服務(wù)提供者需要在暴露的服務(wù)上增加注解 @RpcService,這個自定義注解是基于 @service 的,是一個復(fù)合注解,具備@service注解的功能,在@RpcService注解中指明服務(wù)接口和服務(wù)版本,發(fā)布服務(wù)到ZK上,會根據(jù)這個兩個元數(shù)據(jù)注冊

  • 發(fā)布服務(wù)原理:

服務(wù)提供者啟動之后,根據(jù)spring boot自動裝配機制,server-starter的配置類就生效了,在一個 bean 的后置處理器(RpcServerProvider)中獲取被注解 @RpcService 修飾的bean,將注解的元數(shù)據(jù)注冊到ZK上。

  • 對于消費服務(wù)

消費服務(wù)需要使用自定義的 @RpcAutowired 注解標識,是一個復(fù)合注解,基于 @Autowired。

  • 消費服務(wù)原理

要讓客戶端無感知的調(diào)用服務(wù)提供者,就需要使用動態(tài)代理,如上面所示, HelloWordService 沒有實現(xiàn)類,需要給它賦值代理類,在代理類中發(fā)起請求調(diào)用。

基于spring boot自動裝配,服務(wù)消費者啟動,bean 后置處理器 RpcClientProcessor 開始工作,它主要是遍歷所有的bean,判斷每個bean中的屬性是否有被 @RpcAutowired 注解修飾,有的話把該屬性動態(tài)賦值代理類,這個再調(diào)用時會調(diào)用代理類的 invoke 方法。

代理類 invoke 方法通過服務(wù)發(fā)現(xiàn)獲取服務(wù)端元數(shù)據(jù),封裝請求,通過netty發(fā)起調(diào)用。

注冊中心

本項目注冊中心使用ZK,由于注冊中心被服務(wù)消費者和服務(wù)提供者都使用。所以把ZK放在rpc-core模塊。

rpc-core 這個模塊如上圖所示,核心功能都在這個模塊。服務(wù)注冊在 register 包下。

服務(wù)注冊接口,具體實現(xiàn)使用ZK實現(xiàn)。

負載均衡策略

負載均衡定義在rpc-core中,目前支持輪詢(FullRoundBalance)和隨機(RandomBalance),默認使用隨機策略。由rpc-client-spring-boot-starter指定。

通過ZK服務(wù)發(fā)現(xiàn)時會找到多個實例,然后通過負載均衡策略獲取其中一個實例

可以在消費者中配置 rpc.client.balance=fullRoundBalance 替換,也可以自定義負載均衡策略,通過實現(xiàn)接口 LoadBalance,并將創(chuàng)建的類加入IOC容器即可。由于我們配置 @ConditionalOnMissingBean,所以會優(yōu)先加載用戶自定義的 bean。

自定義消息協(xié)議、編解碼

所謂協(xié)議,就是通信雙方事先商量好規(guī)則,服務(wù)端知道發(fā)送過來的數(shù)據(jù)將如何解析。

  • 自定義消息協(xié)議

  • 魔數(shù):魔數(shù)是通信雙方協(xié)商的一個暗號,通常采用固定的幾個字節(jié)表示。魔數(shù)的作用是防止任何人隨便向服務(wù)器的端口上發(fā)送數(shù)據(jù)。例如 java Class 文件開頭就存儲了魔數(shù) 0xCAFEBABE,在加載 Class 文件時首先會驗證魔數(shù)的正確性
  • 協(xié)議版本號:隨著業(yè)務(wù)需求的變化,協(xié)議可能需要對結(jié)構(gòu)或字段進行改動,不同版本的協(xié)議對應(yīng)的解析方法也是不同的。
  • 序列化算法:序列化算法字段表示數(shù)據(jù)發(fā)送方應(yīng)該采用何種方法將請求的對象轉(zhuǎn)化為二進制,以及如何再將二進制轉(zhuǎn)化為對象,如 JSON、Hessian、Java 自帶序列化等。
  • 報文類型:在不同的業(yè)務(wù)場景中,報文可能存在不同的類型。RPC 框架中有請求、響應(yīng)、心跳等類型的報文。
  • 狀態(tài):狀態(tài)字段用于標識請求是否正常(SUCCESS、FAIL)。
  • 消息ID:請求唯一ID,通過這個請求ID將響應(yīng)關(guān)聯(lián)起來,也可以通過請求ID做鏈路追蹤。
  • 數(shù)據(jù)長度:標明數(shù)據(jù)的長度,用于判斷是否是一個完整的數(shù)據(jù)包
  • 數(shù)據(jù)內(nèi)容:請求體內(nèi)容

編解碼

編解碼實現(xiàn)在 rpc-core 模塊,在包 com.rrtv.rpc.core.codec下。

自定義編碼器通過繼承 netty 的 MessageToByteEncoder<MessageProtocol<T>>類實現(xiàn)消息編碼。

自定義解碼器通過繼承 netty 的 ByteToMessageDecoder類實現(xiàn)消息解碼。

解碼時需要注意TCP粘包、拆包問題

什么是TCP粘包、拆包

TCP 傳輸協(xié)議是面向流的,沒有數(shù)據(jù)包界限,也就是說消息無邊界。客戶端向服務(wù)端發(fā)送數(shù)據(jù)時,可能將一個完整的報文拆分成多個小報文進行發(fā)送,也可能將多個報文合并成一個大的報文進行發(fā)送。因此就有了拆包和粘包。

在網(wǎng)絡(luò)通信的過程中,每次可以發(fā)送的數(shù)據(jù)包大小是受多種因素限制的,如 MTU 傳輸單元大小、滑動窗口等。

所以如果一次傳輸?shù)木W(wǎng)絡(luò)包數(shù)據(jù)大小超過傳輸單元大小,那么我們的數(shù)據(jù)可能會拆分為多個數(shù)據(jù)包發(fā)送出去。如果每次請求的網(wǎng)絡(luò)包數(shù)據(jù)都很小,比如一共請求了 10000 次,TCP 并不會分別發(fā)送 10000 次。TCP采用的 Nagle(批量發(fā)送,主要用于解決頻繁發(fā)送小數(shù)據(jù)包而帶來的網(wǎng)絡(luò)擁塞問題) 算法對此作出了優(yōu)化。

所以,網(wǎng)絡(luò)傳輸會出現(xiàn)這樣:

tcp_package.png

  1.    服務(wù)端恰巧讀到了兩個完整的數(shù)據(jù)包 A 和 B,沒有出現(xiàn)拆包/粘包問題;
  2.    服務(wù)端接收到 A 和 B 粘在一起的數(shù)據(jù)包,服務(wù)端需要解析出 A 和 B;
  3.    服務(wù)端收到完整的 A 和 B 的一部分數(shù)據(jù)包 B-1,服務(wù)端需要解析出完整的 A,并等待讀取完整的 B 數(shù)據(jù)包;
  4. 服務(wù)端接收到 A 的一部分數(shù)據(jù)包 A-1,此時需要等待接收到完整的 A 數(shù)據(jù)包;
  5. 數(shù)據(jù)包 A 較大,服務(wù)端需要多次才可以接收完數(shù)據(jù)包 A。

如何解決TCP粘包、拆包問題

解決問題的根本手段:找出消息的邊界:

  • 消息長度固定

每個數(shù)據(jù)報文都需要一個固定的長度。當接收方累計讀取到固定長度的報文后,就認為已經(jīng)獲得一個完整的消息。當發(fā)送方的數(shù)據(jù)小于固定長度時,則需要空位補齊。

消息定長法使用非常簡單,但是缺點也非常明顯,無法很好設(shè)定固定長度的值,如果長度太大會造成字節(jié)浪費,長度太小又會影響消息傳輸,所以在一般情況下消息定長法不會被采用。

  • 特定分隔符

在每次發(fā)送報文的尾部加上特定分隔符,接收方就可以根據(jù)特殊分隔符進行消息拆分。分隔符的選擇一定要避免和消息體中字符相同,以免沖突。否則可能出現(xiàn)錯誤的消息拆分。比較推薦的做法是將消息進行編碼,例如 base64 編碼,然后可以選擇 64 個編碼字符之外的字符作為特定分隔符

  • 消息長度 + 消息內(nèi)容

消息長度 + 消息內(nèi)容是項目開發(fā)中最常用的一種協(xié)議,接收方根據(jù)消息長度來讀取消息內(nèi)容。

本項目就是利用 “消息長度 + 消息內(nèi)容” 方式解決TCP粘包、拆包問題的。所以在解碼時要判斷數(shù)據(jù)是否夠長度讀取,沒有不夠說明數(shù)據(jù)沒有準備好,繼續(xù)讀取數(shù)據(jù)并解碼,這里這種方式可以獲取一個個完整的數(shù)據(jù)包。

序列化和反序列化

序列化和反序列化在 rpc-core 模塊 com.rrtv.rpc.core.serialization 包下,提供了 HessianSerialization 和 JsonSerialization 序列化。

默認使用 HessianSerialization 序列化。用戶不可以自定義。

序列化性能:

  • 空間上

serialization_space.png

  • 時間上

serialization_time.png

網(wǎng)絡(luò)傳輸,使用netty

netty 代碼固定的,值得注意的是 handler 的順序不能弄錯,以服務(wù)端為例,編碼是出站操作(可以放在入站后面),解碼和收到響應(yīng)都是入站操作,解碼要在前面。

image.png

客戶端 RPC 調(diào)用方式

成熟的 RPC 框架一般會提供四種調(diào)用方式,分別為同步 Sync、異步 Future、回調(diào) Callback和單向 Oneway。

  • Sync 同步調(diào)用

客戶端線程發(fā)起 RPC 調(diào)用后,當前線程會一直阻塞,直至服務(wù)端返回結(jié)果或者處理超時異常。

sync.png

  • Future 異步調(diào)用

客戶端發(fā)起調(diào)用后不會再阻塞等待,而是拿到 RPC 框架返回的 Future 對象,調(diào)用結(jié)果會被服務(wù)端緩存,客戶端自行決定后續(xù)何時獲取返回結(jié)果。當客戶端主動獲取結(jié)果時,該過程是阻塞等待的

future.png

  • Callback 回調(diào)調(diào)用

客戶端發(fā)起調(diào)用時,將 Callback 對象傳遞給 RPC 框架,無須同步等待返回結(jié)果,直接返回。當獲取到服務(wù)端響應(yīng)結(jié)果或者超時異常后,再執(zhí)行用戶注冊的 Callback 回調(diào)

callback.png

  • Oneway 單向調(diào)用

客戶端發(fā)起請求之后直接返回,忽略返回結(jié)果

oneway.png

這里使用的是第一種:客戶端同步調(diào)用,其他的沒有實現(xiàn)。邏輯在 RpcFuture 中,使用 CountDownLatch 實現(xiàn)阻塞等待(超時等待)

整體架構(gòu)和流程

流程分為三塊:服務(wù)提供者啟動流程、服務(wù)消費者啟動、調(diào)用過程

服務(wù)提供者啟動

  1. 服務(wù)提供者 provider 會依賴 rpc-server-spring-boot-starter
  2. ProviderApplication 啟動,根據(jù)springboot 自動裝配機制,RpcServerAutoConfiguration 自動配置生效
  3. RpcServerProvider 是一個bean后置處理器,會發(fā)布服務(wù),將服務(wù)元數(shù)據(jù)注冊到ZK上
  4. RpcServerProvider.run 方法會開啟一個 netty 服務(wù)

服務(wù)消費者啟動

  1.    服務(wù)消費者 consumer 會依賴 rpc-client-spring-boot-starter
  2.    ConsumerApplication 啟動,根據(jù)springboot 自動裝配機制,RpcClientAutoConfiguration 自動配置生效
  3. 將服務(wù)發(fā)現(xiàn)、負載均衡、代理等bean加入IOC容器
  4. 后置處理器 RpcClientProcessor 會掃描 bean ,將被 @RpcAutowired 修飾的屬性動態(tài)賦值為代理對象

調(diào)用過程

  1.    服務(wù)消費者 發(fā)起請求http://localhost:9090/hello/world?name=hello
  2.    服務(wù)消費者 調(diào)用 helloWordService.sayHello() 方法,會被代理到執(zhí)行 ClientStubInvocationHandler.invoke() 方法
  3. 服務(wù)消費者 通過ZK服務(wù)發(fā)現(xiàn)獲取服務(wù)元數(shù)據(jù),找不到報錯404
  4. 服務(wù)消費者 自定義協(xié)議,封裝請求頭和請求體
  5. 服務(wù)消費者 通過自定義編碼器 RpcEncoder 將消息編碼
  6. 服務(wù)消費者 通過 服務(wù)發(fā)現(xiàn)獲取到服務(wù)提供者的ip和端口, 通過Netty網(wǎng)絡(luò)傳輸層發(fā)起調(diào)用
  7. 服務(wù)消費者 通過 RpcFuture 進入返回結(jié)果(超時)等待
  8. 服務(wù)提供者 收到消費者請求
  9. 服務(wù)提供者 將消息通過自定義解碼器 RpcDecoder 解碼
  10. 服務(wù)提供者 解碼之后的數(shù)據(jù)發(fā)送到 RpcRequestHandler 中進行處理,通過反射調(diào)用執(zhí)行服務(wù)端本地方法并獲取結(jié)果
  11. 服務(wù)提供者 將執(zhí)行的結(jié)果通過 編碼器 RpcEncoder 將消息編碼。(由于請求和響應(yīng)的協(xié)議是一樣,所以編碼器和解碼器可以用一套)
  12. 服務(wù)消費者 將消息通過自定義解碼器 RpcDecoder 解碼
  13. 服務(wù)消費者 通過RpcResponseHandler將消息寫入 請求和響應(yīng) 池中,并設(shè)置 RpcFuture 的響應(yīng)結(jié)果
  14. 服務(wù)消費者 獲取到結(jié)果

以上流程具體可以結(jié)合代碼分析,代碼后面會給出

環(huán)境搭建

  • 操作系統(tǒng):Windows
  • 集成開發(fā)工具:IntelliJ IDEA
  • 項目技術(shù)棧:SpringBoot 2.5.2 + JDK 1.8 + Netty 4.1.42.Final
  • 項目依賴管理工具:Maven 4.0.0
  • 注冊中心:Zookeeeper 3.7.0

項目測試

  • 啟動 Zookeeper 服務(wù)器:bin/zkServer.cmd
  • 啟動 provider 模塊 ProviderApplication
  • 啟動 consumer 模塊 ConsumerApplication
  • 測試:瀏覽器輸入 http://localhost:9090/hello/world?name=hello,成功返回 您好:hello, rpc 調(diào)用成功

項目代碼地址

??https://gitee.com/listen_w/rpc.git??

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

2020-11-02 08:19:18

RPC框架Java

2024-08-01 17:20:55

2021-05-14 13:30:17

Mybatis分表插件

2021-10-27 06:49:34

線程池Core函數(shù)

2021-10-04 09:29:41

對象池線程池

2021-11-04 17:23:03

Java對象 immutable

2022-02-08 09:09:45

智能指針C++

2018-09-18 09:38:11

RPC遠程調(diào)用網(wǎng)絡(luò)通信

2022-01-21 07:35:06

LRU緩存java

2015-03-10 11:21:44

JavaScript組JavaScript

2022-11-07 18:36:03

組件RPC框架

2021-02-20 09:45:02

RPC框架Java

2020-09-09 07:13:05

RPC框架

2016-11-10 14:34:15

創(chuàng)業(yè)業(yè)務(wù)技術(shù)架構(gòu)

2016-12-26 17:28:08

構(gòu)建業(yè)務(wù)技術(shù)架構(gòu)

2022-02-14 07:34:23

工具類GET、POST

2022-03-01 08:21:32

工具類代碼封裝網(wǎng)絡(luò)請求

2020-12-09 08:34:24

css生成器設(shè)計師

2009-10-01 09:19:45

PHP框架ZendFramewoCake

2024-01-02 12:17:44

Go傳統(tǒng)遠程
點贊
收藏

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

午夜激情久久久| 精一区二区三区| 一区二区成人精品| 欧美日韩一区二区三区69堂| 国产区在线观看| 成人黄色一级视频| 国产精品99久久久久久久久| 午夜爱爱毛片xxxx视频免费看| 亚洲精品高潮| 91久久香蕉国产日韩欧美9色| 一区二区三区四区视频在线观看| 成人av免费播放| 爽好多水快深点欧美视频| 色综合亚洲精品激情狠狠| 少妇被狂c下部羞羞漫画| 成人精品电影在线| 亚洲在线成人精品| 视频一区视频二区视频三区高 | 精品女同一区二区三区在线播放| 日本高清久久一区二区三区| 国产情侣一区二区| 日韩精品每日更新| 97超视频免费观看| 老熟妇高潮一区二区三区| 亚洲欧洲美洲国产香蕉| 精品国产一区二区三区久久久蜜月| 91最新在线观看| 黄色漫画在线免费看| 亚洲精品少妇30p| 亚洲国产精品一区二区第四页av| 天天干天天操av| 国产成人免费视频网站| 国产精品永久免费视频| av毛片在线免费观看| 最新国产乱人伦偷精品免费网站| 久久成人免费视频| 91免费在线看片| 国产一区二区三区天码| 亚洲黄色片网站| 国产a级黄色片| 欧美久久亚洲| 日韩一区二区麻豆国产| 91 在线视频观看| 素人啪啪色综合| 在线视频综合导航| 日av中文字幕| 女生影院久久| 日韩欧美精品免费在线| 一女被多男玩喷潮视频| 成人bbav| 欧美性猛交xxxx黑人| 日韩精品―中文字幕| 国产理论电影在线| 亚洲午夜电影在线| 久久久久免费看黄a片app| 国产后进白嫩翘臀在线观看视频 | 国产精品成人久久| 亚洲欧洲一区二区天堂久久| 久久久亚洲欧洲日产国码aⅴ| 久久久久免费看| 狠狠色狠狠色综合日日tαg | 日韩伦理在线一区| 欧美午夜片欧美片在线观看| 人妻精品无码一区二区三区 | 国产中文字幕日韩| 国产精品久久久午夜夜伦鲁鲁| 久久99精品一区二区三区三区| 成人乱人伦精品视频在线观看| 国产精品久久久久久久免费看| 国产一区二区福利| 成人在线视频电影| 天堂av在线7| 国产日韩成人精品| 中文字幕一区二区三区5566| www在线视频| 亚洲成a人v欧美综合天堂| 欧美视频在线播放一区| 成人18视频在线观看| 在线不卡一区二区| 亚洲色图欧美另类| 国产一区二区在线| 久久av中文字幕| 在线观看国产亚洲| 日本视频免费一区| wwwxx欧美| 能在线看的av| 亚洲欧美乱综合| www一区二区www免费| 777午夜精品电影免费看| 欧美群妇大交群的观看方式| 国产综合内射日韩久| 蜜桃精品wwwmitaows| 久久资源免费视频| 天堂а√在线中文在线新版 | 国产日韩在线一区| 亚洲精品一区二区三区蜜桃| 99久久精品一区| 自拍另类欧美| 波多野结衣久久精品| 777亚洲妇女| 国产精品一区二区入口九绯色| 色天天综合网| 欧洲s码亚洲m码精品一区| 国产又黄又粗又长| 久久久久国产精品人| 欧美做暖暖视频| 电影一区二区| 日韩美女av在线| 欧美日韩三级在线观看 | 亚洲精品乱码久久久久久黑人| 黄色片网址在线观看| 精品国产黄a∨片高清在线| 精品国产露脸精彩对白| 性生交大片免费全黄| 亚洲中字在线| 成人自拍网站| 麻豆影视在线观看_| 日韩欧美精品免费在线| 无码人妻精品一区二区三区99不卡| 日本成人小视频| 欧美洲成人男女午夜视频| 性一交一乱一透一a级| 国产精品久久久久久久久免费桃花| 大j8黑人w巨大888a片| 一区二区网站| 久久人人爽人人爽爽久久| 四虎影院在线免费播放| 99久久99久久精品国产片果冻| 国产经典久久久| 四虎精品永久免费| 中文字幕亚洲欧美一区二区三区 | 风间由美久久久| 国产cdts系列另类在线观看| 欧美日韩久久久一区| 精品人伦一区二区三电影| 亚洲视频大全| 精品乱码一区二区三区| 丰乳肥臀在线| 日韩欧美成人激情| 亚洲色婷婷一区二区三区| 久久99在线观看| 亚洲国产精品久久久久久女王| www.成人影院| 亚洲视频在线观看网站| 久久夜色精品国产噜噜亚洲av| 99久久精品免费精品国产| 无码专区aaaaaa免费视频| 国产成人精品亚洲线观看| 欧美丰满片xxx777| 亚洲av无码片一区二区三区| 亚洲精品伦理在线| 白丝校花扒腿让我c| 欧美女人交a| 成人精品一二区| 爱情岛亚洲播放路线| 精品久久久久一区二区国产| 日本熟女一区二区| 99久久综合99久久综合网站| 欧美亚洲国产成人| 精品在线99| 国产精品视频久久久| 蜜芽在线免费观看| 日韩欧美第一区| 日韩三级av在线| 国产午夜精品一区二区三区四区| 亚洲一级片免费| 艳女tv在线观看国产一区| 99电影网电视剧在线观看| 欧美xxxx黑人又粗又长| 亚洲国产精品女人久久久| 亚洲精品午夜国产va久久成人| 久久久精品人体av艺术| 污版视频在线观看| 在线观看日韩| 久久草.com| aaaa欧美| 欧美伦理91i| 天天操天天操天天操| 在线视频国内一区二区| 午夜爱爱毛片xxxx视频免费看| 成人av免费在线播放| 无码无遮挡又大又爽又黄的视频| 久久一区二区三区喷水| 国产chinese精品一区二区| 99色在线观看| 日韩亚洲国产中文字幕| 精品久久人妻av中文字幕| 一本大道久久a久久综合婷婷 | 亚洲 欧美综合在线网络| 素人fc2av清纯18岁| 精品无人码麻豆乱码1区2区 | 欧美日韩一区二区视频在线观看| 国产精品4hu.www| 午夜精品一区二区三区在线| 高清性色生活片在线观看| 日韩欧美在线影院| 无码人妻丰满熟妇精品| 亚洲精品日韩综合观看成人91| 国产精品无码在线| 黑人巨大精品欧美黑白配亚洲| 18禁免费观看网站| 亚洲最大av| 日韩免费三级| 欧美18免费视频| 亚洲影院污污.| 外国电影一区二区| 国内精品久久久久久影视8| 浪潮av一区| 亚洲欧美制服中文字幕| 精品人妻伦一区二区三区久久| 91电影在线观看| 国产成人啪精品午夜在线观看| 国产精品免费视频观看| 黄色aaa视频| 成人免费观看男女羞羞视频| 欧美日韩中文不卡| 久久中文精品| 国产精品一区二区免费在线观看| 午夜精品一区二区三区国产| 欧美午夜免费| 欧美a级网站| 91精品天堂| 久久日本片精品aaaaa国产| 日本午夜精品理论片a级appf发布| 久久不射影院| 久操成人在线视频| 一区二区高清不卡| 在线电影av不卡网址| 手机福利小视频在线播放| 精品成人佐山爱一区二区| 国产三级伦理片| 欧美日韩国产高清一区| 亚洲精品毛片一区二区三区| 日韩欧美成人精品| 99精品视频99| 精品久久久久久国产| 久久精品国产亚洲av无码娇色| 亚洲精品久久久蜜桃| 国产精品精品软件男同| 国产精品久久久一本精品| 青青草自拍偷拍| 国产精品久久免费看| 亚洲一级理论片| 中文幕一区二区三区久久蜜桃| 调教驯服丰满美艳麻麻在线视频| 国产午夜亚洲精品理论片色戒 | 亚洲欧美日韩国产成人精品影院 | 亚洲一区二区精品3399| 青青草在线观看视频| 樱桃视频在线观看一区| 糖心vlog免费在线观看| 亚洲欧美一区二区久久| 久草网站在线观看| 亚洲国产成人av网| 日本三级免费看| 欧美日韩在线免费| 波多野结衣在线电影| 欧美亚洲一区二区在线| 一本久道久久综合无码中文| 69堂成人精品免费视频| 成人av一区二区三区在线观看 | 成人av番号网| 欧美2区3区4区| 国产精品yjizz| 神马午夜久久| 亚洲精品在线观看免费| 午夜激情久久| 大西瓜av在线| 久久综合伊人| 中文字幕资源在线观看| 国产成人亚洲综合a∨婷婷| 国产免费一区二区三区最新6| 91丝袜美腿高跟国产极品老师| 精品无人区无码乱码毛片国产| 国产精品护士白丝一区av| 裸体武打性艳史| 天天亚洲美女在线视频| 中日精品一色哟哟| 日韩精品专区在线影院观看| 头脑特工队2在线播放| 中文字幕日韩电影| 国产天堂在线播放视频| 国产成人福利网站| 欧美一级大片在线视频| 精品一区二区视频| 久久国产影院| 欧美日韩视频免费| 日本不卡在线视频| 最新日本中文字幕| 国产精品免费aⅴ片在线观看| 久久久久久久国产视频| 91国产成人在线| av在线资源观看| 国产丝袜一区视频在线观看 | 久久久久久久一区二区三区| 老司机成人影院| 5566中文字幕一区二区| 怕怕欧美视频免费大全| 国产精品va在线观看无码| 日av在线不卡| 亚洲av无码一区二区三区观看 | 日韩乱码一区二区| 欧美精品自拍偷拍动漫精品| 午夜视频免费在线| 欧美精品生活片| 成人在线视频免费| 欧美激情第六页| 激情欧美一区| 色18美女社区| 日本一区二区三区国色天香 | mm131丰满少妇人体欣赏图| 亚洲综合免费观看高清在线观看| 波多野结衣一本一道| 亚洲国产天堂久久综合网| a级片国产精品自在拍在线播放| 日本一欧美一欧美一亚洲视频| 亚洲一区二区三区免费| 亚洲欧美久久久久一区二区三区| 99国产精品久久久久久久 | 中文字幕你懂的| 亚洲精品日韩在线| 精品精品导航| 5g国产欧美日韩视频| 我不卡影院28| 中国黄色片免费看| 国产日产欧美精品一区二区三区| 精品国产免费观看| 亚洲精品二三区| av资源新版天堂在线| 国产精品12| 亚洲欧美综合| 无人码人妻一区二区三区免费| 国产精品丝袜久久久久久app| 日韩美一区二区| 日韩成人在线播放| 国产盗摄——sm在线视频| 国产精品区一区二区三在线播放| 这里只有精品在线| 美女被艹视频网站| 一区二区理论电影在线观看| 国产伦一区二区| 欧美精品在线第一页| 日本精品在线播放| 黄色录像特级片| 国产成人免费在线视频| 国产免费无码一区二区视频| 日韩一区和二区| 青青草原国产在线| 国产女人水真多18毛片18精品| 亚洲另类自拍| 成人网站免费观看| 欧美在线短视频| 免费在线观看黄| 亚洲va久久久噜噜噜| 国内久久视频| 99久久人妻精品免费二区| 精品久久久在线观看| 国产在线观看高清视频| 国产精品一区二区久久国产| 久久亚洲专区| 少妇丰满尤物大尺度写真| 亚洲国产日韩精品| 深夜福利在线看| 国产精品一二区| 最新国产精品久久久| 中文字幕在线视频播放| 色婷婷激情一区二区三区| av网在线观看| 91色在线观看| 亚洲久久视频| 波多野结衣一二三四区| 91精品国产综合久久精品app| sqte在线播放| 日韩影视精品| 国产毛片精品一区| 久久久久亚洲av成人毛片韩| 国产亚洲日本欧美韩国| 激情不卡一区二区三区视频在线| www插插插无码免费视频网站| 91香蕉视频污| 亚洲字幕av一区二区三区四区| 欧美日韩xxx| 精品久久不卡| 日本成人在线免费| 色一情一乱一乱一91av| www免费在线观看| 欧美福利一区二区三区| 麻豆精品精品国产自在97香蕉| 久久久久久久久精| 一区二区三区视频观看| 一区中文字幕| 九九九在线观看视频| 亚洲一区在线观看免费| 成人免费在线观看| 国产伦精品一区二区三区视频黑人 | 中文字幕第315页| 欧美精品久久久久久久| 日韩精品不卡一区二区| 亚洲国产第一区| 91精品黄色片免费大全|