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

轉(zhuǎn)轉(zhuǎn)門店基于MQ的Http重試實(shí)踐

開發(fā) 前端 網(wǎng)絡(luò)管理
在使用Http請(qǐng)求外部服務(wù)時(shí),由于網(wǎng)絡(luò)的不穩(wěn)定性,第三方接口出現(xiàn)超時(shí)的現(xiàn)象時(shí)有發(fā)生,為了減少對(duì)業(yè)務(wù)造成的影響,我們迫切需要尋找一種Http重試方案。

1 問題背景

在線下門店系統(tǒng)開發(fā)中,有很多地方需要使用Http請(qǐng)求和第三方系統(tǒng)進(jìn)行通信,比如將門店的商品信息同步到第三方的電子價(jià)簽上,再比如需要把門店店員的打卡信息同步到公司使用的第三方EHR系統(tǒng)中。

但在使用Http請(qǐng)求外部服務(wù)時(shí),由于網(wǎng)絡(luò)的不穩(wěn)定性,第三方接口出現(xiàn)超時(shí)的現(xiàn)象時(shí)有發(fā)生,為了減少對(duì)業(yè)務(wù)造成的影響,我們迫切需要尋找一種Http重試方案。

2 重試方案探索

2.1 簡單重試

我們最容易想到的一種重試方式是,在請(qǐng)求接口的代碼塊中加入循環(huán),如果請(qǐng)求失敗則繼續(xù)請(qǐng)求,直到請(qǐng)求成功或達(dá)到最大重試次數(shù)。示例代碼如下:

int retryTimes = 3;
  for (int i = 0; i < retryTimes; i++) {
    try {
        // 請(qǐng)求接口的代碼
        break;
      } catch(Exception e) {
        // 處理異常
      }
  }

這種重試方式比較簡單,只要請(qǐng)求發(fā)生異常就繼續(xù)重試,能在一定程度上解決我們的問題,但缺點(diǎn)是對(duì)于異常的捕獲處理邏輯過于簡單,重試起來會(huì)有一定的盲目性。

2.2 Apache HttpClient 重試機(jī)制

我們常用的一些Http客戶端通常也內(nèi)置了一些重試機(jī)制,接下來我將以我們系統(tǒng)中使用的Apache HttpClient為例,通過手撕源碼的方式探索一下它內(nèi)部的重試機(jī)制。

通常我們?cè)谑褂肏ttpClient的時(shí)候,都需要以下幾個(gè)步驟;

CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  HttpGet httpGet = new HttpGet("url");
  CloseableHttpResponse response = httpClient.execute(httpGet);
  HttpEntity entity = response.getEntity();

在創(chuàng)建 HttpClient 的過程中,底層調(diào)用了HttpClientBuilder的build方法,我們直接找到跟重試相關(guān)的邏輯,源碼如下圖:

if (!automaticRetriesDisabled) {
        HttpRequestRetryHandler retryHandlerCopy = this.retryHandler;
        if (retryHandlerCopy == null) {
            retryHandlerCopy = DefaultHttpRequestRetryHandler.INSTANCE;
         }
         execChain = new RetryExec(execChain, retryHandlerCopy);
     }

automaticRetriesDisabled默認(rèn)是沒有禁用的,RetryExec是一個(gè)重試執(zhí)行器,它還需要一個(gè) RetryHandler,如果沒有指定的話,會(huì)使用DefaultHttpRequestRetryHandler作為默認(rèn)的重試處理器。

我們先來看一下RetryExec的邏輯,源碼如下圖:

public CloseableHttpResponse execute(
            final HttpRoute route,
            final HttpRequestWrapper request,
            final HttpClientContext context,
            final HttpExecutionAware execAware) throws IOException, HttpException {
        final Header[] origheaders = request.getAllHeaders();
        for (int execCount = 1;; execCount++) {
            try {
                return this.requestExecutor.execute(route, request, context, execAware);
            } catch (final IOException ex) {
                if (execAware != null && execAware.isAborted()) {
                    this.log.debug("Request has been aborted");
                    throw ex;
                }
                if (retryHandler.retryRequest(ex, execCount, context)) {
                    if (!RequestEntityProxy.isRepeatable(request)) {
                        this.log.debug("Cannot retry non-repeatable request");
                        throw new NonRepeatableRequestException("Cannot retry request " +
                                "with a non-repeatable request entity", ex);
                    }
                    request.setHeaders(origheaders);
                } else {
                    if (ex instanceof NoHttpResponseException) {
                        final NoHttpResponseException updatedex = new NoHttpResponseException(
                                route.getTargetHost().toHostString() + " failed to respond");
                        updatedex.setStackTrace(ex.getStackTrace());
                        throw updatedex;
                    }
                    throw ex;
                }
            }
        }
    }

看到這里,怎么還感覺到有點(diǎn)眼熟了呢?是不是和我們上面簡單重試的思路是一樣的呢,有點(diǎn)大道至簡那個(gè)意思了。

我們來簡單總結(jié)一下RetryExec的主要邏輯:在執(zhí)行Http請(qǐng)求的時(shí)候,如果發(fā)生了IOException,會(huì)交給具體的RetryHandler來處理,然后由它的retryRequest方法來決定是繼續(xù)重試還是拋出異常。這里可能有的朋友會(huì)有疑問,為什么是IOException呢?

這就要說一下HttpClient的execute方法了,HttpClient執(zhí)行時(shí)可能會(huì)拋出兩種異常:IOException和ClientProtocolException;其中IOException被認(rèn)為是非致命性且可恢復(fù)的,而ClientProtocolException被認(rèn)為是致命性的,不可恢復(fù),所以這里只需要關(guān)注IOException異常即可。

接下來我們?cè)賮砜匆幌翫efaultHttpRequestRetryHandler,它定義了3個(gè)成員變量:

  • retryCount:重試次數(shù);
  • requestSentRetryEnabled:是否可以在請(qǐng)求成功發(fā)出后重試,這里的成功是指發(fā)送成功,并不指請(qǐng)求成功;
  • nonRetriableClasses:不重試的異常類集合,如果異常為集合中指定的異常時(shí),不會(huì)重試。

DefaultHttpRequestRetryHandler經(jīng)過一系列構(gòu)造函數(shù),完成了對(duì)三個(gè)成員變量的賦值,其中默認(rèn)的重試次數(shù)是3次,并且默認(rèn)在請(qǐng)求發(fā)送成功之后就不會(huì)再重試,默認(rèn)的不重試異常有以下四類:

  • InterruptedIOException
  • UnknownHostException
  • ConnectException
  • SSLException

源碼如下圖:

public DefaultHttpRequestRetryHandler(final int retryCount, final boolean requestSentRetryEnabled) {
        this(retryCount, requestSentRetryEnabled, Arrays.asList(
                InterruptedIOException.class,
                UnknownHostException.class,
                ConnectException.class,
                NoRouteToHostException.class,
                SSLException.class));
    }

    public DefaultHttpRequestRetryHandler() {
        this(3, false);
    }

然后,我們?cè)賮砜匆幌翫efaultHttpRequestRetryHandler中的核心方法retryRequest方法的邏輯,源碼邏輯如下圖:

public boolean retryRequest(
            final IOException exception,
            final int executionCount,
            final HttpContext context) {
        if (executionCount > this.retryCount) {
            // Do not retry if over max retry count
            return false;
        }
        if (this.nonRetriableClasses.contains(exception.getClass())) {
            return false;
        }

        final HttpClientContext clientContext = HttpClientContext.adapt(context);
        final HttpRequest request = clientContext.getRequest();

        if (handleAsIdempotent(request)) {
            // Retry if the request is considered idempotent
            return true;
        }

        if (!clientContext.isRequestSent() || this.requestSentRetryEnabled) {
            // Retry if the request has not been sent fully or if it's OK to retry methods that have been sent
            return true;
        }
        return false;
    }

retryRequest的邏輯也比較簡單,首先超過重試次數(shù)就不會(huì)再重試,然后如果是指定不重試的異常也不會(huì)再重試;再然后如果請(qǐng)求方法不是冪等的,也不會(huì)繼續(xù)重試,這里我們熟悉的Post方法顯然是不會(huì)進(jìn)行重試的。不過還有機(jī)會(huì),這里我們知道requestSentRetryEnabled默認(rèn)是false,也就是說只要請(qǐng)求發(fā)送成功之后也不會(huì)進(jìn)行重試。

到這里,我們可以總結(jié)一下了。HttpClient默認(rèn)的RetryHandler中指定了四類異常是不會(huì)進(jìn)行重試的,其中就包含了InterruptedIOException,而實(shí)際上我們經(jīng)常會(huì)遇到的SocketTimeoutException就屬于它的子類。

還有一點(diǎn),如果按照默認(rèn)的重試策略,顯然Post請(qǐng)求也不滿足重試的條件。這里必須說一下,從謹(jǐn)慎的角度來看,Post請(qǐng)求是否應(yīng)該重試,需要具體結(jié)合業(yè)務(wù)場景來看,如果請(qǐng)求本身不是冪等的,重試確實(shí)可能會(huì)帶來嚴(yán)重的副作用。

所以在實(shí)際的業(yè)務(wù)場景中,如果想要利用HttpClient的重試機(jī)制來進(jìn)行重試,這兩個(gè)問題都需要解決。

2.3 基于消息隊(duì)列的異步重試方案

考慮到在門店很多業(yè)務(wù)場景中,執(zhí)行完相關(guān)的邏輯之后都會(huì)發(fā)送MQ消息。那么我們很自然地也想到了通過引入一個(gè)消費(fèi)者的方式,來執(zhí)行通過Http調(diào)用第三方接口的邏輯。

采用這種方式的話,如果在消費(fèi)邏輯中通過Http調(diào)用第三方接口失敗,我們還可以充分利用MQ的消費(fèi)失敗重試機(jī)制。以我們使用的RocketMQ為例,消息在消費(fèi)失敗重試的時(shí)候會(huì)按照一定的退避時(shí)間來進(jìn)行重試,這個(gè)特性還能避免第三方服務(wù)因?yàn)槎虝r(shí)間的不可用而造成的重試失敗的情況。

3 門店業(yè)務(wù)場景中使用的重試方案

經(jīng)過以上多種方案的調(diào)研,我們最終采用的是方案二和方案三的綜合方案,具體思路如下。

首先,我們整體的重試方案采用基于消息隊(duì)列的異步執(zhí)行方案,一方面是因?yàn)檫@種方案可以充分地做到和業(yè)務(wù)之間解耦,同時(shí)消息隊(duì)列的消費(fèi)失敗重試機(jī)制可以很好地解決第三方服務(wù)短時(shí)間不可用的問題,這一點(diǎn)是同步重試方案做不到的,可以保障系統(tǒng)的最終一致性。

其次,因?yàn)槲覀兿到y(tǒng)中已經(jīng)在使用HttpClient 組件,所以我們決定充分利用它的重試機(jī)制,同步重試也可以盡可能保證接口調(diào)用的實(shí)時(shí)性。

考慮到默認(rèn)的重試策略不滿足我們的使用需求,針對(duì)這個(gè)問題,我們自定義了一個(gè)RetryHandler,源碼如下圖:

public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
        if (executionCount > this.retryCount) {
            RequestLine requestLine = null;
            if (context instanceof HttpClientContext) {
                requestLine = ((HttpClientContext)context).getRequest().getRequestLine();
            }
            
            return false;
        } else if (exception instanceof NoHttpResponseException) {
            return true;
        } else if (exception instanceof SSLHandshakeException) {
            return false;
        } else if (exception instanceof InterruptedIOException) {
            return true;
        } else if (exception instanceof UnknownHostException) {
            return false;
        } else if (exception instanceof ConnectTimeoutException) {
            return false;
        } else if (exception instanceof SSLException) {
            return false;
        } else {
            HttpClientContext clientContext = HttpClientContext.adapt(context);
            HttpRequest request = clientContext.getRequest();
            return !(request instanceof HttpEntityEnclosingRequest);
        }
    }

完成RetryHandler的自定義之后,只需要在初始化HttpClient的時(shí)候傳入指定的RetryHandler即可,設(shè)置方式如下:

CloseableHttpClient httpClient = HttpClientBuilder.create().setRetryHandler(StoreRequestRetryHandler.INSTANCE).build();

這樣我們就解決了默認(rèn)的重試機(jī)制對(duì)于Post請(qǐng)求默認(rèn)不重試和SocketTimeoutException異常不重試的問題,更加貼合我們的使用場景。

這里我舉個(gè)例子來說明一下整個(gè)重試方案的執(zhí)行流程:

  • MQ在消費(fèi)的時(shí)候,會(huì)使用Apache HttpClient請(qǐng)求第三方接口,我們?cè)O(shè)置重試3次,如果請(qǐng)求一直失敗,會(huì)先同步重試3次,如果還是失敗,則本次消息消費(fèi)失敗,等待下一次重試消息繼續(xù)這個(gè)流程。
  • RocketMQ默認(rèn)會(huì)重試16次,那么我們整個(gè)重試方案會(huì)最多進(jìn)行51次重試。
  • Apache HttpClient的同步重試能盡可能保證同步的實(shí)時(shí)性,而如果第三方服務(wù)出現(xiàn)短時(shí)間不可用的現(xiàn)象,RocketMQ的退避重試也能繼續(xù)異步重試只到最終成功。

在我們使用了這種重試方案之后,就再也沒有聽到業(yè)務(wù)關(guān)于電子價(jià)簽未及時(shí)同步或者打卡信息未同步的抱怨了。

以上就是筆者在線下門店系統(tǒng)中的Http重試實(shí)踐過程,歡迎大家在評(píng)論區(qū)留言一起交流。

關(guān)于作者

侯萬興,轉(zhuǎn)轉(zhuǎn)門店業(yè)務(wù)后端研發(fā)工程師

責(zé)任編輯:武曉燕 來源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2023-07-27 07:00:01

轉(zhuǎn)轉(zhuǎn)門店商編程

2024-01-31 22:08:18

分布式重試框架

2024-07-25 19:43:32

2022-11-02 09:02:08

Drools引擎DMN

2023-11-01 07:44:29

轉(zhuǎn)轉(zhuǎn)Flutter業(yè)務(wù)

2022-11-07 14:45:26

轉(zhuǎn)轉(zhuǎn)價(jià)格DDD

2023-12-27 19:12:42

OLAP自助分析

2023-03-22 08:32:35

2023-03-02 08:54:32

2022-10-28 09:15:02

2023-03-02 08:32:41

2022-10-28 08:31:43

2022-12-15 08:35:01

用戶畫像平臺(tái)

2023-02-08 09:42:30

策略方式容量

2024-06-26 18:58:30

游戲MQ重構(gòu)

2024-06-06 08:18:42

回收業(yè)務(wù)

2023-06-07 08:32:32

引擎技術(shù)while

2023-04-19 13:18:41

動(dòng)態(tài)線程池平臺(tái)

2023-01-04 08:31:10

轉(zhuǎn)轉(zhuǎn)測試環(huán)境

2024-10-16 21:49:24

點(diǎn)贊
收藏

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

久久久一二三区| 日本午夜激情视频| 国产男男gay网站| 黄色亚洲在线| 亚洲色图av在线| 三级一区二区三区| 爱啪啪综合导航| 国产精品女同互慰在线看| 91青青草免费观看| 日韩在线视频不卡| 欧美不卡视频| 亚洲视频在线观看视频| 国产5g成人5g天天爽| 亚洲优女在线| 亚洲欧美区自拍先锋| 亚洲一区二区精品| 免费不卡av网站| 欧美理论影院| 亚洲va欧美va人人爽| 亚洲精品一区二区三| 五十路在线视频| 国产一区二区三区美女| 日韩女优人人人人射在线视频| www.av蜜桃| 国产福利在线| 99国产精品国产精品毛片| 91精品视频免费| 天堂免费在线视频| 亚洲视频成人| 欧美精品激情视频| 三级影片在线观看| 国产一区二区三区91| 亚洲黄色有码视频| 国产伦精品一区二区三区妓女下载| 风间由美一区| eeuss国产一区二区三区| 国产精品网红直播| 国产无套在线观看| 欧美久色视频| 欧美成人免费大片| 日本一级片免费| 欧美色就是色| 国产亚洲激情在线| www.久久av| 香蕉国产成人午夜av影院| 精品国产sm最大网站免费看| 日韩精品xxx| 国产精品白丝久久av网站| 精品视频999| 蜜桃免费在线视频| 91成人抖音| 欧美视频一区二| 男女男精品视频站| 欧洲av一区二区| 在线免费亚洲电影| 另类小说第一页| 男操女在线观看| av午夜一区麻豆| 国产伦精品一区二区三区免费视频| xxxxxx国产| 亚洲特级毛片| 欧美精品videosex极品1| 久久久精品国产sm调教| 欧美日韩三级| 久久久久久久久久国产| 麻豆疯狂做受xxxx高潮视频| 欧美涩涩视频| 91国产美女在线观看| 欧美另类一区二区| 久久亚洲电影| 国产精品美女网站| 91一区二区视频| 国产精品888| 国产欧美日韩视频一区二区三区| 国产人与禽zoz0性伦| 波多野结衣在线观看一区二区三区| 日韩一区二区影院| 国偷自产av一区二区三区麻豆| 日本综合字幕| 在线免费亚洲电影| 久国产精品视频| 欧美日韩国产一区二区在线观看| 中文乱码免费一区二区| 国产日韩中文字幕| 国产精品久久久久久免费| 国产精品一区一区三区| 国产欧美精品一区二区三区| 人操人视频在线观看| 国产乱码精品一区二区三区av | 欧美激情视频一区二区三区免费| 亚洲欧美精品一区二区| 91l九色lporny| 围产精品久久久久久久| 亚洲第一页在线| 在哪里可以看毛片| 日韩一区二区三区色| 亚洲国产成人久久综合一区| 香蕉视频久久久| 亚洲国产视频二区| 日韩成人在线视频网站| 懂色av粉嫩av浪潮av| 日韩影视在线观看| 这里只有精品视频在线| 久久国产精品二区| 丝袜国产日韩另类美女| 91香蕉视频在线下载| 国产福利免费在线观看| 亚洲一区二区在线免费观看视频| 免费国产成人看片在线| 亚洲最大网站| 欧美日韩电影一区| 国产肥臀一区二区福利视频| 99久久99九九99九九九| 欧美影院一区二区三区| 韩国黄色一级片| 欧美先锋资源| 亚州精品天堂中文字幕| 91丨九色丨丰满| 久久婷婷成人综合色| 久久免费一级片| 免费黄色电影在线观看| 图片区小说区国产精品视频| 日本美女视频一区| 在线成人动漫av| 午夜精品久久久久久久久久久久 | 五月婷婷激情综合网| 日本黄大片一区二区三区| 亚洲欧洲色图| 91国产精品视频在线| 韩国av免费在线| 亚洲精选一二三| 奇米视频888| 成人一二三区| 国产精品黄页免费高清在线观看| 国产成人av免费| www欧美成人18+| 日韩伦理在线免费观看| 日日夜夜精品视频| 超在线视频97| 国产精品一区二区三区在线免费观看| 国产成人精品一区二区三区网站观看| 国产 高清 精品 在线 a| 欧美成人视屏| 欧美亚洲国产怡红院影院| 人妻大战黑人白浆狂泄| 在线视频亚洲| 久久久久网址| 激情在线视频| 精品久久久久久久久久ntr影视 | 欧美激情喷水| 亚洲美女www午夜| 国产剧情在线视频| 26uuu久久综合| 成年人免费在线播放| 亚洲aa在线| 国产不卡一区二区在线播放| 国产资源在线观看| 欧美无乱码久久久免费午夜一区 | 亚洲精品一二三**| 久久久国产一区| 国产av无码专区亚洲av| 亚洲激情男女视频| 黄页网站在线观看视频| jizz性欧美2| 欧美一区二区三区……| 免费观看成年在线视频网站| 91黄视频在线观看| 久久午夜精品视频| 欧美午夜一区| 激情视频一区二区| 国产欧美一区二区三区精品酒店| 91精品国产高清一区二区三区蜜臀| 黄色在线观看av| 人妖欧美一区二区| 国产福利久久精品| 高清毛片在线观看| 亚洲精品一区在线观看香蕉| 日本黄色中文字幕| 亚洲欧洲制服丝袜| 久久久老熟女一区二区三区91| 91精品婷婷色在线观看| 99精品国产高清一区二区| mm视频在线视频| 亚洲女人被黑人巨大进入| 一级α片免费看刺激高潮视频| 久久久久国产精品人| 182午夜在线观看| 国产综合色产| 日韩激情久久| 亚洲三级av| 5252色成人免费视频| h视频在线免费| 欧美v日韩v国产v| 精品黑人一区二区三区| 日韩理论片网站| 女同毛片一区二区三区| 国产一区二区精品久久91| 久久久久免费看黄a片app| 欧美一级精品| 国产亚洲精品美女久久久m| 国产综合色激情| 久久久在线观看| 免费成人黄色| 日韩精品免费在线视频观看| 国产精品久久久久毛片| 欧美日韩中文字幕在线| 91杏吧porn蝌蚪| 国产免费成人在线视频| 在线看黄色的网站| 精品一区二区三区在线视频| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | a v视频在线观看| 国产女人水真多18毛片18精品视频| 中文久久久久久| 亚洲日韩视频| 裸体裸乳免费看| 欧美日韩久久精品| 久久久久久久久一区| aiai久久| 亚洲自拍另类欧美丝袜| 成人综合网站| 日韩美女av在线免费观看| 俺来也官网欧美久久精品| 久久黄色av网站| av网站在线免费观看| 亚洲欧美精品一区| 西西人体44www大胆无码| 日韩精品中午字幕| 国产精品久久久久久免费播放| 亚洲一卡二卡三卡四卡无卡久久 | 色狼人综合干| 96精品久久久久中文字幕| 日韩欧美2区| 国产精品高潮呻吟久久av黑人| 日本电影在线观看网站| 亚洲精品一区二区久| 天天摸夜夜添狠狠添婷婷| 日韩欧美123| 国产视频手机在线观看| 欧美日韩国产综合视频在线观看 | 在线视频三区| 亚洲视频日韩精品| 青青操视频在线| 亚洲精品一区二区三区婷婷月| 中文字幕理论片| 在线日韩国产精品| 亚洲第一区av| 欧美在线播放高清精品| 最新中文字幕免费| 欧美人与性动xxxx| 国产精品毛片一区视频播 | 在线观看中文字幕码| 日本精品视频一区二区三区| 老熟妇仑乱一区二区av| 色哟哟一区二区| 99re热视频| 在线不卡欧美精品一区二区三区| 精品一级少妇久久久久久久| 亚洲国产精品影院| 免费在线不卡视频| 欧美性jizz18性欧美| 乱子伦一区二区三区| 欧美精品777| 国精产品乱码一区一区三区四区| 欧美三级一区二区| 91av久久久| 日韩一级免费一区| 秋霞视频一区二区| 一本在线高清不卡dvd| 91麻豆精品在线| 正在播放一区二区| 黄色片一区二区三区| 亚洲理论在线a中文字幕| 91在线网址| 久久国产色av| 精精国产xxx在线视频app| 青青在线视频一区二区三区| 国产成人免费| 春色成人在线视频| 精品在线91| 最近看过的日韩成人| 国产精品99免费看| 日韩有码免费视频| 国产在线日韩| 成人在线激情网| 国内精品久久久久影院一蜜桃| 三级a在线观看| 激情五月激情综合网| 成年人小视频在线观看| 国产色一区二区| 久久丫精品久久丫| 91福利社在线观看| 99精品在线看| 亚洲人a成www在线影院| caoporn97在线视频| 日韩av免费在线观看| 欧美黄色一级| 欧美污视频久久久| 午夜视频精品| 色片在线免费观看| 成人av电影在线网| 亚洲 欧美 国产 另类| 欧美日韩国产丝袜美女| 国产精品特级毛片一区二区三区| 欧美日韩免费不卡视频一区二区三区| 久久精品久久久久久久| 日韩色在线观看| 国产黄色片在线观看| 97精品国产97久久久久久| 国产精品成人**免费视频| 日本亚洲导航| 国产精品久久久久久模特| 日韩av加勒比| 亚洲国产精品成人综合色在线婷婷| 免费在线观看a视频| 一区二区三区精品视频| www欧美com| 欧美最猛性xxxxx直播| 日本成人动漫在线观看| 久久成人精品电影| 成人涩涩视频| 欧美日韩免费高清| 99在线精品免费视频九九视| 伦伦影院午夜理论片| 国产精品沙发午睡系列990531| 欧美丰满熟妇bbbbbb| 欧美性猛交xxxx乱大交3| 成人午夜免费在线观看| 久久躁狠狠躁夜夜爽| av在线精品| 在线国产99| 免费成人美女在线观看| b站大片免费直播| 欧美日韩中文字幕日韩欧美| 亚洲三级黄色片| 亚洲91精品在线观看| 好吊妞视频这里有精品| 成人免费a级片| 国产69精品久久久久777| 国产盗摄一区二区三区在线| 91麻豆精品国产91久久久资源速度 | 亚洲区欧洲区| 91久久精品久久国产性色也91| 狼人精品一区二区三区在线 | 色一区在线观看| 三级在线视频| 日韩av免费在线观看| 九九热精品视频在线观看| 欧美日韩第二页| 国产偷国产偷精品高清尤物| 五月天婷婷导航| 国产亚洲精品久久久久久| 日韩欧美一区二区三区在线观看| 国产精品二区在线观看| 欧美精品麻豆| 丰满岳乱妇一区二区| 精品国产91久久久| 香蕉视频911| 国产成人精品亚洲精品| 日韩精品久久| 手机av在线网站| 一区二区三区91| 神马午夜在线观看| 欧洲亚洲女同hd| 欧美午夜精彩| 丰满少妇中文字幕| 亚洲国产va精品久久久不卡综合| 91精品国产乱码久久久| 欧美成人一二三| 蜜臀av一区| 视频一区三区| 在线不卡欧美| 中文字幕 亚洲一区| 欧美日韩综合视频| av中文资源在线| 亚洲综合精品伊人久久| 99国产精品| 成年人看的免费视频| 日韩视频免费观看高清完整版在线观看| 番号集在线观看| 国产日韩av在线播放| 欧美性久久久| 91网站免费视频| 日韩限制级电影在线观看| 女人高潮被爽到呻吟在线观看| 成人免费观看网站| 久久国产精品99国产| 欧美色图17p| 亚洲国产精品久久久久久| 美女写真久久影院| 成人在线观看毛片| 国产亚洲成aⅴ人片在线观看 | 免费视频一区二区三区在线观看| 亚洲精品鲁一鲁一区二区三区 | 永久域名在线精品| 粉嫩高潮美女一区二区三区| 加勒比在线一区| 国内精品一区二区三区四区| 久久密一区二区三区| 人妻内射一区二区在线视频|