久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dubbo源码解析(十)远程通信——Exchange层

發布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo源码解析(十)远程通信——Exchange层 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

遠程通訊——Exchange層

目標:介紹Exchange層的相關設計和邏輯、介紹dubbo-remoting-api中的exchange包內的源碼解析。

前言

上一篇文章我講的是dubbo框架設計中Transport層,這篇文章我要講的是它的上一層Exchange層,也就是信息交換層。官方文檔對這一層的解釋是封裝請求響應模式,同步轉異步,以 Request, Response為中心,擴展接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。

這一層的設計意圖是什么?它應該算是在信息傳輸層上又做了部分裝飾,為了適應rpc調用的一些需求,比如rpc調用中一次請求只關心它所對應的響應,這個時候只是一個message消息傳輸過來,是無法區分這是新的請求還是上一個請求的響應,這種類似于冪等性的問題以及rpc異步處理返回結果、內置事件等特性都是在Transport層無法解決滿足的,所有在Exchange層講message分成了request和response兩種類型,并且在這兩個模型上增加一些系統字段來處理問題。具體我會在下面講到。而dubbo把一條消息分為了協議頭和內容兩部分:協議頭包括系統字段,例如編號等,內容包括具體請求的參數和響應的結果等。在exchange層中大量邏輯都是基于協議頭的。

現在對這一層的設計意圖大致應該有所了解了吧,現在來看看exchange的類圖:

我講解的順序還是按照類圖從上而下,分塊講解,忽略綠色的test類。

源碼解析

(一)ExchangeChannel

public interface ExchangeChannel extends Channel {ResponseFuture request(Object request) throws RemotingException;ResponseFuture request(Object request, int timeout) throws RemotingException;ExchangeHandler getExchangeHandler();@Overridevoid close(int timeout);}

該接口是信息交換通道接口,有四個方法,前兩個是發送請求消息,區別就是第二個發送請求有超時的參數,getExchangeHandler方法就是返回一個信息交換處理器,第四個是需要覆寫父類的方法。

(二)HeaderExchangeChannel

該類實現了ExchangeChannel,是基于協議頭的信息交換通道。

1.屬性

private static final Logger logger = LoggerFactory.getLogger(HeaderExchangeChannel.class);/*** 通道的key值*/ private static final String CHANNEL_KEY = HeaderExchangeChannel.class.getName() + ".CHANNEL";/*** 通道*/ private final Channel channel;/*** 是否關閉*/ private volatile boolean closed = false;

上述屬性比較簡單,還是放一下這個類的屬性是因為該類中有channel屬性,也就是說HeaderExchangeChannel是Channel的裝飾器,每個實現方法都會調用channel的方法。

2.靜態方法

static HeaderExchangeChannel getOrAddChannel(Channel ch) {if (ch == null) {return null;}// 獲得通道中的HeaderExchangeChannelHeaderExchangeChannel ret = (HeaderExchangeChannel) ch.getAttribute(CHANNEL_KEY);if (ret == null) {// 創建一個HeaderExchangeChannel實例ret = new HeaderExchangeChannel(ch);// 如果通道連接if (ch.isConnected()) {// 加入屬性值ch.setAttribute(CHANNEL_KEY, ret);}}return ret; }static void removeChannelIfDisconnected(Channel ch) {// 如果通道斷開連接if (ch != null && !ch.isConnected()) {// 移除屬性值ch.removeAttribute(CHANNEL_KEY);} }

該靜態方法做了HeaderExchangeChannel的創建和銷毀,并且生命周期隨channel銷毀而銷毀。

3.send

@Override public void send(Object message) throws RemotingException {send(message, getUrl().getParameter(Constants.SENT_KEY, false)); }@Override public void send(Object message, boolean sent) throws RemotingException {// 如果通道關閉,拋出異常if (closed) {throw new RemotingException(this.getLocalAddress(), null, "Failed to send message " + message + ", cause: The channel " + this + " is closed!");}// 判斷消息的類型if (message instanceof Request|| message instanceof Response|| message instanceof String) {// 發送消息channel.send(message, sent);} else {// 新建一個request實例Request request = new Request();// 設置信息的版本request.setVersion(Version.getProtocolVersion());// 該請求不需要響應request.setTwoWay(false);// 把消息傳入request.setData(message);// 發送消息channel.send(request, sent);} }

該方法是在channel的send方法上加上了request和response模型,最后再調用channel.send,起到了裝飾器的作用。

4.request

@Override public ResponseFuture request(Object request) throws RemotingException {return request(request, channel.getUrl().getPositiveParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT)); }@Override public ResponseFuture request(Object request, int timeout) throws RemotingException {// 如果通道關閉,則拋出異常if (closed) {throw new RemotingException(this.getLocalAddress(), null, "Failed to send request " + request + ", cause: The channel " + this + " is closed!");}// create request.創建請求Request req = new Request();// 設置版本號req.setVersion(Version.getProtocolVersion());// 設置需要響應req.setTwoWay(true);// 把請求數據傳入req.setData(request);// 創建DefaultFuture對象,可以從future中主動獲得請求對應的響應信息DefaultFuture future = new DefaultFuture(channel, req, timeout);try {// 發送請求消息channel.send(req);} catch (RemotingException e) {future.cancel();throw e;}return future; }

該方法是請求方法,用Request模型把請求內容裝飾起來,然后發送一個Request類型的消息,并且返回DefaultFuture實例,DefaultFuture我會在后面講到。

cloes方法也重寫了,我就不再多說,因為比較簡單,沒有重點,其他方法都是直接調用channel屬性的方法。

(三)ExchangeClient

該接口繼承了Client和ExchangeChannel,是信息交換客戶端接口,其中沒有定義多余的方法。

(四)HeaderExchangeClient

 該類實現了ExchangeClient接口,是基于協議頭的信息交互客戶端類,同樣它是Client、Channel的適配器。在該類的源碼中可以看到所有的實現方法都是調用了client和channel屬性的方法。該類主要的作用就是增加了心跳功能,為什么要增加心跳功能呢,對于長連接,一些拔網線等物理層的斷開,會導致TCP的FIN消息來不及發送,對方收不到斷開事件,那么就需要用到發送心跳包來檢測連接是否斷開。consumer和provider斷開,處理措施不一樣,會分別做出重連和關閉通道的操作。

1.屬性

private static final Logger logger = LoggerFactory.getLogger(HeaderExchangeClient.class);/*** 定時器線程池*/ private static final ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2, new NamedThreadFactory("dubbo-remoting-client-heartbeat", true)); /*** 客戶端*/ private final Client client; /*** 信息交換通道*/ private final ExchangeChannel channel; // heartbeat timer /*** 心跳定時器*/ private ScheduledFuture<?> heartbeatTimer; // heartbeat(ms), default value is 0 , won't execute a heartbeat. /*** 心跳周期,間隔多久發送心跳消息檢測一次*/ private int heartbeat; /*** 心跳超時時間*/ private int heartbeatTimeout;

該類的屬性除了需要適配的屬性外,其他都是跟心跳相關屬性。

2.構造函數

public HeaderExchangeClient(Client client, boolean needHeartbeat) {if (client == null) {throw new IllegalArgumentException("client == null");}this.client = client;// 創建信息交換通道this.channel = new HeaderExchangeChannel(client);// 獲得dubbo版本String dubbo = client.getUrl().getParameter(Constants.DUBBO_VERSION_KEY);//獲得心跳周期配置,如果沒有配置,并且dubbo是1.0版本的,則這只為1分鐘,否則設置為0this.heartbeat = client.getUrl().getParameter(Constants.HEARTBEAT_KEY, dubbo != null && dubbo.startsWith("1.0.") ? Constants.DEFAULT_HEARTBEAT : 0);// 獲得心跳超時配置,默認是心跳周期的三倍this.heartbeatTimeout = client.getUrl().getParameter(Constants.HEARTBEAT_TIMEOUT_KEY, heartbeat * 3);// 如果心跳超時時間小于心跳周期的兩倍,則拋出異常if (heartbeatTimeout < heartbeat * 2) {throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2");}if (needHeartbeat) {// 開啟心跳startHeartbeatTimer();} }

構造函數就是對一些屬性初始化設置,優先從url中獲取。心跳超時時間小于心跳周期的兩倍就拋出異常,意思就是至少重試兩次心跳檢測。

3.startHeartbeatTimer

private void startHeartbeatTimer() {// 停止現有的心跳線程stopHeartbeatTimer();// 如果需要心跳if (heartbeat > 0) {// 創建心跳定時器heartbeatTimer = scheduled.scheduleWithFixedDelay(// 新建一個心跳線程new HeartBeatTask(new HeartBeatTask.ChannelProvider() {@Overridepublic Collection<Channel> getChannels() {// 返回一個只包含HeaderExchangeClient對象的不可變列表return Collections.<Channel>singletonList(HeaderExchangeClient.this);}}, heartbeat, heartbeatTimeout),heartbeat, heartbeat, TimeUnit.MILLISECONDS);} }

該方法就是開啟心跳。利用心跳定時器來做到定時檢測心跳。因為這是信息交換客戶端類,所有這里的只是返回包含HeaderExchangeClient對象的不可變列表,因為客戶端跟channel是一一對應的,只有這一個該客戶端本身的channel需要心跳。

4.stopHeartbeatTimer

private void stopHeartbeatTimer() {if (heartbeatTimer != null && !heartbeatTimer.isCancelled()) {try {// 取消定時器heartbeatTimer.cancel(true);// 取消大量已排隊任務,用于回收空間scheduled.purge();} catch (Throwable e) {if (logger.isWarnEnabled()) {logger.warn(e.getMessage(), e);}}}heartbeatTimer = null; }

該方法是停止現有心跳,也就是停止定時器,釋放空間。

其他方法都是調用channel和client屬性的方法。

(五)HeartBeatTask

該類實現了Runnable接口,實現的是心跳任務,里面包含了核心的心跳策略。

1.屬性

/*** 通道管理*/ private ChannelProvider channelProvider;/*** 心跳間隔 單位:ms*/ private int heartbeat;/*** 心跳超時時間 單位:ms*/ private int heartbeatTimeout;

后兩個屬性跟HeaderExchangeClient中的屬性含義一樣,第一個是該類自己內部的一個接口:

interface ChannelProvider {// 獲得所有的通道集合,需要心跳的通道數組Collection<Channel> getChannels(); }

該接口就定義了一個方法,獲得需要心跳的通道集合。可想而知,會對集合內的通道都做心跳檢測。

2.run

@Override public void run() {try {long now = System.currentTimeMillis();// 遍歷所有通道for (Channel channel : channelProvider.getChannels()) {// 如果通道關閉了,則跳過if (channel.isClosed()) {continue;}try {// 最后一次接收到消息的時間戳Long lastRead = (Long) channel.getAttribute(HeaderExchangeHandler.KEY_READ_TIMESTAMP);// 最后一次發送消息的時間戳Long lastWrite = (Long) channel.getAttribute(HeaderExchangeHandler.KEY_WRITE_TIMESTAMP);// 如果最后一次接收或者發送消息到時間到現在的時間間隔超過了心跳間隔時間if ((lastRead != null && now - lastRead > heartbeat)|| (lastWrite != null && now - lastWrite > heartbeat)) {// 創建一個requestRequest req = new Request();// 設置版本號req.setVersion(Version.getProtocolVersion());// 設置需要得到響應req.setTwoWay(true);// 設置事件類型,為心跳事件req.setEvent(Request.HEARTBEAT_EVENT);// 發送心跳請求channel.send(req);if (logger.isDebugEnabled()) {logger.debug("Send heartbeat to remote channel " + channel.getRemoteAddress()+ ", cause: The channel has no data-transmission exceeds a heartbeat period: " + heartbeat + "ms");}}// 如果最后一次接收消息的時間到現在已經超過了超時時間if (lastRead != null && now - lastRead > heartbeatTimeout) {logger.warn("Close channel " + channel+ ", because heartbeat read idle time out: " + heartbeatTimeout + "ms");// 如果該通道是客戶端,也就是請求的服務器掛掉了,客戶端嘗試重連服務器if (channel instanceof Client) {try {// 重新連接服務器((Client) channel).reconnect();} catch (Exception e) {//do nothing}} else {// 如果不是客戶端,也就是是服務端返回響應給客戶端,但是客戶端掛掉了,則服務端關閉客戶端連接channel.close();}}} catch (Throwable t) {logger.warn("Exception when heartbeat to remote channel " + channel.getRemoteAddress(), t);}}} catch (Throwable t) {logger.warn("Unhandled exception when heartbeat, cause: " + t.getMessage(), t);} }

該方法中是心跳機制的核心邏輯。注意以下幾個點:

  • 如果需要心跳的通道本身如果關閉了,那么跳過,不添加心跳機制。
  • 無論是接收消息還是發送消息,只要超過了設置的心跳間隔,就發送心跳消息來測試是否斷開
  • 如果最后一次接收到消息到到現在已經超過了心跳超時時間,那就認定對方的確斷開,分兩種情況來處理對方斷開的情況。分別是服務端斷開,客戶端重連以及客戶端斷開,服務端斷開這個客戶端的連接。,這里要好好品味一下誰是發送方,誰在等誰的響應,苦苦沒有等到。
  • (六)ResponseFuture

    public interface ResponseFuture {Object get() throws RemotingException;Object get(int timeoutInMillis) throws RemotingException;void setCallback(ResponseCallback callback);boolean isDone();}

    該接口是響應future接口,該接口的設計意圖跟java.util.concurrent.Future很類似。發送出去的消息,潑出去的水,只有等到對方主動響應才能得到結果,但是請求方需要去主動回去該請求的結果,就顯得有些艱難,所有產生了這樣一個接口,它能夠獲取任務執行結果、可以核對請求消息是否被響應,還能設置回調來支持異步。

    (七)DefaultFuture

    該類實現了ResponseFuture接口,其中封裝了處理響應的邏輯。你可以把DefaultFuture看成是一個中介,買房和賣房都通過這個中介進行溝通,中介擁有著買房者的信息request和賣房者的信息response,并且促成他們之間的買賣。

    1.屬性

    private static final Logger logger = LoggerFactory.getLogger(DefaultFuture.class);/*** 通道集合*/ private static final Map<Long, Channel> CHANNELS = new ConcurrentHashMap<Long, Channel>();/*** Future集合,key為請求編號*/ private static final Map<Long, DefaultFuture> FUTURES = new ConcurrentHashMap<Long, DefaultFuture>();// invoke id. /*** 請求編號*/ private final long id; /*** 通道*/ private final Channel channel; /*** 請求*/ private final Request request; /*** 超時*/ private final int timeout; /*** 鎖*/ private final Lock lock = new ReentrantLock(); /*** 完成情況,控制多線程的休眠與喚醒*/ private final Condition done = lock.newCondition(); /*** 創建開始時間*/ private final long start = System.currentTimeMillis(); /*** 發送請求時間*/ private volatile long sent; /*** 響應*/ private volatile Response response; /*** 回調*/ private volatile ResponseCallback callback;

    可以看到,該類的屬性包含了request、response、channel三個實例,在該類中,把請求和響應通過唯一的id一一對應起來。做到異步處理返回結果時能給準確的返回給對應的請求。可以看到屬性中有兩個集合,分別是通道集合和future集合,也就是該類本身也是所有 DefaultFuture 的管理容器。

    2.構造函數

    public DefaultFuture(Channel channel, Request request, int timeout) {this.channel = channel;this.request = request;// 設置請求編號this.id = request.getId();this.timeout = timeout > 0 ? timeout : channel.getUrl().getPositiveParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);// put into waiting map.,加入到等待集合中FUTURES.put(id, this);CHANNELS.put(id, channel); }

    構造函數比較簡單,每一個DefaultFuture實例都跟每一個請求一一對應,被存入到集合中管理起來。

    3.closeChannel

    public static void closeChannel(Channel channel) {// 遍歷通道集合for (long id : CHANNELS.keySet()) {if (channel.equals(CHANNELS.get(id))) {// 通過請求id獲得futureDefaultFuture future = getFuture(id);if (future != null && !future.isDone()) {// 創建一個關閉通道的響應Response disconnectResponse = new Response(future.getId());disconnectResponse.setStatus(Response.CHANNEL_INACTIVE);disconnectResponse.setErrorMessage("Channel " +channel +" is inactive. Directly return the unFinished request : " +future.getRequest());// 接收該關閉通道并且請求未完成的響應DefaultFuture.received(channel, disconnectResponse);}}} }

    該方法是關閉不活躍的通道,并且返回請求未完成。也就是關閉指定channel的請求,返回的是請求未完成。

    4.received

    public static void received(Channel channel, Response response) {try {// future集合中移除該請求的future,(響應id和請求id一一對應的)DefaultFuture future = FUTURES.remove(response.getId());if (future != null) {// 接收響應結果future.doReceived(response);} else {logger.warn("The timeout response finally returned at "+ (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()))+ ", response " + response+ (channel == null ? "" : ", channel: " + channel.getLocalAddress()+ " -> " + channel.getRemoteAddress()));}} finally {// 通道集合移除該請求對應的通道,代表著這一次請求結束CHANNELS.remove(response.getId());} }

    該方法是接收響應,也就是某個請求得到了響應,那么代表這次請求任務完成,所有需要把future從集合中移除。具體的接收響應結果在doReceived方法中實現。

    5.doReceived

    private void doReceived(Response res) {// 獲得鎖lock.lock();try {// 設置響應response = res;if (done != null) {// 喚醒等待done.signal();}} finally {// 釋放鎖lock.unlock();}if (callback != null) {// 執行回調invokeCallback(callback);} }

    可以看到,當接收到響應后,會把等待的線程喚醒,然后執行回調來處理該響應結果。

    6.invokeCallback

    private void invokeCallback(ResponseCallback c) {ResponseCallback callbackCopy = c;if (callbackCopy == null) {throw new NullPointerException("callback cannot be null.");}c = null;Response res = response;if (res == null) {throw new IllegalStateException("response cannot be null. url:" + channel.getUrl());}// 如果響應成功,返回碼是20if (res.getStatus() == Response.OK) {try {// 使用響應結果執行 完成 后的邏輯callbackCopy.done(res.getResult());} catch (Exception e) {logger.error("callback invoke error .reasult:" + res.getResult() + ",url:" + channel.getUrl(), e);}//超時,回調處理成超時異常} else if (res.getStatus() == Response.CLIENT_TIMEOUT || res.getStatus() == Response.SERVER_TIMEOUT) {try {TimeoutException te = new TimeoutException(res.getStatus() == Response.SERVER_TIMEOUT, channel, res.getErrorMessage());// 回調處理異常callbackCopy.caught(te);} catch (Exception e) {logger.error("callback invoke error ,url:" + channel.getUrl(), e);}// 其他情況處理成RemotingException異常} else {try {RuntimeException re = new RuntimeException(res.getErrorMessage());callbackCopy.caught(re);} catch (Exception e) {logger.error("callback invoke error ,url:" + channel.getUrl(), e);}} }

    該方法是執行回調來處理響應結果。分為了三種情況:

  • 響應成功,那么執行完成后的邏輯。
  • 超時,會按照超時異常來處理
  • 其他,按照RuntimeException異常來處理
  • 具體的處理都在ResponseCallback接口的實現類里執行,后面我會講到。

    7.get

    @Override public Object get() throws RemotingException {return get(timeout); }@Override public Object get(int timeout) throws RemotingException {// 超時時間默認為1sif (timeout <= 0) {timeout = Constants.DEFAULT_TIMEOUT;}// 如果請求沒有完成,也就是還沒有響應返回if (!isDone()) {long start = System.currentTimeMillis();// 獲得鎖lock.lock();try {// 輪詢 等待請求是否完成while (!isDone()) {// 線程阻塞等待done.await(timeout, TimeUnit.MILLISECONDS);// 如果請求完成或者超時,則結束if (isDone() || System.currentTimeMillis() - start > timeout) {break;}}} catch (InterruptedException e) {throw new RuntimeException(e);} finally {// 釋放鎖lock.unlock();}// 如果沒有收到響應,則拋出超時的異常if (!isDone()) {throw new TimeoutException(sent > 0, channel, getTimeoutMessage(false));}}// 返回響應return returnFromResponse(); }

    該方法是實現了ResponseFuture定義的方法,是獲得該future對應的請求對應的響應結果,其實future、請求、響應都是一一對應的。其中如果還沒得到響應,則會線程阻塞等待,等到有響應結果或者超時,才返回。返回的邏輯在returnFromResponse中實現。

    8.returnFromResponse

    private Object returnFromResponse() throws RemotingException {Response res = response;if (res == null) {throw new IllegalStateException("response cannot be null");}// 如果正常返回,則返回響應結果if (res.getStatus() == Response.OK) {return res.getResult();}// 如果超時,則拋出超時異常if (res.getStatus() == Response.CLIENT_TIMEOUT || res.getStatus() == Response.SERVER_TIMEOUT) {throw new TimeoutException(res.getStatus() == Response.SERVER_TIMEOUT, channel, res.getErrorMessage());}// 其他 拋出RemotingException異常throw new RemotingException(channel, res.getErrorMessage()); }

    這代碼跟invokeCallback方法中差不多,都是把響應分了三種情況。

    9.cancel

    public void cancel() {// 創建一個取消請求的響應Response errorResult = new Response(id);errorResult.setErrorMessage("request future has been canceled.");response = errorResult;// 從集合中刪除該請求FUTURES.remove(id);CHANNELS.remove(id); }

    該方法是取消一個請求,可以直接關閉一個請求,也就是值創建一個響應來回應該請求,把response值設置到該請求對于到future中,做到了中斷請求的作用。該方法跟closeChannel的區別是closeChannel中對response的狀態設置了CHANNEL_INACTIVE,而cancel方法是中途被主動取消的,雖然有response值,但是并沒有一個響應狀態。

    10.RemotingInvocationTimeoutScan

    private static class RemotingInvocationTimeoutScan implements Runnable {@Overridepublic void run() {while (true) {try {for (DefaultFuture future : FUTURES.values()) {// 已經完成,跳過掃描if (future == null || future.isDone()) {continue;}// 超時if (System.currentTimeMillis() - future.getStartTimestamp() > future.getTimeout()) {// create exception response.,創建一個超時的響應Response timeoutResponse = new Response(future.getId());// set timeout status.,設置超時狀態,是服務端側超時還是客戶端側超時timeoutResponse.setStatus(future.isSent() ? Response.SERVER_TIMEOUT : Response.CLIENT_TIMEOUT);// 設置錯誤信息timeoutResponse.setErrorMessage(future.getTimeoutMessage(true));// handle response.,接收創建的超時響應DefaultFuture.received(future.getChannel(), timeoutResponse);}}// 睡眠Thread.sleep(30);} catch (Throwable e) {logger.error("Exception when scan the timeout invocation of remoting.", e);}}} }

    該方法是掃描調用超時任務的線程,每次都會遍歷future集合,檢測請求是否超時了,如果超時則創建一個超時響應來回應該請求。

    static {// 開啟一個后臺掃描調用超時任務Thread th = new Thread(new RemotingInvocationTimeoutScan(), "DubboResponseTimeoutScanTimer");th.setDaemon(true);th.start(); }

    開啟一個后臺線程進行掃描的邏輯寫在了靜態代碼塊里面,只開啟一次。

    (八)SimpleFuture

    該類實現了ResponseFuture,目前沒有用到,很簡單的實現,我就不多說了。

    (九)ExchangeHandler

    該接口繼承了ChannelHandler, TelnetHandler接口,是信息交換處理器接口。

    public interface ExchangeHandler extends ChannelHandler, TelnetHandler {/*** reply.* 回復請求結果* @param channel* @param request* @return response* @throws RemotingException*/Object reply(ExchangeChannel channel, Object request) throws RemotingException;}

    該接口只定義了一個回復請求結果的方法,返回的是請求結果。

    (十)ExchangeHandlerDispatcher

    該類實現了ExchangeHandler接口, 是信息交換處理器調度器類,也就是對應不同的事件,選擇不同的處理器去處理。該類中有三個屬性,分別對應了三種事件:

    /*** 回復者調度器*/ private final ReplierDispatcher replierDispatcher;/*** 通道處理器調度器*/ private final ChannelHandlerDispatcher handlerDispatcher;/*** Telnet 命令處理器*/ private final TelnetHandler telnetHandler;

    如果事件是跟通道處理器有關的,就調用通道處理器來處理,比如:

    @Override @SuppressWarnings({"unchecked", "rawtypes"}) public Object reply(ExchangeChannel channel, Object request) throws RemotingException {return ((Replier) replierDispatcher).reply(channel, request); }@Override public void connected(Channel channel) {handlerDispatcher.connected(channel); } @Override public String telnet(Channel channel, String message) throws RemotingException {return telnetHandler.telnet(channel, message); }

    可以看到以上三種事件,回復請求結果需要回復者調度器來處理,連接需要通道處理器調度器來處理,telnet消息需要Telnet命令處理器來處理。

    (十一)ExchangeHandlerAdapter

    該類繼承了TelnetHandlerAdapter,實現了ExchangeHandler,是信息交換處理器的適配器類。

    public abstract class ExchangeHandlerAdapter extends TelnetHandlerAdapter implements ExchangeHandler {@Overridepublic Object reply(ExchangeChannel channel, Object msg) throws RemotingException {// 直接返回nullreturn null;}}

    該類直接讓ExchangeHandler定義的方法reply返回null,交由它的子類選擇性的去實現具體的回復請求結果。

    (十二)ExchangeServer

    該接口繼承了Server接口,定義了兩個方法:

    public interface ExchangeServer extends Server {/*** get channels.* 獲得通道集合* @return channels*/Collection<ExchangeChannel> getExchangeChannels();/*** get channel.* 根據遠程地址獲得對應的信息通道* @param remoteAddress* @return channel*/ExchangeChannel getExchangeChannel(InetSocketAddress remoteAddress);}

    該接口比較好理解,并且在Server接口基礎上新定義了兩個方法。直接來看看它的實現類吧。

    (十三)HeaderExchangeServer

    該類實現了ExchangeServer接口,是基于協議頭的信息交換服務器實現類,HeaderExchangeServer是Server的裝飾器,每個實現方法都會調用server的方法。

    1.屬性

    protected final Logger logger = LoggerFactory.getLogger(getClass());/*** 線程池*/ private final ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1,new NamedThreadFactory("dubbo-remoting-server-heartbeat",true)); /*** 服務器*/ private final Server server; // heartbeat timer /*** 心跳定時器*/ private ScheduledFuture<?> heartbeatTimer; // heartbeat timeout (ms), default value is 0 , won't execute a heartbeat. /*** 心跳周期*/ private int heartbeat; /*** 心跳超時時間*/ private int heartbeatTimeout; /*** 信息交換服務器是否關閉*/ private AtomicBoolean closed = new AtomicBoolean(false);

    該類里面的很多實現跟HeaderExchangeClient差不多,包括心跳檢測等邏輯。看得懂上述我講的HeaderExchangeClient的屬性,想必這里的屬性應該也很簡單了。

    2.構造函數

    public HeaderExchangeServer(Server server) {if (server == null) {throw new IllegalArgumentException("server == null");}this.server = server;//獲得心跳周期配置,如果沒有配置,默認設置為0this.heartbeat = server.getUrl().getParameter(Constants.HEARTBEAT_KEY, 0);// 獲得心跳超時配置,默認是心跳周期的三倍this.heartbeatTimeout = server.getUrl().getParameter(Constants.HEARTBEAT_TIMEOUT_KEY, heartbeat * 3);// 如果心跳超時時間小于心跳周期的兩倍,則拋出異常if (heartbeatTimeout < heartbeat * 2) {throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2");}// 開始心跳startHeartbeatTimer(); }public Server getServer() {return server; }

    構造函數就是對屬性的設置,心跳的機制以及默認值都跟HeaderExchangeClient中的一模一樣。

    3.isRunning

    private boolean isRunning() {Collection<Channel> channels = getChannels();// 遍歷所有連接該服務器的通道for (Channel channel : channels) {/*** If there are any client connections,* our server should be running.*/// 只要有任何一個客戶端連接,則服務器還運行著if (channel.isConnected()) {return true;}}return false; }

    該方法是檢測服務器是否還運行,只要有一個客戶端連接著,就算服務器運行著。

    4.close

    @Override public void close() {// 關閉線程池和心跳檢測doClose();// 關閉服務器server.close(); }@Override public void close(final int timeout) {// 開始關閉startClose();if (timeout > 0) {final long max = (long) timeout;final long start = System.currentTimeMillis();if (getUrl().getParameter(Constants.CHANNEL_SEND_READONLYEVENT_KEY, true)) {// 發送 READONLY_EVENT事件給所有連接該服務器的客戶端,表示 Server 不可讀了。sendChannelReadOnlyEvent();}// 當服務器還在運行,并且沒有超時,睡眠,也就是等待timeout左右時間在進行關閉while (HeaderExchangeServer.this.isRunning()&& System.currentTimeMillis() - start < max) {try {Thread.sleep(10);} catch (InterruptedException e) {logger.warn(e.getMessage(), e);}}}// 關閉線程池和心跳檢測doClose();// 延遲關閉server.close(timeout); }

    兩個close方法,第二個close方法是優雅的關閉,有一定的延時來讓一些響應或者操作做完。關閉分兩個步驟,第一個就是關閉信息交換服務器中的線程池和心跳檢測,然后才是關閉服務器。

    5.sendChannelReadOnlyEvent

    private void sendChannelReadOnlyEvent() {// 創建一個READONLY_EVENT事件的請求Request request = new Request();request.setEvent(Request.READONLY_EVENT);// 不需要響應request.setTwoWay(false);// 設置版本request.setVersion(Version.getProtocolVersion());Collection<Channel> channels = getChannels();// 遍歷連接的通道,進行通知for (Channel channel : channels) {try {// 通過通道還連接著,則發送通知if (channel.isConnected())channel.send(request, getUrl().getParameter(Constants.CHANNEL_READONLYEVENT_SENT_KEY, true));} catch (RemotingException e) {logger.warn("send cannot write message error.", e);}} }

    在關閉服務器中有一個操作就是發送事件READONLY_EVENT,告訴客戶端該服務器不可讀了,就是該方法實現的,逐個通知連接的客戶端該事件。

    6.doClose

    private void doClose() {if (!closed.compareAndSet(false, true)) {return;}// 停止心跳檢測stopHeartbeatTimer();try {// 關閉線程池scheduled.shutdown();} catch (Throwable t) {logger.warn(t.getMessage(), t);} }

    該方法就是close方法調用到的停止心跳檢測和關閉線程池。

    7.getExchangeChannels

    @Override public Collection<ExchangeChannel> getExchangeChannels() {Collection<ExchangeChannel> exchangeChannels = new ArrayList<ExchangeChannel>();// 獲得連接該服務器通道集合Collection<Channel> channels = server.getChannels();if (channels != null && !channels.isEmpty()) {// 遍歷通道集合,為每個通道都創建信息交換通道,并且加入信息交換通道集合for (Channel channel : channels) {exchangeChannels.add(HeaderExchangeChannel.getOrAddChannel(channel));}}return exchangeChannels; }

    該方法是返回連接該服務器信息交換通道集合。邏輯就是先獲得通道集合,在根據通道來創建信息交換通道,然后返回信息通道集合。

    8.reset

    @Override public void reset(URL url) {// 重置屬性server.reset(url);try {// 重置的邏輯跟構造函數一樣設置if (url.hasParameter(Constants.HEARTBEAT_KEY)|| url.hasParameter(Constants.HEARTBEAT_TIMEOUT_KEY)) {int h = url.getParameter(Constants.HEARTBEAT_KEY, heartbeat);int t = url.getParameter(Constants.HEARTBEAT_TIMEOUT_KEY, h * 3);if (t < h * 2) {throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2");}if (h != heartbeat || t != heartbeatTimeout) {heartbeat = h;heartbeatTimeout = t;// 重新開始心跳startHeartbeatTimer();}}} catch (Throwable t) {logger.error(t.getMessage(), t);} }

    該方法就是重置屬性,重置后,重新開始心跳,設置心跳屬性的機制跟構造函數一樣。

    9.startHeartbeatTimer

    private void startHeartbeatTimer() {// 先停止現有的心跳檢測stopHeartbeatTimer();if (heartbeat > 0) {// 創建心跳定時器heartbeatTimer = scheduled.scheduleWithFixedDelay(new HeartBeatTask(new HeartBeatTask.ChannelProvider() {@Overridepublic Collection<Channel> getChannels() {// 返回一個不可修改的連接該服務器的信息交換通道集合return Collections.unmodifiableCollection(HeaderExchangeServer.this.getChannels());}}, heartbeat, heartbeatTimeout),heartbeat, heartbeat, TimeUnit.MILLISECONDS);} }

    該方法是開始心跳,跟HeaderExchangeClient類中的開始心跳方法唯一區別是獲得的通道不一樣,客戶端跟通道是一一對應的,所有只要對一個通道進行心跳檢測,而服務端跟通道是一對多的關系,所有需要對該服務器連接的所有通道進行心跳檢測。

    10.stopHeartbeatTimer

    private void stopHeartbeatTimer() {if (heartbeatTimer != null && !heartbeatTimer.isCancelled()) {try {// 取消定時器heartbeatTimer.cancel(true);// 取消大量已排隊任務,用于回收空間scheduled.purge();} catch (Throwable e) {if (logger.isWarnEnabled()) {logger.warn(e.getMessage(), e);}}}heartbeatTimer = null; }

    該方法是停止當前的心跳檢測。

    (十四)ExchangeServerDelegate

    該類實現了ExchangeServer接口,是信息交換服務器裝飾者,是ExchangeServer的裝飾器。該類就一個屬性ExchangeServer server,所有實現方法都調用了server屬性的方法。目前只有在p2p中被用到,代碼為就不貼了,很簡單。

    (十五)Exchanger

    @SPI(HeaderExchanger.NAME) public interface Exchanger {/*** bind.* 綁定一個服務器* @param url 服務器url* @param handler 數據交換處理器* @return message server 數據交換服務器*/@Adaptive({Constants.EXCHANGER_KEY})ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException;/*** connect.* 連接一個服務器,也就是創建一個客戶端* @param url 服務器url* @param handler 數據交換處理器* @return message channel 返回數據交換客戶端*/@Adaptive({Constants.EXCHANGER_KEY})ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException;}

    該接口是數據交換者接口,該接口是一個可擴展接口默認實現的是HeaderExchanger類,并且用到了dubbo SPI的Adaptive機制,優先實現url攜帶的配置。如果不了解dubbo SPI機制的可以看《dubbo源碼解析(二)Dubbo擴展機制SPI》。那么回到該接口定義的方法,定義了綁定和連接兩個方法,分別返回信息交互服務器和客戶端實例。

    (十六)HeaderExchanger

    public class HeaderExchanger implements Exchanger {public static final String NAME = "header";@Overridepublic ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException {// 用傳輸層連接返回的client 創建對應的信息交換客戶端,默認開啟心跳檢測return new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))), true);}@Overridepublic ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException {// 用傳輸層綁定返回的server 創建對應的信息交換服務端return new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));}}

    該類繼承了Exchanger接口,是Exchanger接口的默認實現,實現了Exchanger接口定義的兩個方法,分別調用的是Transporters的連接和綁定方法,再利用這這兩個方法返回的客戶端和服務端實例來創建信息交換的客戶端和服務端。

    (十七)Replier

    我們知道Request對應的是ExchangeHandler接口實現對象來處理,但有些時候我們需要不同數據類型對應不同的處理器,該類就是為了支持這一需求所設計的。

    public interface Replier<T> {/*** reply.* 回復請求結果* @param channel* @param request* @return response* @throws RemotingException*/Object reply(ExchangeChannel channel, T request) throws RemotingException;}

    可以看到該接口跟ExchangeHandler定義的方法也一一,只有請求的類型改為了范型。

    (十八)ReplierDispatcher

    該類實現了Replier接口,是回復者調度器實現類。

    /*** 默認回復者*/ private final Replier<?> defaultReplier;/*** 回復者集合*/ private final Map<Class<?>, Replier<?>> repliers = new ConcurrentHashMap<Class<?>, Replier<?>>();

    這是該類的兩個屬性,緩存了回復者集合和默認的回復者。

    /*** 從回復者集合中找到該類型的回復者,并且返回* @param type* @return*/ private Replier<?> getReplier(Class<?> type) {for (Map.Entry<Class<?>, Replier<?>> entry : repliers.entrySet()) {if (entry.getKey().isAssignableFrom(type)) {return entry.getValue();}}if (defaultReplier != null) {return defaultReplier;}throw new IllegalStateException("Replier not found, Unsupported message object: " + type); }/*** 回復請求* @param channel* @param request* @return* @throws RemotingException*/ @Override @SuppressWarnings({"unchecked", "rawtypes"}) public Object reply(ExchangeChannel channel, Object request) throws RemotingException {return ((Replier) getReplier(request.getClass())).reply(channel, request); }

    上述是該類中關鍵的兩個方法,reply還是調用實現類的reply。根據請求的數據類型來使用指定的回復者進行回復。

    (十九)MultiMessage

    該類實現了實現 Iterable 接口,是多消息的封裝,我們直接看它的屬性:

    /*** 消息集合*/ private final List messages = new ArrayList();

    該類要和《dubbo源碼解析(九)遠程通信——Transport層》的(八)MultiMessageHandler聯合著看。

    (二十)HeartbeatHandler

    該類繼承了AbstractChannelHandlerDelegate類,是心跳處理器。是用來處理心跳事件的,也接收消息上增加了對心跳消息的處理。該類是

    @Override public void received(Channel channel, Object message) throws RemotingException {// 設置接收時間的時間戳屬性值setReadTimestamp(channel);// 如果是心跳請求if (isHeartbeatRequest(message)) {Request req = (Request) message;// 如果需要響應if (req.isTwoWay()) {// 創建一個響應Response res = new Response(req.getId(), req.getVersion());// 設置為心跳事件的響應res.setEvent(Response.HEARTBEAT_EVENT);// 發送消息,也就是返回響應channel.send(res);if (logger.isInfoEnabled()) {int heartbeat = channel.getUrl().getParameter(Constants.HEARTBEAT_KEY, 0);if (logger.isDebugEnabled()) {logger.debug("Received heartbeat from remote channel " + channel.getRemoteAddress()+ ", cause: The channel has no data-transmission exceeds a heartbeat period"+ (heartbeat > 0 ? ": " + heartbeat + "ms" : ""));}}}return;}// 如果是心跳響應,則直接returnif (isHeartbeatResponse(message)) {if (logger.isDebugEnabled()) {logger.debug("Receive heartbeat response in thread " + Thread.currentThread().getName());}return;}handler.received(channel, message); }

    該方法是就是在handler處理消息上增加了處理心跳消息的功能,做到了功能增強。

    (二十一)Exchangers

    該類跟Transporters的設計意圖是一樣的,Transporters我在《dubbo源碼解析(八)遠程通信——開篇》的(十)Transporters已經講到了。Exchangers也用到了外觀模式。代碼為就不貼了,可以對照著Transporters來看,很簡單。

    (二十二)Request

    請求模型類,最重要的肯定是模型的屬性,我們來看看屬性:

    /*** 心跳事件*/ public static final String HEARTBEAT_EVENT = null;/*** 只讀事件*/ public static final String READONLY_EVENT = "R";/*** 請求編號自增序列*/ private static final AtomicLong INVOKE_ID = new AtomicLong(0);/*** 請求編號*/ private final long mId;/*** dubbo版本*/ private String mVersion;/*** 是否需要響應*/ private boolean mTwoWay = true;/*** 是否是事件*/ private boolean mEvent = false;/*** 是否是異常的請求*/ private boolean mBroken = false;/*** 請求數據*/ private Object mData;
  • 由于心跳事件比較常用,所有設置為null。
  • 請求編號使用INVOKE_ID生成,是JVM 進程內唯一的。
  • 其他屬性比較簡單
  • (二十三)Response

    響應模型,來看看它的屬性:

    /*** 心跳事件*/ public static final String HEARTBEAT_EVENT = null;/*** 只讀事件*/ public static final String READONLY_EVENT = "R";/*** ok.* 成功狀態碼*/ public static final byte OK = 20;/*** clien side timeout.* 客戶端側的超時狀態碼*/ public static final byte CLIENT_TIMEOUT = 30;/*** server side timeout.* 服務端側超時的狀態碼*/ public static final byte SERVER_TIMEOUT = 31;/*** channel inactive, directly return the unfinished requests.* 通道不活躍,返回未完成請求的狀態碼*/ public static final byte CHANNEL_INACTIVE = 35;/*** request format error.* 請求格式錯誤狀態碼*/ public static final byte BAD_REQUEST = 40;/*** response format error.* 響應格式錯誤狀態碼*/ public static final byte BAD_RESPONSE = 50;/*** service not found.* 服務找不到狀態碼*/ public static final byte SERVICE_NOT_FOUND = 60;/*** service error.* 服務錯誤狀態碼*/ public static final byte SERVICE_ERROR = 70;/*** internal server error.* 內部服務器錯誤狀態碼*/ public static final byte SERVER_ERROR = 80;/*** internal server error.* 客戶端錯誤狀態碼*/ public static final byte CLIENT_ERROR = 90;/*** server side threadpool exhausted and quick return.* 服務器端線程池耗盡并快速返回狀態碼*/ public static final byte SERVER_THREADPOOL_EXHAUSTED_ERROR = 100;/*** 響應編號*/ private long mId = 0;/*** dubbo 版本*/ private String mVersion;/*** 狀態*/ private byte mStatus = OK;/*** 是否是事件*/ private boolean mEvent = false;/*** 錯誤信息*/ private String mErrorMsg;/*** 返回結果*/ private Object mResult;

    很多屬性跟Request模型的屬性一樣,并且含義也一樣,不過該模型多了很多的狀態碼。關鍵的是id跟請求一一對應。

    (二十四)ResponseCallback

    public interface ResponseCallback {/*** done.* 處理請求* @param response*/void done(Object response);/*** caught exception.* 處理異常* @param exception*/void caught(Throwable exception);}

    該接口是回調的接口,定義了兩個方法,分別是處理正常的響應結果和處理異常。

    (二十五)ExchangeCodec

    該類繼承了TelnetCodec,是信息交換編解碼器。在本文的開頭,我就寫到,dubbo將一條消息分成了協議頭和協議體,用來解決粘包拆包問題,但是頭跟體在編解碼上有區別,我們先來看看dubbo 的協議頭的配置:

    上圖是官方文檔的圖片,能夠清晰的看出協議中各個數據所占的位數:

  • 0-7位和8-15位:Magic High和Magic Low,類似java字節碼文件里的魔數,用來判斷是不是dubbo協議的數據包,就是一個固定的數字
  • 16位:Req/Res:請求還是響應標識。
  • 17位:2way:單向還是雙向
  • 18位:Event:是否是事件
  • 19-23位:Serialization 編號
  • 24-31位:status狀態
  • 32-95位:id編號
  • 96-127位:body數據
  • 128-…位:上圖表格內的數據
  • 可以看到一個該協議中前65位是協議頭,后面的都是協議體數據。那么在編解碼中,協議頭是通過 Codec 編解碼,而body部分是用Serialization序列化和反序列化的。下面我們就來看看該類對協議頭的編解碼。

    1.屬性

    // header length. /*** 協議頭長度:16字節 = 128Bits*/ protected static final int HEADER_LENGTH = 16; // magic header. /*** MAGIC二進制:1101101010111011,十進制:55995*/ protected static final short MAGIC = (short) 0xdabb; /*** Magic High,也就是0-7位:11011010*/ protected static final byte MAGIC_HIGH = Bytes.short2bytes(MAGIC)[0]; /*** Magic Low 8-15位 :10111011*/ protected static final byte MAGIC_LOW = Bytes.short2bytes(MAGIC)[1]; // message flag. /*** 128 二進制:10000000*/ protected static final byte FLAG_REQUEST = (byte) 0x80; /*** 64 二進制:1000000*/ protected static final byte FLAG_TWOWAY = (byte) 0x40; /*** 32 二進制:100000*/ protected static final byte FLAG_EVENT = (byte) 0x20; /*** 31 二進制:11111*/ protected static final int SERIALIZATION_MASK = 0x1f;

    可以看到 MAGIC是個固定的值,用來判斷是不是dubbo協議的數據包,并且MAGIC_LOW和MAGIC_HIGH分別是MAGIC的低位和高位。其他的屬性用來干嘛后面會講到。

    2.encode

    @Override public void encode(Channel channel, ChannelBuffer buffer, Object msg) throws IOException {if (msg instanceof Request) {// 如果消息是Request類型,對請求消息編碼encodeRequest(channel, buffer, (Request) msg);} else if (msg instanceof Response) {// 如果消息是Response類型,對響應消息編碼encodeResponse(channel, buffer, (Response) msg);} else {// 直接讓父類( Telnet ) 處理,目前是 Telnet 命令的結果。super.encode(channel, buffer, msg);} }

    該方法是根據消息的類型來分別進行編碼,分為三種情況:Request類型、Response類型以及其他

    3.encodeRequest

    protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request req) throws IOException {Serialization serialization = getSerialization(channel);// header.// 創建16字節的字節數組byte[] header = new byte[HEADER_LENGTH];// set magic number.// 設置前16位數據,也就是設置header[0]和header[1]的數據為Magic High和Magic LowBytes.short2bytes(MAGIC, header);// set request and serialization flag.// 16-23位為serialization編號,用到或運算10000000|serialization編號,例如serialization編號為11111,則為00011111header[2] = (byte) (FLAG_REQUEST | serialization.getContentTypeId());// 繼續上面的例子,00011111|1000000 = 01011111if (req.isTwoWay()) header[2] |= FLAG_TWOWAY;// 繼續上面的例子,01011111|100000 = 011 11111 可以看到011代表請求標記、雙向、是事件,這樣就設置了16、17、18位,后面19-23位是Serialization 編號if (req.isEvent()) header[2] |= FLAG_EVENT;// set request id.// 設置32-95位請求idBytes.long2bytes(req.getId(), header, 4);// encode request data.// // 編碼 `Request.data` 到 Body ,并寫入到 Bufferint savedWriteIndex = buffer.writerIndex();buffer.writerIndex(savedWriteIndex + HEADER_LENGTH);ChannelBufferOutputStream bos = new ChannelBufferOutputStream(buffer);// 對body數據序列化ObjectOutput out = serialization.serialize(channel.getUrl(), bos);// 如果該請求是事件if (req.isEvent()) {// 特殊事件編碼encodeEventData(channel, out, req.getData());} else {// 正常請求編碼encodeRequestData(channel, out, req.getData(), req.getVersion());}// 釋放資源out.flushBuffer();if (out instanceof Cleanable) {((Cleanable) out).cleanup();}bos.flush();bos.close();int len = bos.writtenBytes();//檢驗消息長度checkPayload(channel, len);// 設置96-127位:Body值Bytes.int2bytes(len, header, 12);// write// 把header寫入到bufferbuffer.writerIndex(savedWriteIndex);buffer.writeBytes(header); // write header.buffer.writerIndex(savedWriteIndex + HEADER_LENGTH + len); }

    該方法是對Request類型的消息進行編碼,仔細閱讀上述我寫的注解,結合協議頭各個位數的含義,好好品味我舉的例子。享受二進制位運算帶來的快樂,也可以看到前半部分邏輯是對協議頭的編碼,后面還有對body值的序列化。

    4.encodeResponse

    protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request req) throws IOException {Serialization serialization = getSerialization(channel);// header.// 創建16字節的字節數組byte[] header = new byte[HEADER_LENGTH];// set magic number.// 設置前16位數據,也就是設置header[0]和header[1]的數據為Magic High和Magic LowBytes.short2bytes(MAGIC, header);// set request and serialization flag.// 16-23位為serialization編號,用到或運算10000000|serialization編號,例如serialization編號為11111,則為00011111header[2] = (byte) (FLAG_REQUEST | serialization.getContentTypeId());// 繼續上面的例子,00011111|1000000 = 01011111if (req.isTwoWay()) header[2] |= FLAG_TWOWAY;// 繼續上面的例子,01011111|100000 = 011 11111 可以看到011代表請求標記、雙向、是事件,這樣就設置了16、17、18位,后面19-23位是Serialization 編號if (req.isEvent()) header[2] |= FLAG_EVENT;// set request id.// 設置32-95位請求idBytes.long2bytes(req.getId(), header, 4);// encode request data.// // 編碼 `Request.data` 到 Body ,并寫入到 Bufferint savedWriteIndex = buffer.writerIndex();buffer.writerIndex(savedWriteIndex + HEADER_LENGTH);ChannelBufferOutputStream bos = new ChannelBufferOutputStream(buffer);// 對body數據序列化ObjectOutput out = serialization.serialize(channel.getUrl(), bos);// 如果該請求是事件if (req.isEvent()) {// 特殊事件編碼encodeEventData(channel, out, req.getData());} else {// 正常請求編碼encodeRequestData(channel, out, req.getData(), req.getVersion());}// 釋放資源out.flushBuffer();if (out instanceof Cleanable) {((Cleanable) out).cleanup();}bos.flush();bos.close();int len = bos.writtenBytes();//檢驗消息長度checkPayload(channel, len);// 設置96-127位:Body值Bytes.int2bytes(len, header, 12);// write// 把header寫入到bufferbuffer.writerIndex(savedWriteIndex);buffer.writeBytes(header); // write header.buffer.writerIndex(savedWriteIndex + HEADER_LENGTH + len); }protected void encodeResponse(Channel channel, ChannelBuffer buffer, Response res) throws IOException {int savedWriteIndex = buffer.writerIndex();try {Serialization serialization = getSerialization(channel);// header.// 創建16字節大小的字節數組byte[] header = new byte[HEADER_LENGTH];// set magic number.// 設置前0-15位為魔數Bytes.short2bytes(MAGIC, header);// set request and serialization flag.// 設置響應標志和序列化idheader[2] = serialization.getContentTypeId();// 如果是心跳事件,則設置第18位為事件if (res.isHeartbeat()) header[2] |= FLAG_EVENT;// set response status.// 設置24-31位為狀態碼byte status = res.getStatus();header[3] = status;// set request id.// 設置32-95位為請求idBytes.long2bytes(res.getId(), header, 4);// 寫入數據buffer.writerIndex(savedWriteIndex + HEADER_LENGTH);ChannelBufferOutputStream bos = new ChannelBufferOutputStream(buffer);// 對body進行序列化ObjectOutput out = serialization.serialize(channel.getUrl(), bos);// encode response data or error message.if (status == Response.OK) {if (res.isHeartbeat()) {// 對心跳事件編碼encodeHeartbeatData(channel, out, res.getResult());} else {// 對普通響應編碼encodeResponseData(channel, out, res.getResult(), res.getVersion());}} else out.writeUTF(res.getErrorMessage());// 釋放out.flushBuffer();if (out instanceof Cleanable) {((Cleanable) out).cleanup();}bos.flush();bos.close();int len = bos.writtenBytes();checkPayload(channel, len);Bytes.int2bytes(len, header, 12);// writebuffer.writerIndex(savedWriteIndex);buffer.writeBytes(header); // write header.buffer.writerIndex(savedWriteIndex + HEADER_LENGTH + len);} catch (Throwable t) {// clear bufferbuffer.writerIndex(savedWriteIndex);// send error message to Consumer, otherwise, Consumer will wait till timeout.//如果在寫入數據失敗,則返回響應格式錯誤的返回碼if (!res.isEvent() && res.getStatus() != Response.BAD_RESPONSE) {Response r = new Response(res.getId(), res.getVersion());r.setStatus(Response.BAD_RESPONSE);if (t instanceof ExceedPayloadLimitException) {logger.warn(t.getMessage(), t);try {r.setErrorMessage(t.getMessage());// 發送響應channel.send(r);return;} catch (RemotingException e) {logger.warn("Failed to send bad_response info back: " + t.getMessage() + ", cause: " + e.getMessage(), e);}} else {// FIXME log error message in Codec and handle in caught() of IoHanndler?logger.warn("Fail to encode response: " + res + ", send bad_response info instead, cause: " + t.getMessage(), t);try {r.setErrorMessage("Failed to send response: " + res + ", cause: " + StringUtils.toString(t));channel.send(r);return;} catch (RemotingException e) {logger.warn("Failed to send bad_response info back: " + res + ", cause: " + e.getMessage(), e);}}}// Rethrow exceptionif (t instanceof IOException) {throw (IOException) t;} else if (t instanceof RuntimeException) {throw (RuntimeException) t;} else if (t instanceof Error) {throw (Error) t;} else {throw new RuntimeException(t.getMessage(), t);}} }

    該方法是對Response類型的消息進行編碼,該方法里面我沒有舉例子演示如何進行編碼,不過過程跟encodeRequest類似。

    5.decode

    @Override public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {int readable = buffer.readableBytes();// 讀取前16字節的協議頭數據,如果數據不滿16字節,則讀取全部byte[] header = new byte[Math.min(readable, HEADER_LENGTH)];buffer.readBytes(header);// 解碼return decode(channel, buffer, readable, header); }@Override protected Object decode(Channel channel, ChannelBuffer buffer, int readable, byte[] header) throws IOException {// check magic number.// 核對魔數(該數字固定)if (readable > 0 && header[0] != MAGIC_HIGH|| readable > 1 && header[1] != MAGIC_LOW) {int length = header.length;// 將 buffer 完全復制到 `header` 數組中if (header.length < readable) {header = Bytes.copyOf(header, readable);buffer.readBytes(header, length, readable - length);}for (int i = 1; i < header.length - 1; i++) {if (header[i] == MAGIC_HIGH && header[i + 1] == MAGIC_LOW) {buffer.readerIndex(buffer.readerIndex() - header.length + i);header = Bytes.copyOf(header, i);break;}}return super.decode(channel, buffer, readable, header);}// check length.// Header 長度不夠,返回需要更多的輸入,解決拆包現象if (readable < HEADER_LENGTH) {return DecodeResult.NEED_MORE_INPUT;}// get data length.int len = Bytes.bytes2int(header, 12);// 檢查信息頭長度checkPayload(channel, len);int tt = len + HEADER_LENGTH;// 總長度不夠,返回需要更多的輸入,解決拆包現象if (readable < tt) {return DecodeResult.NEED_MORE_INPUT;}// limit input stream.ChannelBufferInputStream is = new ChannelBufferInputStream(buffer, len);try {// 對body反序列化return decodeBody(channel, is, header);} finally {// 如果不可用if (is.available() > 0) {try {// 打印錯誤日志if (logger.isWarnEnabled()) {logger.warn("Skip input stream " + is.available());}// 跳過未讀完的流StreamUtils.skipUnusedStream(is);} catch (IOException e) {logger.warn(e.getMessage(), e);}}} }

    該方法就是解碼前的一些核對過程,包括檢測是否為dubbo協議,是否有拆包現象等,具體的解碼在decodeBody方法。

    6.decodeBody

    protected Object decodeBody(Channel channel, InputStream is, byte[] header) throws IOException {// 用并運算符byte flag = header[2], proto = (byte) (flag & SERIALIZATION_MASK);// get request id.// 獲得請求idlong id = Bytes.bytes2long(header, 4);// 如果第16位為0,則說明是響應if ((flag & FLAG_REQUEST) == 0) {// decode response.Response res = new Response(id);// 如果第18位不是0,則說明是心跳事件if ((flag & FLAG_EVENT) != 0) {res.setEvent(Response.HEARTBEAT_EVENT);}// get status.byte status = header[3];res.setStatus(status);try {ObjectInput in = CodecSupport.deserialize(channel.getUrl(), is, proto);// 如果響應是成功的if (status == Response.OK) {Object data;if (res.isHeartbeat()) {// 如果是心跳事件,則心跳事件的解碼data = decodeHeartbeatData(channel, in);} else if (res.isEvent()) {// 如果是事件,則事件的解碼data = decodeEventData(channel, in);} else {// 否則執行普通解碼data = decodeResponseData(channel, in, getRequestData(id));}// 重新設置響應結果res.setResult(data);} else {res.setErrorMessage(in.readUTF());}} catch (Throwable t) {res.setStatus(Response.CLIENT_ERROR);res.setErrorMessage(StringUtils.toString(t));}return res;} else {// decode request.// 對請求類型解碼Request req = new Request(id);// 設置版本號req.setVersion(Version.getProtocolVersion());// 如果第17位不為0,則是雙向req.setTwoWay((flag & FLAG_TWOWAY) != 0);// 如果18位不為0,則是心跳事件if ((flag & FLAG_EVENT) != 0) {req.setEvent(Request.HEARTBEAT_EVENT);}try {// 反序列化ObjectInput in = CodecSupport.deserialize(channel.getUrl(), is, proto);Object data;if (req.isHeartbeat()) {// 如果請求是心跳事件,則心跳事件解碼data = decodeHeartbeatData(channel, in);} else if (req.isEvent()) {// 如果是事件,則事件解碼data = decodeEventData(channel, in);} else {// 否則,用普通解碼data = decodeRequestData(channel, in);}// 把重新設置請求數據req.setData(data);} catch (Throwable t) {// bad request// 設置是異常請求req.setBroken(true);req.setData(t);}return req;} }

    該方法就是解碼的過程,并且對協議頭和協議體分開解碼,協議頭編碼是做或運算,而解碼則是做并運算,協議體用反序列化的方式解碼,同樣也是分為了Request類型、Response類型進行解碼。

    后記

    該部分相關的源碼解析地址:https://github.com/CrazyHZM/i...

    該文章講解了Exchange層的相關設計和邏輯、介紹dubbo-remoting-api中的exchange包內的源碼解,其中關鍵的是設計了Request和Response模型,整個信息交換都圍繞這兩大模型,并且設計了dubbo協議,解決拆包粘包問題,在信息交換中協議頭攜帶的信息起到了關鍵作用,也滿足了rpc調用的一些需求。下一篇我會講解遠程通信的buffer部分。如果我在哪一部分寫的不夠到位或者寫錯了,歡迎給我提意見,我的私人微信號碼:HUA799695226。

    總結

    以上是生活随笔為你收集整理的dubbo源码解析(十)远程通信——Exchange层的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    超碰97人人做人人爱少妇 | 国产精品久久久久影院嫩草 | 麻豆av传媒蜜桃天美传媒 | 日欧一片内射va在线影院 | 樱花草在线播放免费中文 | 麻豆国产丝袜白领秘书在线观看 | 国产激情艳情在线看视频 | 99久久婷婷国产综合精品青草免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 日本欧美一区二区三区乱码 | 久久久久亚洲精品中文字幕 | 一本久久伊人热热精品中文字幕 | 成人免费视频一区二区 | 国产精品第一国产精品 | 中文精品无码中文字幕无码专区 | 国产明星裸体无码xxxx视频 | 人人妻人人澡人人爽人人精品浪潮 | av香港经典三级级 在线 | 久9re热视频这里只有精品 | 久久久精品成人免费观看 | 欧美激情一区二区三区成人 | 久久午夜无码鲁丝片午夜精品 | 无码播放一区二区三区 | 亚洲精品成a人在线观看 | 男女性色大片免费网站 | 日本成熟视频免费视频 | 国产成人无码a区在线观看视频app | 未满小14洗澡无码视频网站 | 色一情一乱一伦一区二区三欧美 | 国产特级毛片aaaaaaa高清 | 99riav国产精品视频 | 免费人成在线观看网站 | 亚洲精品久久久久中文第一幕 | 国内揄拍国内精品少妇国语 | 久久久久久国产精品无码下载 | 国产成人人人97超碰超爽8 | 色五月五月丁香亚洲综合网 | 亚洲欧美日韩国产精品一区二区 | 国产va免费精品观看 | 欧美老熟妇乱xxxxx | 亚洲欧美日韩成人高清在线一区 | 亚洲乱亚洲乱妇50p | 男人和女人高潮免费网站 | 国产欧美熟妇另类久久久 | 成人精品一区二区三区中文字幕 | 日本又色又爽又黄的a片18禁 | 国产偷抇久久精品a片69 | 午夜精品久久久久久久久 | 狂野欧美性猛交免费视频 | 宝宝好涨水快流出来免费视频 | 99久久精品午夜一区二区 | 精品偷自拍另类在线观看 | 国产亚洲精品久久久久久国模美 | 久久久久人妻一区精品色欧美 | 中文字幕av日韩精品一区二区 | 亚洲熟妇色xxxxx欧美老妇 | 无码国模国产在线观看 | 野狼第一精品社区 | 丁香花在线影院观看在线播放 | 无码帝国www无码专区色综合 | 99久久精品日本一区二区免费 | 久久综合网欧美色妞网 | 色婷婷香蕉在线一区二区 | 波多野结衣av在线观看 | a片在线免费观看 | 午夜精品久久久内射近拍高清 | 一本久久伊人热热精品中文字幕 | 狠狠躁日日躁夜夜躁2020 | 国产激情无码一区二区app | 国产乱子伦视频在线播放 | 99久久人妻精品免费一区 | av无码久久久久不卡免费网站 | 无码人妻久久一区二区三区不卡 | 欧美三级不卡在线观看 | 国产一区二区不卡老阿姨 | 久久精品国产99精品亚洲 | 欧美自拍另类欧美综合图片区 | 亚洲综合精品香蕉久久网 | 中国女人内谢69xxxx | 亚洲狠狠色丁香婷婷综合 | 在线成人www免费观看视频 | 99精品无人区乱码1区2区3区 | 免费无码的av片在线观看 | 欧美国产日韩久久mv | 国产特级毛片aaaaaa高潮流水 | 日本肉体xxxx裸交 | 天天av天天av天天透 | 免费网站看v片在线18禁无码 | 大地资源网第二页免费观看 | 欧美人与禽猛交狂配 | 亚洲精品中文字幕久久久久 | 欧美日韩一区二区三区自拍 | 人人妻人人藻人人爽欧美一区 | 色一情一乱一伦 | 亚洲国产精品一区二区美利坚 | yw尤物av无码国产在线观看 | 中文字幕亚洲情99在线 | 牲欲强的熟妇农村老妇女视频 | 国模大胆一区二区三区 | 精品无码一区二区三区爱欲 | 又黄又爽又色的视频 | 狠狠躁日日躁夜夜躁2020 | 国产无套内射久久久国产 | 国内精品久久毛片一区二区 | 亚洲中文无码av永久不收费 | 一个人看的视频www在线 | 亚洲va中文字幕无码久久不卡 | 精品国产成人一区二区三区 | 啦啦啦www在线观看免费视频 | 内射后入在线观看一区 | 蜜臀av在线播放 久久综合激激的五月天 | 久久97精品久久久久久久不卡 | 亚洲aⅴ无码成人网站国产app | 无码一区二区三区在线 | 亚洲精品国偷拍自产在线麻豆 | 国产无套内射久久久国产 | 风流少妇按摩来高潮 | 狠狠色丁香久久婷婷综合五月 | 亚洲色www成人永久网址 | 欧美丰满老熟妇xxxxx性 | 欧美 丝袜 自拍 制服 另类 | 97色伦图片97综合影院 | 国产成人精品视频ⅴa片软件竹菊 | 最新国产麻豆aⅴ精品无码 | 天天躁夜夜躁狠狠是什么心态 | 精品国产aⅴ无码一区二区 | 99在线 | 亚洲 | 亚洲色欲色欲欲www在线 | 一本色道久久综合狠狠躁 | 亚洲乱亚洲乱妇50p | 日本精品久久久久中文字幕 | 成人影院yy111111在线观看 | 免费无码一区二区三区蜜桃大 | 女人色极品影院 | 亚欧洲精品在线视频免费观看 | 亚洲啪av永久无码精品放毛片 | 日韩av激情在线观看 | 精品久久8x国产免费观看 | 精品久久久无码中文字幕 | 亚洲国产精品一区二区第一页 | 亚洲男人av香蕉爽爽爽爽 | 一本无码人妻在中文字幕免费 | 欧美日本日韩 | 亚洲精品国产精品乱码视色 | 中文无码成人免费视频在线观看 | 国模大胆一区二区三区 | 欧美自拍另类欧美综合图片区 | 国产97色在线 | 免 | √天堂资源地址中文在线 | 无码人妻少妇伦在线电影 | 亚洲阿v天堂在线 | 少妇被黑人到高潮喷出白浆 | 精品国产麻豆免费人成网站 | 久久成人a毛片免费观看网站 | 伊人久久婷婷五月综合97色 | 男女作爱免费网站 | 亚洲爆乳大丰满无码专区 | 国产精华av午夜在线观看 | 蜜桃无码一区二区三区 | 色五月五月丁香亚洲综合网 | 人人妻人人澡人人爽欧美一区 | 亚洲日韩一区二区三区 | 成 人影片 免费观看 | 色综合久久久无码中文字幕 | 色综合久久久久综合一本到桃花网 | 久久亚洲国产成人精品性色 | 激情五月综合色婷婷一区二区 | 97久久精品无码一区二区 | 无码人妻精品一区二区三区下载 | 久久精品一区二区三区四区 | 国产无遮挡又黄又爽免费视频 | 亚洲国产精品无码一区二区三区 | 99久久人妻精品免费二区 | 人妻少妇精品无码专区二区 | 日韩av无码一区二区三区不卡 | 爆乳一区二区三区无码 | 国产一区二区不卡老阿姨 | 国产热a欧美热a在线视频 | 亚洲精品www久久久 | 国产精品免费大片 | 亚洲国产精品久久久天堂 | 免费网站看v片在线18禁无码 | 国产又粗又硬又大爽黄老大爷视 | 久久精品国产精品国产精品污 | 久久天天躁夜夜躁狠狠 | 国产午夜亚洲精品不卡 | 成人精品一区二区三区中文字幕 | 内射欧美老妇wbb | 国产精品无码成人午夜电影 | 国产成人精品视频ⅴa片软件竹菊 | 97久久超碰中文字幕 | 永久免费观看美女裸体的网站 | 欧美激情一区二区三区成人 | 精品国精品国产自在久国产87 | 欧美熟妇另类久久久久久多毛 | 性啪啪chinese东北女人 | 国产香蕉97碰碰久久人人 | 清纯唯美经典一区二区 | 毛片内射-百度 | 午夜免费福利小电影 | 欧美三级a做爰在线观看 | 领导边摸边吃奶边做爽在线观看 | 大肉大捧一进一出好爽视频 | 欧美第一黄网免费网站 | 97久久国产亚洲精品超碰热 | 国产凸凹视频一区二区 | 亚洲国产一区二区三区在线观看 | 亚洲国产成人a精品不卡在线 | 色妞www精品免费视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 99re在线播放 | av小次郎收藏 | 精品国产精品久久一区免费式 | 亚洲日本va午夜在线电影 | 两性色午夜免费视频 | 日本精品少妇一区二区三区 | 亚洲欧美国产精品专区久久 | 中文久久乱码一区二区 | 久久久国产精品无码免费专区 | 欧美熟妇另类久久久久久多毛 | 国产两女互慰高潮视频在线观看 | 国产午夜无码视频在线观看 | 大屁股大乳丰满人妻 | 精品无码av一区二区三区 | 日韩精品无码一本二本三本色 | 亚洲精品一区二区三区在线观看 | 小鲜肉自慰网站xnxx | 人人超人人超碰超国产 | 奇米影视888欧美在线观看 | 国产成人午夜福利在线播放 | аⅴ资源天堂资源库在线 | 亚洲 激情 小说 另类 欧美 | 精品午夜福利在线观看 | 亚洲一区二区三区在线观看网站 | 成人无码精品一区二区三区 | 久久国产自偷自偷免费一区调 | 97精品人妻一区二区三区香蕉 | 亚洲一区二区三区四区 | 狠狠躁日日躁夜夜躁2020 | 大地资源中文第3页 | 精品无码国产一区二区三区av | 久久精品国产亚洲精品 | 亚洲阿v天堂在线 | 久久 国产 尿 小便 嘘嘘 | 欧美乱妇无乱码大黄a片 | 一本久久伊人热热精品中文字幕 | 国内精品久久毛片一区二区 | 夜夜躁日日躁狠狠久久av | 精品国产aⅴ无码一区二区 | 亚洲欧美精品伊人久久 | 强辱丰满人妻hd中文字幕 | 麻豆md0077饥渴少妇 | 天堂а√在线中文在线 | 久久视频在线观看精品 | 国产电影无码午夜在线播放 | 精品一区二区三区无码免费视频 | 无遮挡国产高潮视频免费观看 | 国产在线精品一区二区三区直播 | 亚洲精品久久久久久久久久久 | 伊人久久大香线蕉亚洲 | 久久久久亚洲精品男人的天堂 | 女人被男人躁得好爽免费视频 | 野外少妇愉情中文字幕 | 亚洲理论电影在线观看 | 丰满少妇弄高潮了www | 性啪啪chinese东北女人 | 国产香蕉尹人视频在线 | 国产亚洲精品久久久久久国模美 | 久久综合九色综合欧美狠狠 | 国产精品-区区久久久狼 | 国产偷自视频区视频 | 一二三四在线观看免费视频 | 巨爆乳无码视频在线观看 | 久久综合久久自在自线精品自 | 欧美真人作爱免费视频 | 97人妻精品一区二区三区 | 久久久久亚洲精品男人的天堂 | 国产精品久久久 | 久久综合狠狠综合久久综合88 | 午夜精品久久久久久久 | 亚洲爆乳精品无码一区二区三区 | 无码乱肉视频免费大全合集 | 国产舌乚八伦偷品w中 | 国产电影无码午夜在线播放 | 草草网站影院白丝内射 | 性色欲网站人妻丰满中文久久不卡 | 秋霞特色aa大片 | 亚洲日韩一区二区三区 | 欧美日韩一区二区三区自拍 | 中文字幕无码av波多野吉衣 | 中文字幕无码人妻少妇免费 | 久久人人爽人人爽人人片ⅴ | 亚洲精品成a人在线观看 | 国产亚洲视频中文字幕97精品 | 亚洲午夜福利在线观看 | 狂野欧美激情性xxxx | 亚洲aⅴ无码成人网站国产app | 国产小呦泬泬99精品 | 久久久久久久人妻无码中文字幕爆 | 色欲久久久天天天综合网精品 | 国产在线精品一区二区三区直播 | 日本精品高清一区二区 | 水蜜桃色314在线观看 | 国产超级va在线观看视频 | 日本熟妇人妻xxxxx人hd | 久久综合给久久狠狠97色 | 激情人妻另类人妻伦 | 亚洲国产精品一区二区第一页 | a片在线免费观看 | 国产特级毛片aaaaaaa高清 | 少妇被黑人到高潮喷出白浆 | 精品国产国产综合精品 | 人人妻人人澡人人爽精品欧美 | 色综合视频一区二区三区 | 欧美老妇交乱视频在线观看 | 最近免费中文字幕中文高清百度 | 大肉大捧一进一出好爽视频 | 激情爆乳一区二区三区 | 久久99热只有频精品8 | 欧美xxxx黑人又粗又长 | 欧美人与禽zoz0性伦交 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产9 9在线 | 中文 | 无码人妻精品一区二区三区下载 | 5858s亚洲色大成网站www | 亚洲国产精品一区二区美利坚 | 熟女少妇在线视频播放 | 无码人妻丰满熟妇区毛片18 | 在线亚洲高清揄拍自拍一品区 | 亚洲男人av香蕉爽爽爽爽 | 日产精品高潮呻吟av久久 | 国产亚洲人成a在线v网站 | 福利一区二区三区视频在线观看 | 亚洲色www成人永久网址 | 少妇无码吹潮 | 成人欧美一区二区三区黑人免费 | 精品欧美一区二区三区久久久 | 兔费看少妇性l交大片免费 | 日本饥渴人妻欲求不满 | 1000部啪啪未满十八勿入下载 | 性欧美疯狂xxxxbbbb | 一本色道久久综合亚洲精品不卡 | 亚洲中文字幕无码中字 | 黑森林福利视频导航 | 又色又爽又黄的美女裸体网站 | 一本无码人妻在中文字幕免费 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产在线一区二区三区四区五区 | 在线视频网站www色 | 日韩精品a片一区二区三区妖精 | 秋霞成人午夜鲁丝一区二区三区 | 久久国产劲爆∧v内射 | 精品成在人线av无码免费看 | 黑人巨大精品欧美黑寡妇 | 精品少妇爆乳无码av无码专区 | 国产九九九九九九九a片 | 人妻夜夜爽天天爽三区 | 免费看男女做好爽好硬视频 | 久久国产精品二国产精品 | 中文字幕日产无线码一区 | 亚洲熟妇色xxxxx欧美老妇y | 初尝人妻少妇中文字幕 | 欧美性色19p | 国产精品无码永久免费888 | 无码纯肉视频在线观看 | 97无码免费人妻超级碰碰夜夜 | 亚洲精品欧美二区三区中文字幕 | 亚洲爆乳大丰满无码专区 | 亚洲成色在线综合网站 | 草草网站影院白丝内射 | 曰韩无码二三区中文字幕 | 色综合视频一区二区三区 | 亚洲中文字幕在线观看 | 国产精品久久精品三级 | 国产偷自视频区视频 | 亚洲综合色区中文字幕 | 精品成在人线av无码免费看 | 亚洲欧美精品伊人久久 | 4hu四虎永久在线观看 | 日本熟妇浓毛 | 国产精品多人p群无码 | 中文字幕日韩精品一区二区三区 | 精品国产一区二区三区av 性色 | 日本精品人妻无码免费大全 | 人人澡人人妻人人爽人人蜜桃 | 国产亚洲精品精品国产亚洲综合 | 久久精品中文字幕一区 | 亚洲精品成a人在线观看 | 成在人线av无码免观看麻豆 | 天天摸天天碰天天添 | 国产猛烈高潮尖叫视频免费 | 欧美黑人性暴力猛交喷水 | 高潮毛片无遮挡高清免费视频 | 成人欧美一区二区三区黑人免费 | 国产一区二区不卡老阿姨 | 亚洲无人区一区二区三区 | 欧洲熟妇精品视频 | 76少妇精品导航 | 18禁止看的免费污网站 | 亚洲精品国产精品乱码不卡 | 国产在线aaa片一区二区99 | 久久99久久99精品中文字幕 | 玩弄少妇高潮ⅹxxxyw | 少妇高潮一区二区三区99 | 欧美性生交xxxxx久久久 | 国产舌乚八伦偷品w中 | 国产午夜亚洲精品不卡下载 | 午夜精品久久久内射近拍高清 | 精品国产国产综合精品 | 精品一二三区久久aaa片 | 日日摸天天摸爽爽狠狠97 | 亚洲色成人中文字幕网站 | 亚洲热妇无码av在线播放 | 十八禁视频网站在线观看 | 亚洲区小说区激情区图片区 | 亚洲国产精品无码久久久久高潮 | 伊人色综合久久天天小片 | 国产后入清纯学生妹 | 老太婆性杂交欧美肥老太 | 在线精品国产一区二区三区 | 97资源共享在线视频 | 人妻熟女一区 | 曰韩无码二三区中文字幕 | 欧美 丝袜 自拍 制服 另类 | 成人三级无码视频在线观看 | 少妇性l交大片欧洲热妇乱xxx | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲精品国偷拍自产在线观看蜜桃 | 无码吃奶揉捏奶头高潮视频 | 伊人色综合久久天天小片 | 丁香啪啪综合成人亚洲 | 中文字幕人成乱码熟女app | 亚洲人成无码网www | 亚洲成a人片在线观看无码3d | 四虎4hu永久免费 | 水蜜桃亚洲一二三四在线 | 亚洲人交乣女bbw | 国产深夜福利视频在线 | 国产无遮挡吃胸膜奶免费看 | 亚洲一区av无码专区在线观看 | 300部国产真实乱 | 久久精品人人做人人综合试看 | 日本一区二区更新不卡 | 无码午夜成人1000部免费视频 | 成熟妇人a片免费看网站 | 国产真人无遮挡作爱免费视频 | 久久久久亚洲精品中文字幕 | 网友自拍区视频精品 | 国产精品无套呻吟在线 | 特黄特色大片免费播放器图片 | 日韩av无码中文无码电影 | 国产综合久久久久鬼色 | 亚洲中文字幕无码一久久区 | 亚洲乱码日产精品bd | 欧美变态另类xxxx | 欧美日本精品一区二区三区 | 亚洲日本在线电影 | 香港三级日本三级妇三级 | 成人影院yy111111在线观看 | 清纯唯美经典一区二区 | 永久免费观看美女裸体的网站 | 亚洲热妇无码av在线播放 | 久久无码中文字幕免费影院蜜桃 | 亚洲欧美中文字幕5发布 | 欧美 丝袜 自拍 制服 另类 | 亚无码乱人伦一区二区 | 成人无码视频免费播放 | 亚洲国产欧美日韩精品一区二区三区 | 免费人成在线观看网站 | 免费观看又污又黄的网站 | 99riav国产精品视频 | 黑人玩弄人妻中文在线 | 国产成人无码区免费内射一片色欲 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 波多野结衣av一区二区全免费观看 | 国产无套粉嫩白浆在线 | 中文字幕乱码人妻二区三区 | 少妇厨房愉情理9仑片视频 | 55夜色66夜色国产精品视频 | 麻豆国产丝袜白领秘书在线观看 | 成熟妇人a片免费看网站 | 激情爆乳一区二区三区 | 国产成人一区二区三区别 | 国产免费观看黄av片 | 欧美黑人乱大交 | 中文字幕乱码亚洲无线三区 | 免费无码av一区二区 | 黑人巨大精品欧美一区二区 | 一本久久a久久精品vr综合 | 偷窥日本少妇撒尿chinese | 秋霞成人午夜鲁丝一区二区三区 | 久久精品无码一区二区三区 | 高潮喷水的毛片 | 特黄特色大片免费播放器图片 | 欧美熟妇另类久久久久久多毛 | 黑森林福利视频导航 | 久久久www成人免费毛片 | 2020最新国产自产精品 | 老头边吃奶边弄进去呻吟 | 成熟人妻av无码专区 | 色婷婷av一区二区三区之红樱桃 | 亚洲一区二区三区国产精华液 | 国内揄拍国内精品人妻 | 久久久久免费精品国产 | 300部国产真实乱 | 97se亚洲精品一区 | 国产激情精品一区二区三区 | 无码任你躁久久久久久久 | 亚洲 a v无 码免 费 成 人 a v | 人妻少妇精品视频专区 | 欧美色就是色 | 99精品久久毛片a片 | 欧美35页视频在线观看 | 乱码av麻豆丝袜熟女系列 | 国产人妻久久精品二区三区老狼 | 久久婷婷五月综合色国产香蕉 | 给我免费的视频在线观看 | 国产精品自产拍在线观看 | 久久97精品久久久久久久不卡 | 青青青手机频在线观看 | 国产在热线精品视频 | 国产农村妇女高潮大叫 | 亚洲日韩av一区二区三区四区 | 亚洲春色在线视频 | 亚洲一区二区三区含羞草 | 装睡被陌生人摸出水好爽 | 中文字幕人妻丝袜二区 | 蜜臀av无码人妻精品 | 国产猛烈高潮尖叫视频免费 | 成在人线av无码免观看麻豆 | 国产做国产爱免费视频 | 99国产欧美久久久精品 | 强伦人妻一区二区三区视频18 | 久久人人97超碰a片精品 | 天天摸天天碰天天添 | 国产精品亚洲一区二区三区喷水 | 久久久精品欧美一区二区免费 | 国产suv精品一区二区五 | 免费中文字幕日韩欧美 | 影音先锋中文字幕无码 | 亚洲 a v无 码免 费 成 人 a v | 国产肉丝袜在线观看 | 亚洲国精产品一二二线 | 18无码粉嫩小泬无套在线观看 | 天干天干啦夜天干天2017 | 成熟女人特级毛片www免费 | 欧美黑人性暴力猛交喷水 | 国产精品无码一区二区桃花视频 | 一个人看的视频www在线 | 99久久婷婷国产综合精品青草免费 | 国产亚洲tv在线观看 | 乱人伦人妻中文字幕无码久久网 | 欧美喷潮久久久xxxxx | 天堂а√在线中文在线 | 国产免费无码一区二区视频 | 国产xxx69麻豆国语对白 | 国产精品久久福利网站 | 亚洲国产欧美日韩精品一区二区三区 | 国内精品人妻无码久久久影院 | 在线观看免费人成视频 | 欧美黑人性暴力猛交喷水 | 亚洲色成人中文字幕网站 | 人人妻人人澡人人爽欧美一区九九 | 97精品国产97久久久久久免费 | 国产精品久久久午夜夜伦鲁鲁 | 日韩av无码一区二区三区不卡 | 成人亚洲精品久久久久 | 国产偷自视频区视频 | 亚洲中文字幕va福利 | 牲欲强的熟妇农村老妇女视频 | 国产av无码专区亚洲awww | 鲁鲁鲁爽爽爽在线视频观看 | 内射爽无广熟女亚洲 | 亚洲国产欧美在线成人 | 亚洲人成影院在线无码按摩店 | 久久精品国产99久久6动漫 | 乱人伦人妻中文字幕无码 | 亚洲一区二区三区国产精华液 | 国产熟妇高潮叫床视频播放 | 夜夜夜高潮夜夜爽夜夜爰爰 | 高潮毛片无遮挡高清免费视频 | 亚洲精品一区三区三区在线观看 | 性欧美疯狂xxxxbbbb | 天堂а√在线中文在线 | 亚洲成av人综合在线观看 | 在线播放无码字幕亚洲 | 娇妻被黑人粗大高潮白浆 | 国产精品无码一区二区桃花视频 | 欧美高清在线精品一区 | 久久午夜无码鲁丝片午夜精品 | 亚洲gv猛男gv无码男同 | 无码福利日韩神码福利片 | 亚洲热妇无码av在线播放 | 亚洲中文字幕在线无码一区二区 | 国产无套粉嫩白浆在线 | 国产精品欧美成人 | 亚洲人亚洲人成电影网站色 | 人妻天天爽夜夜爽一区二区 | 国产精品亚洲综合色区韩国 | 日本一本二本三区免费 | 女人被爽到呻吟gif动态图视看 | 午夜性刺激在线视频免费 | 国产片av国语在线观看 | 国产成人av免费观看 | av人摸人人人澡人人超碰下载 | 日本高清一区免费中文视频 | 76少妇精品导航 | 国产无遮挡吃胸膜奶免费看 | 亚洲国产精品毛片av不卡在线 | 乱码av麻豆丝袜熟女系列 | 亚洲自偷自拍另类第1页 | 人妻少妇精品久久 | 99久久99久久免费精品蜜桃 | 成人欧美一区二区三区黑人免费 | 丰满人妻一区二区三区免费视频 | 国产麻豆精品精东影业av网站 | 色情久久久av熟女人妻网站 | 国产乱子伦视频在线播放 | 国产97人人超碰caoprom | 久久久久成人片免费观看蜜芽 | 亚洲男人av香蕉爽爽爽爽 | 成人亚洲精品久久久久 | 中文毛片无遮挡高清免费 | 日本又色又爽又黄的a片18禁 | 欧美精品免费观看二区 | 国产成人精品视频ⅴa片软件竹菊 | 成人亚洲精品久久久久软件 | 少妇被粗大的猛进出69影院 | 人妻中文无码久热丝袜 | 亲嘴扒胸摸屁股激烈网站 | 中文字幕无码乱人伦 | 妺妺窝人体色www婷婷 | 欧美丰满少妇xxxx性 | 精品国产麻豆免费人成网站 | 久久人人爽人人爽人人片av高清 | 亚洲成av人片天堂网无码】 | 女人和拘做爰正片视频 | 亚洲中文无码av永久不收费 | 呦交小u女精品视频 | 色综合久久久无码中文字幕 | 一本大道久久东京热无码av | 亚洲男人av天堂午夜在 | 任你躁国产自任一区二区三区 | 蜜臀av在线播放 久久综合激激的五月天 | 欧美35页视频在线观看 | 精品亚洲韩国一区二区三区 | 久久人妻内射无码一区三区 | 国产午夜无码视频在线观看 | 鲁鲁鲁爽爽爽在线视频观看 | 国产97色在线 | 免 | 免费无码肉片在线观看 | 色综合久久久无码中文字幕 | 永久免费精品精品永久-夜色 | 精品国产成人一区二区三区 | 亚洲中文字幕久久无码 | 午夜性刺激在线视频免费 | 久久久久成人精品免费播放动漫 | 免费乱码人妻系列无码专区 | 久久人人爽人人爽人人片av高清 | 性色欲网站人妻丰满中文久久不卡 | 久久精品丝袜高跟鞋 | 久久99久久99精品中文字幕 | 老熟女重囗味hdxx69 | 亚洲成色www久久网站 | 女人被男人躁得好爽免费视频 | 99er热精品视频 | 永久黄网站色视频免费直播 | 国产成人精品必看 | 午夜成人1000部免费视频 | 在线观看国产一区二区三区 | 在线天堂新版最新版在线8 | 成人片黄网站色大片免费观看 | 亚洲精品国产a久久久久久 | 亚无码乱人伦一区二区 | 一区二区三区高清视频一 | 精品国偷自产在线视频 | 亚洲gv猛男gv无码男同 | 久久无码中文字幕免费影院蜜桃 | 久久亚洲中文字幕精品一区 | 国内少妇偷人精品视频免费 | 日本一卡2卡3卡四卡精品网站 | 丰满诱人的人妻3 | 国产乱人偷精品人妻a片 | 亚洲中文字幕无码中文字在线 | 亚洲男人av香蕉爽爽爽爽 | 午夜精品一区二区三区在线观看 | 国产综合色产在线精品 | 欧美日韩色另类综合 | 夜夜影院未满十八勿进 | 亚洲精品成人福利网站 | 欧美熟妇另类久久久久久不卡 | 人妻无码久久精品人妻 | 在线精品国产一区二区三区 | 18禁止看的免费污网站 | 综合人妻久久一区二区精品 | 久久精品丝袜高跟鞋 | 性色欲情网站iwww九文堂 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲成av人在线观看网址 | 高潮毛片无遮挡高清免费视频 | 色妞www精品免费视频 | 亚洲第一网站男人都懂 | 国产精品嫩草久久久久 | 日韩少妇内射免费播放 | 老头边吃奶边弄进去呻吟 | 国产偷抇久久精品a片69 | 亚洲熟妇自偷自拍另类 | 精品aⅴ一区二区三区 | 亚洲一区二区三区香蕉 | 人妻无码久久精品人妻 | 精品乱码久久久久久久 | 国产精品无码一区二区桃花视频 | 日日碰狠狠躁久久躁蜜桃 | 国产婷婷色一区二区三区在线 | 动漫av一区二区在线观看 | 国产精品久久国产三级国 | 日韩少妇内射免费播放 | 久激情内射婷内射蜜桃人妖 | 欧美精品一区二区精品久久 | 成人无码精品1区2区3区免费看 | 激情爆乳一区二区三区 | 狠狠色欧美亚洲狠狠色www | 欧美日本免费一区二区三区 | 欧美日韩一区二区综合 | 精品久久8x国产免费观看 | 成人片黄网站色大片免费观看 | 欧美 亚洲 国产 另类 | 精品少妇爆乳无码av无码专区 | 亚洲 a v无 码免 费 成 人 a v | 55夜色66夜色国产精品视频 | 久久精品国产一区二区三区肥胖 | 免费观看又污又黄的网站 | 久久无码专区国产精品s | 影音先锋中文字幕无码 | 中文字幕精品av一区二区五区 | 美女黄网站人色视频免费国产 | 亚洲国产一区二区三区在线观看 | a国产一区二区免费入口 | 亚洲精品国产精品乱码不卡 | 国产午夜手机精彩视频 | 国产又粗又硬又大爽黄老大爷视 | 日日干夜夜干 | 男女性色大片免费网站 | 玩弄中年熟妇正在播放 | 爆乳一区二区三区无码 | аⅴ资源天堂资源库在线 | 黑人粗大猛烈进出高潮视频 | 国产口爆吞精在线视频 | 亚洲一区二区三区四区 | 国产熟妇高潮叫床视频播放 | 日本va欧美va欧美va精品 | 少妇无套内谢久久久久 | 亚洲精品中文字幕乱码 | 成人av无码一区二区三区 | 99久久人妻精品免费二区 | 欧美黑人性暴力猛交喷水 | 久久视频在线观看精品 | 国产成人精品三级麻豆 | 欧美freesex黑人又粗又大 | 无码人妻少妇伦在线电影 | 露脸叫床粗话东北少妇 | 成人aaa片一区国产精品 | 大色综合色综合网站 | 亚洲啪av永久无码精品放毛片 | 亚洲欧美日韩成人高清在线一区 | 无码国模国产在线观看 | 亚洲乱码中文字幕在线 | 老司机亚洲精品影院无码 | 免费视频欧美无人区码 | 中文字幕无码免费久久99 | 久久亚洲日韩精品一区二区三区 | 国产国产精品人在线视 | 国产亚洲美女精品久久久2020 | 久久成人a毛片免费观看网站 | 中文字幕人成乱码熟女app | 全球成人中文在线 | 亚洲の无码国产の无码影院 | 国产乱码精品一品二品 | 又粗又大又硬又长又爽 | 久久精品国产精品国产精品污 | 久久人人爽人人人人片 | 九九热爱视频精品 | 国语精品一区二区三区 | 精品无人区无码乱码毛片国产 | 在教室伦流澡到高潮hnp视频 | 伊人久久大香线蕉午夜 | 精品久久综合1区2区3区激情 | 亚洲精品成人福利网站 | 亚洲日本va午夜在线电影 | 无码精品国产va在线观看dvd | 色一情一乱一伦 | 成人欧美一区二区三区 | 国产无遮挡又黄又爽又色 | 色五月五月丁香亚洲综合网 | 国产人妻精品一区二区三区不卡 | 乌克兰少妇xxxx做受 | 亚洲欧美日韩成人高清在线一区 | 狠狠色噜噜狠狠狠狠7777米奇 | 日韩av无码中文无码电影 | 亚洲一区二区三区偷拍女厕 | 国产麻豆精品一区二区三区v视界 | 国产精品无码mv在线观看 | 国产高清av在线播放 | 大肉大捧一进一出视频出来呀 | 亚洲aⅴ无码成人网站国产app | 无码国模国产在线观看 | 久久久久国色av免费观看性色 | 好屌草这里只有精品 | 亚洲人成影院在线无码按摩店 | 装睡被陌生人摸出水好爽 | 久久久成人毛片无码 | 最近免费中文字幕中文高清百度 | 欧美日韩精品 | 女人高潮内射99精品 | 东京热男人av天堂 | 十八禁视频网站在线观看 | 国产精品成人av在线观看 | 亚洲日韩中文字幕在线播放 | 亚洲乱码国产乱码精品精 | 久久 国产 尿 小便 嘘嘘 | 欧美自拍另类欧美综合图片区 | 亚洲国精产品一二二线 | 亚洲综合色区中文字幕 | 欧美怡红院免费全部视频 | 久久久婷婷五月亚洲97号色 | 成人aaa片一区国产精品 | 国产 精品 自在自线 | 在线成人www免费观看视频 | 国产成人亚洲综合无码 | 免费看男女做好爽好硬视频 | 欧美三级不卡在线观看 | 精品国产一区二区三区四区在线看 | 亚洲精品国产精品乱码不卡 | 人妻插b视频一区二区三区 | 无码av中文字幕免费放 | 国产精品久久久久无码av色戒 | 日本熟妇浓毛 | 国产精品久久国产精品99 | 亚洲综合另类小说色区 | 日日橹狠狠爱欧美视频 | 老熟妇仑乱视频一区二区 | 丰满少妇弄高潮了www | 少妇高潮一区二区三区99 | 一本久久伊人热热精品中文字幕 | 老司机亚洲精品影院 | 亚洲欧美日韩国产精品一区二区 | 大肉大捧一进一出好爽视频 | 欧美人与动性行为视频 | a在线亚洲男人的天堂 | 亚洲日本va午夜在线电影 | 国产电影无码午夜在线播放 | 免费网站看v片在线18禁无码 | 久久亚洲中文字幕精品一区 | 久久久久成人片免费观看蜜芽 | 精品国精品国产自在久国产87 | 夜夜夜高潮夜夜爽夜夜爰爰 | 精品久久8x国产免费观看 | 久久熟妇人妻午夜寂寞影院 | 久久成人a毛片免费观看网站 | 东京热一精品无码av | 日本精品人妻无码77777 天堂一区人妻无码 | 日韩av激情在线观看 | 亚洲狠狠色丁香婷婷综合 | 无码av中文字幕免费放 | 一个人免费观看的www视频 | 免费国产成人高清在线观看网站 | 久久国产36精品色熟妇 | 99久久精品国产一区二区蜜芽 | 综合人妻久久一区二区精品 | 中文字幕人妻无码一夲道 | 国产精品人人妻人人爽 | 99国产精品白浆在线观看免费 | 黑人玩弄人妻中文在线 | 国产在线精品一区二区三区直播 | 东京热无码av男人的天堂 | 久热国产vs视频在线观看 | 性生交片免费无码看人 | 日韩欧美群交p片內射中文 | 激情综合激情五月俺也去 | 中文字幕中文有码在线 | 夜精品a片一区二区三区无码白浆 | 欧美放荡的少妇 | 亚洲国产欧美日韩精品一区二区三区 | 日韩视频 中文字幕 视频一区 | 国产成人精品久久亚洲高清不卡 | 国产精品久久国产三级国 | 亚洲综合在线一区二区三区 | 精品日本一区二区三区在线观看 | 精品一二三区久久aaa片 | 日韩精品一区二区av在线 | 999久久久国产精品消防器材 | 亚洲成av人在线观看网址 | 无码av免费一区二区三区试看 | 亚洲精品一区二区三区在线 | 欧美午夜特黄aaaaaa片 | 亚洲国产精品无码久久久久高潮 | 极品尤物被啪到呻吟喷水 | 老子影院午夜伦不卡 | 一区二区三区高清视频一 | 18精品久久久无码午夜福利 | 黑人粗大猛烈进出高潮视频 | 在线欧美精品一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 无码一区二区三区在线 | 日韩欧美中文字幕公布 | 国产日产欧产精品精品app | 国产激情一区二区三区 | 欧美 日韩 亚洲 在线 | 玩弄少妇高潮ⅹxxxyw | 亚洲欧美日韩国产精品一区二区 | 国产偷国产偷精品高清尤物 | 国产麻豆精品一区二区三区v视界 | 5858s亚洲色大成网站www | 亚洲日韩一区二区三区 | 十八禁视频网站在线观看 | 亚洲va欧美va天堂v国产综合 | 久久精品人人做人人综合试看 | av人摸人人人澡人人超碰下载 | 国产精品人妻一区二区三区四 | 欧美 日韩 亚洲 在线 | 亚洲人成影院在线无码按摩店 | 99久久人妻精品免费一区 | 亚洲男女内射在线播放 | 欧美兽交xxxx×视频 | 国产亚洲日韩欧美另类第八页 | 久久99精品久久久久久 | 黑人巨大精品欧美黑寡妇 | 精品成在人线av无码免费看 | 日本熟妇大屁股人妻 | 无码人妻av免费一区二区三区 | 成人精品视频一区二区三区尤物 | 成人欧美一区二区三区黑人免费 | 国产精品鲁鲁鲁 | 国内精品一区二区三区不卡 | 一本久久伊人热热精品中文字幕 | 国产一区二区不卡老阿姨 | 亚洲日韩精品欧美一区二区 | 久久人人爽人人人人片 | 性欧美牲交xxxxx视频 | 国产一区二区三区日韩精品 | 无码精品人妻一区二区三区av | 久久精品国产日本波多野结衣 | 欧美xxxx黑人又粗又长 | 国产一区二区不卡老阿姨 | 国产亚洲精品精品国产亚洲综合 | 中文字幕 亚洲精品 第1页 | 日韩av无码中文无码电影 | 亲嘴扒胸摸屁股激烈网站 | 亚洲熟妇自偷自拍另类 | 色一情一乱一伦一区二区三欧美 | 成人亚洲精品久久久久软件 | 亚洲区小说区激情区图片区 | 美女极度色诱视频国产 | 丰满少妇熟乱xxxxx视频 | 日韩亚洲欧美精品综合 | 黑人大群体交免费视频 | 亚洲精品午夜国产va久久成人 | 亚洲人交乣女bbw | 18黄暴禁片在线观看 | 亚洲国产精华液网站w | 正在播放东北夫妻内射 | 中文字幕日韩精品一区二区三区 | 欧美三级a做爰在线观看 | aa片在线观看视频在线播放 | 精品少妇爆乳无码av无码专区 | 天堂一区人妻无码 | 国产精品嫩草久久久久 | 国产绳艺sm调教室论坛 | 强开小婷嫩苞又嫩又紧视频 | 曰韩无码二三区中文字幕 | 无码乱肉视频免费大全合集 | 久久人人爽人人爽人人片av高清 | 国产美女精品一区二区三区 | 日韩欧美成人免费观看 | 中文字幕无码免费久久9一区9 | 国产亚洲欧美日韩亚洲中文色 | 精品一区二区三区无码免费视频 | 国产做国产爱免费视频 | 国产精品久久久久久亚洲影视内衣 | 一区二区三区高清视频一 | 久久成人a毛片免费观看网站 | 国产人妻大战黑人第1集 | 欧洲熟妇色 欧美 | 欧美日韩在线亚洲综合国产人 | 欧洲精品码一区二区三区免费看 | 无码人妻av免费一区二区三区 | 亚洲精品国产第一综合99久久 | 国产午夜无码视频在线观看 | 日韩成人一区二区三区在线观看 | 久久精品国产日本波多野结衣 | 国产亲子乱弄免费视频 | 粉嫩少妇内射浓精videos | 天堂а√在线地址中文在线 | 中文字幕无码免费久久9一区9 | 2020最新国产自产精品 | 国産精品久久久久久久 | 精品一区二区三区无码免费视频 | 青青久在线视频免费观看 | 国产人妻精品一区二区三区 | 成人精品一区二区三区中文字幕 | 丰满少妇人妻久久久久久 | 国产黄在线观看免费观看不卡 | 在线观看免费人成视频 | 久久亚洲日韩精品一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 秋霞特色aa大片 | 日本精品高清一区二区 | 日韩av激情在线观看 | 久久久久成人片免费观看蜜芽 | 久青草影院在线观看国产 | 欧美日韩一区二区免费视频 | 亚洲人亚洲人成电影网站色 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产suv精品一区二区五 | 中文字幕日韩精品一区二区三区 | 亚洲午夜福利在线观看 | www国产精品内射老师 | 国产精品久久精品三级 | 国产成人无码av一区二区 | 亚洲成av人片在线观看无码不卡 | 久久国产自偷自偷免费一区调 | 极品尤物被啪到呻吟喷水 | 亚洲毛片av日韩av无码 | 成人亚洲精品久久久久 | 亚洲国产一区二区三区在线观看 | 欧美成人免费全部网站 | 亚洲七七久久桃花影院 | 国产激情精品一区二区三区 | 奇米影视888欧美在线观看 | 久久综合网欧美色妞网 | 国产乱子伦视频在线播放 | 国产精品高潮呻吟av久久 | 欧美 日韩 亚洲 在线 | 国产乱码精品一品二品 | 麻豆精品国产精华精华液好用吗 | 久久精品国产一区二区三区 | 最新版天堂资源中文官网 | av无码不卡在线观看免费 | 中文精品无码中文字幕无码专区 | 亚洲爆乳无码专区 | 精品亚洲成av人在线观看 | 麻花豆传媒剧国产免费mv在线 | 99精品无人区乱码1区2区3区 | 水蜜桃亚洲一二三四在线 | 两性色午夜视频免费播放 | 国产又爽又黄又刺激的视频 | 精品久久久无码人妻字幂 | 国产av久久久久精东av | 国产激情无码一区二区app | 久久无码人妻影院 | 乱中年女人伦av三区 | 四虎影视成人永久免费观看视频 | 精品偷拍一区二区三区在线看 | 国产香蕉尹人综合在线观看 | 精品日本一区二区三区在线观看 | 国产精品久久久久无码av色戒 | 在教室伦流澡到高潮hnp视频 | 亚洲一区二区三区香蕉 | 无码人妻av免费一区二区三区 | 在线a亚洲视频播放在线观看 | 亚洲日韩中文字幕在线播放 | 亚洲成a人片在线观看无码 | 麻豆精产国品 | 中文字幕av日韩精品一区二区 | 亚洲一区二区三区在线观看网站 | 中文精品无码中文字幕无码专区 | 国语自产偷拍精品视频偷 | 国产av无码专区亚洲a∨毛片 | 成人试看120秒体验区 | 未满小14洗澡无码视频网站 | 亚洲 a v无 码免 费 成 人 a v | 国产亚洲欧美在线专区 | 奇米影视7777久久精品人人爽 | 天天拍夜夜添久久精品 | 国产亚洲精品久久久久久 | 国产肉丝袜在线观看 | 爆乳一区二区三区无码 | 中文精品无码中文字幕无码专区 | 久久精品成人欧美大片 | 国产真实夫妇视频 | 久久精品国产精品国产精品污 | 国产又爽又黄又刺激的视频 | 欧洲vodafone精品性 | 国产人妻大战黑人第1集 | 国产精品无码永久免费888 | 成人av无码一区二区三区 | 免费中文字幕日韩欧美 | 俺去俺来也www色官网 | 国产精品福利视频导航 | 一本色道久久综合狠狠躁 | 欧美熟妇另类久久久久久多毛 | 中文字幕无码av波多野吉衣 | 亚洲午夜无码久久 | 国产一区二区三区日韩精品 | 国产精品高潮呻吟av久久 | 欧美35页视频在线观看 | 国产成人综合色在线观看网站 | 久久精品国产亚洲精品 | 装睡被陌生人摸出水好爽 | 任你躁在线精品免费 | 一本无码人妻在中文字幕免费 | 人妻少妇精品久久 | 欧美人妻一区二区三区 | 国产一区二区三区精品视频 | 国产成人综合在线女婷五月99播放 | 免费无码的av片在线观看 | 日本熟妇浓毛 | 欧美日韩一区二区免费视频 | 亚洲日韩av一区二区三区四区 | 丰满少妇人妻久久久久久 | 国产午夜无码视频在线观看 | 性生交片免费无码看人 | 亚洲 欧美 激情 小说 另类 | 亚洲色www成人永久网址 | 成人av无码一区二区三区 | 国产亚洲精品久久久久久 | 熟妇人妻无乱码中文字幕 | 久久综合给合久久狠狠狠97色 | 欧美性生交活xxxxxdddd | 性生交大片免费看女人按摩摩 | 国产精品二区一区二区aⅴ污介绍 | 国产精品久久久午夜夜伦鲁鲁 | 97无码免费人妻超级碰碰夜夜 | 在线a亚洲视频播放在线观看 | 三级4级全黄60分钟 | 久久综合九色综合欧美狠狠 | 在线欧美精品一区二区三区 | 久久国产精品二国产精品 | 妺妺窝人体色www婷婷 | 狂野欧美性猛xxxx乱大交 | 天堂无码人妻精品一区二区三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产在线精品一区二区三区直播 | 国产在线无码精品电影网 | 波多野结衣乳巨码无在线观看 | 日本在线高清不卡免费播放 | 国产精品高潮呻吟av久久4虎 | 99久久无码一区人妻 | 内射巨臀欧美在线视频 | 久久综合色之久久综合 | 纯爱无遮挡h肉动漫在线播放 | 久久无码中文字幕免费影院蜜桃 | 久久国产精品二国产精品 | 日本熟妇乱子伦xxxx | 久久久中文久久久无码 | 亚洲熟熟妇xxxx | 无码国产乱人伦偷精品视频 | 国产婷婷色一区二区三区在线 | 呦交小u女精品视频 | 久久99精品国产.久久久久 | 帮老师解开蕾丝奶罩吸乳网站 | 国产超碰人人爽人人做人人添 | 婷婷综合久久中文字幕蜜桃三电影 | 天堂а√在线地址中文在线 | 中文字幕无码视频专区 | 无码国产激情在线观看 | 久久五月精品中文字幕 | 久久这里只有精品视频9 | 粗大的内捧猛烈进出视频 | 久久久国产一区二区三区 | 亚洲熟悉妇女xxx妇女av | 鲁鲁鲁爽爽爽在线视频观看 | 欧美国产日韩久久mv | 欧美性色19p | 性欧美疯狂xxxxbbbb | 丰满妇女强制高潮18xxxx | 牲欲强的熟妇农村老妇女 | 乱人伦人妻中文字幕无码久久网 | 伊人久久大香线蕉亚洲 | 露脸叫床粗话东北少妇 | 一本久道高清无码视频 | 无码免费一区二区三区 | 亚洲国产精品一区二区第一页 | 全球成人中文在线 | 未满成年国产在线观看 | 精品久久久无码中文字幕 | 欧美日韩视频无码一区二区三 | 成年女人永久免费看片 | 蜜桃无码一区二区三区 | 又色又爽又黄的美女裸体网站 | 久久99久久99精品中文字幕 | 中文字幕乱码人妻二区三区 | www国产亚洲精品久久网站 | 午夜精品一区二区三区的区别 | 18禁黄网站男男禁片免费观看 | 国产成人人人97超碰超爽8 | 中文字幕乱码人妻二区三区 | 波多野42部无码喷潮在线 | 国产成人无码av片在线观看不卡 | 亚洲成色www久久网站 | 国产舌乚八伦偷品w中 | 久久精品国产一区二区三区肥胖 | 人人超人人超碰超国产 | 久久国产劲爆∧v内射 | 永久黄网站色视频免费直播 | 最近免费中文字幕中文高清百度 | 精品国产国产综合精品 | 国产特级毛片aaaaaaa高清 | 双乳奶水饱满少妇呻吟 | 国产三级精品三级男人的天堂 | 亚洲中文字幕va福利 | 亚洲成色www久久网站 | 天下第一社区视频www日本 | 亚无码乱人伦一区二区 | 国产激情一区二区三区 | 中文字幕av日韩精品一区二区 | 亚洲色欲色欲欲www在线 | 欧洲极品少妇 | 亚洲国产成人av在线观看 | 国产人妻久久精品二区三区老狼 | 女人被男人爽到呻吟的视频 | 狠狠色丁香久久婷婷综合五月 | 特级做a爰片毛片免费69 | 欧美丰满少妇xxxx性 | 国产人妻精品一区二区三区 | 亚洲国产欧美在线成人 | 精品国精品国产自在久国产87 | 丰满少妇熟乱xxxxx视频 | 国产精品久久久久9999小说 | 久久综合色之久久综合 | 欧美阿v高清资源不卡在线播放 | 国产精品视频免费播放 | 国产欧美熟妇另类久久久 | 久久久www成人免费毛片 | 激情内射亚州一区二区三区爱妻 | 97色伦图片97综合影院 | 蜜臀aⅴ国产精品久久久国产老师 | 熟妇人妻无乱码中文字幕 | 久久久国产一区二区三区 | 欧美性生交xxxxx久久久 | 超碰97人人做人人爱少妇 | 狂野欧美激情性xxxx | 老子影院午夜精品无码 | 精品亚洲韩国一区二区三区 | 好男人www社区 | 又大又硬又黄的免费视频 | 国产亚洲欧美在线专区 | 亚洲精品一区二区三区在线观看 | 色老头在线一区二区三区 | 亚洲一区二区三区播放 | 亚洲人亚洲人成电影网站色 | 国产真人无遮挡作爱免费视频 | 成人无码精品1区2区3区免费看 | 国产熟妇高潮叫床视频播放 | 99久久99久久免费精品蜜桃 | 超碰97人人射妻 | 成人性做爰aaa片免费看 | 一本久久伊人热热精品中文字幕 | 亚洲熟悉妇女xxx妇女av | 中文字幕人妻无码一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 亚洲成色www久久网站 | 夜夜高潮次次欢爽av女 | 精品午夜福利在线观看 | 国产精品丝袜黑色高跟鞋 | 亚洲欧美综合区丁香五月小说 | 沈阳熟女露脸对白视频 | 国产口爆吞精在线视频 | 人妻少妇精品久久 | 乱码av麻豆丝袜熟女系列 | 国产精品无套呻吟在线 | 三上悠亚人妻中文字幕在线 | 中文字幕av日韩精品一区二区 | 伊人久久大香线焦av综合影院 | 久久伊人色av天堂九九小黄鸭 | 日本肉体xxxx裸交 | 玩弄人妻少妇500系列视频 | 国产精品无套呻吟在线 | 性生交大片免费看女人按摩摩 | 成在人线av无码免观看麻豆 | 亚洲色在线无码国产精品不卡 | 日韩少妇内射免费播放 | 97夜夜澡人人爽人人喊中国片 | 六十路熟妇乱子伦 | 成人性做爰aaa片免费看不忠 | 色一情一乱一伦一视频免费看 | 性欧美疯狂xxxxbbbb | 老太婆性杂交欧美肥老太 | 波多野结衣 黑人 | 久久精品国产亚洲精品 | 亚洲国产精品无码久久久久高潮 | 老熟妇乱子伦牲交视频 | 夜精品a片一区二区三区无码白浆 | 日日摸夜夜摸狠狠摸婷婷 | 久久亚洲日韩精品一区二区三区 | 嫩b人妻精品一区二区三区 | 国产无遮挡又黄又爽又色 | 午夜福利一区二区三区在线观看 | 国内精品一区二区三区不卡 | 日韩人妻系列无码专区 | 国产精品久久久久久久影院 | 国产精品亚洲五月天高清 | 欧美国产亚洲日韩在线二区 | 亚洲人成影院在线观看 | 中文精品无码中文字幕无码专区 | 国产福利视频一区二区 | 久久久www成人免费毛片 | 日韩人妻无码中文字幕视频 | 久久久久免费精品国产 | 夜夜躁日日躁狠狠久久av | 99久久精品无码一区二区毛片 | 大肉大捧一进一出好爽视频 | 国产成人无码av在线影院 | 国产偷国产偷精品高清尤物 | 东京无码熟妇人妻av在线网址 | 自拍偷自拍亚洲精品被多人伦好爽 | 樱花草在线社区www | 久久久精品456亚洲影院 | 丰满诱人的人妻3 | 午夜熟女插插xx免费视频 | 女高中生第一次破苞av | 奇米影视7777久久精品人人爽 | 欧美丰满老熟妇xxxxx性 | 精品国产乱码久久久久乱码 | 综合激情五月综合激情五月激情1 | 300部国产真实乱 | 亚洲中文字幕无码中字 | 国内精品久久久久久中文字幕 | 综合激情五月综合激情五月激情1 | 成人无码精品一区二区三区 | 亚拍精品一区二区三区探花 | 97资源共享在线视频 | 欧美激情内射喷水高潮 | 久久午夜无码鲁丝片秋霞 | 99精品国产综合久久久久五月天 | 国产成人亚洲综合无码 | 国产午夜福利100集发布 | 久久www免费人成人片 | 人人妻人人澡人人爽人人精品 | 网友自拍区视频精品 | 国产亚洲tv在线观看 | 性色欲网站人妻丰满中文久久不卡 | 波多野结衣av一区二区全免费观看 | 精品乱码久久久久久久 | 妺妺窝人体色www婷婷 | 桃花色综合影院 | 欧美黑人乱大交 | 久热国产vs视频在线观看 | 四虎影视成人永久免费观看视频 | a在线亚洲男人的天堂 | 一本一道久久综合久久 | 大地资源网第二页免费观看 | 福利一区二区三区视频在线观看 | 成人免费视频视频在线观看 免费 | 亚洲国产精品无码久久久久高潮 | 免费国产成人高清在线观看网站 | 欧美性猛交xxxx富婆 | 精品国产一区二区三区av 性色 | 国产真人无遮挡作爱免费视频 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品内射视频免费 | 国产精品亚洲а∨无码播放麻豆 | 欧洲vodafone精品性 | 亚洲性无码av中文字幕 | 内射老妇bbwx0c0ck | 国产在线一区二区三区四区五区 | 女人被男人爽到呻吟的视频 | 午夜精品一区二区三区在线观看 | 特级做a爰片毛片免费69 | 久久综合香蕉国产蜜臀av | 亚洲区小说区激情区图片区 | 亚洲综合另类小说色区 | 欧美国产日韩亚洲中文 | 丰满肥臀大屁股熟妇激情视频 | 成熟女人特级毛片www免费 | 日韩精品无码一区二区中文字幕 | 亚洲va欧美va天堂v国产综合 | 亚洲国产精品无码一区二区三区 | 精品人妻中文字幕有码在线 | 久久亚洲精品成人无码 | 亚洲精品综合一区二区三区在线 | 亚洲国产精品久久久天堂 | 人妻体内射精一区二区三四 | 国产高清av在线播放 | 无码一区二区三区在线 | 牲交欧美兽交欧美 | 欧美性生交xxxxx久久久 | 无码国产乱人伦偷精品视频 | 色老头在线一区二区三区 | 成人片黄网站色大片免费观看 | 亚洲精品一区二区三区四区五区 | 亚洲春色在线视频 | 综合激情五月综合激情五月激情1 | 玩弄少妇高潮ⅹxxxyw | 中文字幕人妻无码一区二区三区 | 亚洲国产精品一区二区第一页 | 国产后入清纯学生妹 | 精品乱码久久久久久久 | 久久精品国产一区二区三区 | 性色欲情网站iwww九文堂 | 人人超人人超碰超国产 | 国产人成高清在线视频99最全资源 | 无码福利日韩神码福利片 | 欧美野外疯狂做受xxxx高潮 | 国产激情艳情在线看视频 | 性欧美疯狂xxxxbbbb | 精品久久综合1区2区3区激情 | 精品一区二区三区波多野结衣 | 亚洲啪av永久无码精品放毛片 | 一区二区三区乱码在线 | 欧洲 | 人人澡人人妻人人爽人人蜜桃 | 国内揄拍国内精品少妇国语 | 日本一区二区更新不卡 | 青青青手机频在线观看 | 国产精品多人p群无码 | 国产又爽又黄又刺激的视频 | 99精品无人区乱码1区2区3区 | 无码任你躁久久久久久久 | 5858s亚洲色大成网站www | 综合激情五月综合激情五月激情1 | 久久亚洲精品成人无码 | 丰满人妻翻云覆雨呻吟视频 | 无码帝国www无码专区色综合 | 极品嫩模高潮叫床 | 久久熟妇人妻午夜寂寞影院 | 亚洲熟女一区二区三区 | 一本久道久久综合狠狠爱 | 精品国产精品久久一区免费式 | 精品久久久久久亚洲精品 | 亚洲色欲色欲天天天www | 免费观看黄网站 | 小sao货水好多真紧h无码视频 | 亚洲色大成网站www | 亚洲国产精品一区二区第一页 | 久久综合给合久久狠狠狠97色 | 欧美黑人性暴力猛交喷水 | 99精品国产综合久久久久五月天 | 久久无码专区国产精品s | 在教室伦流澡到高潮hnp视频 | 亚洲精品一区二区三区四区五区 | 又黄又爽又色的视频 | 午夜丰满少妇性开放视频 | 无码毛片视频一区二区本码 | 国产suv精品一区二区五 | 久久国产精品精品国产色婷婷 | 少妇愉情理伦片bd | 国产色在线 | 国产 | 中国大陆精品视频xxxx | 人人妻人人澡人人爽人人精品 | 日本爽爽爽爽爽爽在线观看免 | 午夜熟女插插xx免费视频 | 久久亚洲精品中文字幕无男同 | 男女超爽视频免费播放 | 国产性生大片免费观看性 | 免费中文字幕日韩欧美 | 国产一区二区三区精品视频 | 粗大的内捧猛烈进出视频 | 高潮毛片无遮挡高清免费 | 亚洲区欧美区综合区自拍区 | 国精品人妻无码一区二区三区蜜柚 | 男女超爽视频免费播放 | 午夜性刺激在线视频免费 | 内射后入在线观看一区 | 东京热无码av男人的天堂 | 国产成人无码午夜视频在线观看 | 欧美大屁股xxxxhd黑色 | 男人扒开女人内裤强吻桶进去 | 俺去俺来也www色官网 | 国内精品人妻无码久久久影院蜜桃 | 97色伦图片97综合影院 | 曰本女人与公拘交酡免费视频 | 国产亚洲tv在线观看 | 2019午夜福利不卡片在线 | 婷婷五月综合缴情在线视频 | av香港经典三级级 在线 | 久久人人爽人人爽人人片av高清 | 男人的天堂av网站 | 免费网站看v片在线18禁无码 | 波多野结衣乳巨码无在线观看 | 亚洲精品国产精品乱码视色 | 蜜桃视频插满18在线观看 | 欧美黑人性暴力猛交喷水 | 久久精品国产亚洲精品 | 亚洲а∨天堂久久精品2021 | 窝窝午夜理论片影院 | 性做久久久久久久久 | 性啪啪chinese东北女人 | 老子影院午夜伦不卡 | 5858s亚洲色大成网站www | 强伦人妻一区二区三区视频18 | 樱花草在线社区www | 色噜噜亚洲男人的天堂 | 欧美日韩一区二区综合 | 牲交欧美兽交欧美 | 偷窥村妇洗澡毛毛多 | 日韩欧美成人免费观看 | 又粗又大又硬毛片免费看 | 日产精品高潮呻吟av久久 | 国产精品第一区揄拍无码 | 亚洲国产精品美女久久久久 | 成人免费视频视频在线观看 免费 | 内射欧美老妇wbb | 久久熟妇人妻午夜寂寞影院 | 欧美日韩人成综合在线播放 | 麻豆国产人妻欲求不满 | 中文毛片无遮挡高清免费 | 亚洲人成人无码网www国产 | 亚洲成av人影院在线观看 | 极品尤物被啪到呻吟喷水 | 偷窥村妇洗澡毛毛多 | 午夜成人1000部免费视频 | 精品一区二区不卡无码av | 麻豆国产97在线 | 欧洲 | 激情五月综合色婷婷一区二区 | 国产偷国产偷精品高清尤物 | 色综合视频一区二区三区 | 国产极品美女高潮无套在线观看 | 无码人妻出轨黑人中文字幕 | 少妇无码一区二区二三区 | 国产精品久久国产精品99 | 国产超碰人人爽人人做人人添 | a在线亚洲男人的天堂 | 国产色精品久久人妻 | 双乳奶水饱满少妇呻吟 | 无人区乱码一区二区三区 | 中文字幕人妻无码一区二区三区 | 亚洲区欧美区综合区自拍区 | 成人无码精品一区二区三区 | 大地资源中文第3页 | 精品偷自拍另类在线观看 | 97无码免费人妻超级碰碰夜夜 | 国产亚洲欧美在线专区 | 成在人线av无码免费 | 老头边吃奶边弄进去呻吟 | 国产农村乱对白刺激视频 | 亚洲午夜无码久久 | 国产精品无码mv在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 国产片av国语在线观看 | 亚洲最大成人网站 | 欧美真人作爱免费视频 | 亚洲va欧美va天堂v国产综合 | 久久久久亚洲精品中文字幕 | 亚洲熟女一区二区三区 | 亚洲国产精品无码久久久久高潮 | 免费看少妇作爱视频 | 免费无码一区二区三区蜜桃大 | 国产亚洲精品久久久久久久久动漫 | 亚洲精品综合一区二区三区在线 | 日本在线高清不卡免费播放 | 岛国片人妻三上悠亚 | 桃花色综合影院 | 成人性做爰aaa片免费看不忠 | 欧洲熟妇精品视频 | 欧美性猛交xxxx富婆 | 强奷人妻日本中文字幕 | 最新国产乱人伦偷精品免费网站 | 搡女人真爽免费视频大全 | 久久久久久亚洲精品a片成人 | 伊人久久大香线蕉av一区二区 | 国产乡下妇女做爰 | 狠狠亚洲超碰狼人久久 | ass日本丰满熟妇pics | 欧美精品在线观看 | 国产精品无码成人午夜电影 | 精品久久8x国产免费观看 | av无码电影一区二区三区 | 成人av无码一区二区三区 | 久久久精品国产sm最大网站 | 日本xxxx色视频在线观看免费 | 国精产品一区二区三区 | 特级做a爰片毛片免费69 | 久久久久久av无码免费看大片 | 亚洲中文字幕无码一久久区 | 88国产精品欧美一区二区三区 | 欧美激情综合亚洲一二区 | 国产莉萝无码av在线播放 | 亚洲乱码中文字幕在线 | 最近的中文字幕在线看视频 | 亚洲精品成a人在线观看 | 四十如虎的丰满熟妇啪啪 | 精品国产aⅴ无码一区二区 | 人妻有码中文字幕在线 | 日本肉体xxxx裸交 | 久青草影院在线观看国产 | 亚洲精品欧美二区三区中文字幕 | 国产精品18久久久久久麻辣 | 欧美变态另类xxxx | 青草视频在线播放 | 超碰97人人做人人爱少妇 | 日韩av无码一区二区三区不卡 | 日本一卡二卡不卡视频查询 | 欧美性生交活xxxxxdddd | a国产一区二区免费入口 | 乱码av麻豆丝袜熟女系列 | 兔费看少妇性l交大片免费 | 在线а√天堂中文官网 | 亚洲国产精品毛片av不卡在线 | 国产香蕉尹人综合在线观看 | 99re在线播放 | 人人妻人人澡人人爽精品欧美 | 国产女主播喷水视频在线观看 | 亚洲国产av精品一区二区蜜芽 | 内射白嫩少妇超碰 | 少妇无码一区二区二三区 | 亚洲人成网站色7799 | 国产午夜福利亚洲第一 | 天干天干啦夜天干天2017 | 欧美成人午夜精品久久久 | 亚洲精品一区二区三区四区五区 | 国产亚洲人成在线播放 | 日韩精品成人一区二区三区 | 少妇性俱乐部纵欲狂欢电影 | 成人免费视频在线观看 | 免费网站看v片在线18禁无码 | 内射巨臀欧美在线视频 | 国产精品人妻一区二区三区四 | 激情内射亚州一区二区三区爱妻 | 久久久精品成人免费观看 | 青草青草久热国产精品 | 国语精品一区二区三区 | 精品乱子伦一区二区三区 | 99视频精品全部免费免费观看 | 中文精品无码中文字幕无码专区 | 亚洲综合在线一区二区三区 | 天堂久久天堂av色综合 | 夜精品a片一区二区三区无码白浆 | 日本饥渴人妻欲求不满 | 老子影院午夜伦不卡 | 免费观看的无遮挡av | 少妇高潮一区二区三区99 | 2020久久超碰国产精品最新 | 国语自产偷拍精品视频偷 | 无码播放一区二区三区 | 99精品久久毛片a片 | 77777熟女视频在线观看 а天堂中文在线官网 | 无码人妻丰满熟妇区毛片18 | 无码人妻精品一区二区三区不卡 | 亚洲欧美精品伊人久久 | 免费乱码人妻系列无码专区 | 国产人成高清在线视频99最全资源 | 精品无人国产偷自产在线 | 中文无码伦av中文字幕 | 麻豆国产丝袜白领秘书在线观看 | 丰腴饱满的极品熟妇 | 亚洲精品一区二区三区婷婷月 | 大色综合色综合网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美三级a做爰在线观看 | 精品日本一区二区三区在线观看 | 无码毛片视频一区二区本码 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美综合区丁香五月小说 | 成人无码精品1区2区3区免费看 | 色综合久久久无码中文字幕 | 久久精品无码一区二区三区 | 中文字幕无码免费久久9一区9 | 亚洲大尺度无码无码专区 | 思思久久99热只有频精品66 | 精品久久久久久亚洲精品 | 国产高潮视频在线观看 | 国模大胆一区二区三区 | 国产激情综合五月久久 | 亚洲va中文字幕无码久久不卡 | 久久久久免费精品国产 | 亚洲精品久久久久中文第一幕 | 国产另类ts人妖一区二区 | 丰满妇女强制高潮18xxxx | 激情综合激情五月俺也去 | 两性色午夜免费视频 | 婷婷色婷婷开心五月四房播播 | 无套内射视频囯产 | 久久久久久a亚洲欧洲av冫 | 美女极度色诱视频国产 | 亚洲色偷偷男人的天堂 | 国产福利视频一区二区 | 午夜性刺激在线视频免费 | 日本免费一区二区三区最新 | 日韩少妇内射免费播放 | 熟妇激情内射com | 国产精品欧美成人 | 任你躁在线精品免费 | 爽爽影院免费观看 | 麻豆国产97在线 | 欧洲 | 亚洲狠狠婷婷综合久久 | 亚洲色成人中文字幕网站 |