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

優化 HttpClient,輕松提升高并發場景下的 QPS!

開發 項目管理
項目的原實現比較粗略,就是每次請求時初始化一個httpclient,生成一個httpPost對象,執行,然后從返回結果取出entity,保存成一個字符串,最后顯式關閉response和client。

我們有個業務,會調用其他部門提供的一個基于http的服務,日調用量在千萬級別。使用了httpclient來完成業務。之前因為qps上不去,就看了一下業務代碼,并做了一些優化,記錄在這里。

先對比前后:優化之前,平均執行時間是250ms;

優化之后,平均執行時間是80ms,降低了三分之二的消耗,容器不再動不動就報警線程耗盡了,清爽~

1.分析

項目的原實現比較粗略,就是每次請求時初始化一個httpclient,生成一個httpPost對象,執行,然后從返回結果取出entity,保存成一個字符串,最后顯式關閉response和client。

我們一點點分析和優化:

1.1 httpclient反復創建開銷

httpclient是一個線程安全的類,沒有必要由每個線程在每次使用時創建,全局保留一個即可。

1.2 反復創建tcp連接的開銷

tcp的三次握手與四次揮手兩大裹腳布過程,對于高頻次的請求來說,消耗實在太大。試想如果每次請求我們需要花費5ms用于協商過程,那么對于qps為100的單系統,1秒鐘我們就要花500ms用于握手和揮手。又不是高級領導,我們程序員就不要搞這么大做派了,改成keep alive方式以實現連接復用!

1.3 重復緩存entity的開銷

原本的邏輯里,使用了如下代碼:

HttpEntity entity = httpResponse.getEntity();

String response = EntityUtils.toString(entity);

這里我們相當于額外復制了一份content到一個字符串里,而原本的httpResponse仍然保留了一份content,需要被consume掉,在高并發且content非常大的情況下,會消耗大量內存,并且我們需要顯式的關閉連接,ugly。

2.實現

按上面的分析,我們主要要做三件事:一是單例的client,二是緩存的保活連接,三是更好的處理返回結果。一就不說了,來說說二。

提到連接緩存,很容易聯想到數據庫連接池。httpclient4提供了一個PoolingHttpClientConnectionManager 作為連接池。接下來我們通過以下步驟來優化:

2.1 定義一個keep alive strategy

關于keep-alive,本文不展開說明,只提一點,是否使用keep-alive要根據業務情況來定,它并不是靈丹妙藥。還有一點,keep-alive和time_wait/close_wait之間也有不少故事。

在本業務場景里,我們相當于有少數固定客戶端,長時間極高頻次的訪問服務器,啟用keep-alive非常合適

再多提一嘴,http的keep-alive 和tcp的KEEPALIVE不是一個東西。回到正文,定義一個strategy如下:

ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
    @Override
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
        HeaderElementIterator it = new BasicHeaderElementIterator
            (response.headerIterator(HTTP.CONN_KEEP_ALIVE));
        while (it.hasNext()) {
            HeaderElement he = it.nextElement();
            String param = he.getName();
            String value = he.getValue();
            if (value != null && param.equalsIgnoreCase
               ("timeout")) {
                return Long.parseLong(value) * 1000;
            }
        }
        return 60 * 1000;//如果沒有約定,則默認定義時長為60s
    }
};

2.2 配置一個PoolingHttpClientConnectionManager

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(500);
connectionManager.setDefaultMaxPerRoute(50);//例如默認每路由最高50并發,具體依據業務來定

也可以針對每個路由設置并發數。

2.3 生成httpclient

httpClient = HttpClients.custom()
     .setConnectionManager(connectionManager)
     .setKeepAliveStrategy(kaStrategy)
     .setDefaultRequestConfig(RequestConfig.custom().setStaleConnectionCheckEnabled(true).build())
     .build();

注意:使用setStaleConnectionCheckEnabled方法來逐出已被關閉的鏈接不被推薦。更好的方式是手動啟用一個線程,定時運行closeExpiredConnections 和closeIdleConnections方法,如下所示。

public static class IdleConnectionMonitorThread extends Thread {
    
    private final HttpClientConnectionManager connMgr;
    private volatile boolean shutdown;
    
    public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) {
        super();
        this.connMgr = connMgr;
    }
 
    @Override
    public void run() {
        try {
            while (!shutdown) {
                synchronized (this) {
                    wait(5000);
                    // Close expired connections
                    connMgr.closeExpiredConnections();
                    // Optionally, close connections
                    // that have been idle longer than 30 sec
                    connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
                }
            }
        } catch (InterruptedException ex) {
            // terminate
        }
    }
    
    public void shutdown() {
        shutdown = true;
        synchronized (this) {
            notifyAll();
        }
    }
    
}

2.4 使用httpclient執行method時降低開銷

這里要注意的是,不要關閉connection。

一種可行的獲取內容的方式類似于,把entity里的東西復制一份:

res = EntityUtils.toString(response.getEntity(),"UTF-8");
EntityUtils.consume(response1.getEntity());

但是,更推薦的方式是定義一個ResponseHandler,方便你我他,不再自己catch異常和關閉流。在此我們可以看一下相關的源碼:

public <T> T execute(final HttpHost target, final HttpRequest request,
        final ResponseHandler<? extends T> responseHandler, final HttpContext context)
        throws IOException, ClientProtocolException {
    Args.notNull(responseHandler, "Response handler");

    final HttpResponse response = execute(target, request, context);

    final T result;
    try {
        result = responseHandler.handleResponse(response);
    } catch (final Exception t) {
        final HttpEntity entity = response.getEntity();
        try {
            EntityUtils.consume(entity);
        } catch (final Exception t2) {
            // Log this exception. The original exception is more
            // important and will be thrown to the caller.
            this.log.warn("Error consuming content after an exception.", t2);
        }
        if (t instanceof RuntimeException) {
            throw (RuntimeException) t;
        }
        if (t instanceof IOException) {
            throw (IOException) t;
        }
        throw new UndeclaredThrowableException(t);
    }

    // Handling the response was successful. Ensure that the content has
    // been fully consumed.
    final HttpEntity entity = response.getEntity();
    EntityUtils.consume(entity);//看這里看這里
    return result;
}

可以看到,如果我們使用resultHandler執行execute方法,會最終自動調用consume方法,而這個consume方法如下所示:

public static void consume(final HttpEntity entity) throws IOException {
    if (entity == null) {
        return;
    }
    if (entity.isStreaming()) {
        final InputStream instream = entity.getContent();
        if (instream != null) {
            instream.close();
        }
    }
}

可以看到最終它關閉了輸入流。

3.其他

通過以上步驟,基本就完成了一個支持高并發的httpclient的寫法,下面是一些額外的配置和提醒:

3.1 httpclient的一些超時配置

CONNECTION_TIMEOUT是連接超時時間,SO_TIMEOUT是socket超時時間,這兩者是不同的。連接超時時間是發起請求前的等待時間;socket超時時間是等待數據的超時時間。

HttpParams params = new BasicHttpParams();
//設置連接超時時間
Integer CONNECTION_TIMEOUT = 2 * 1000; //設置請求超時2秒鐘 根據業務調整
Integer SO_TIMEOUT = 2 * 1000; //設置等待數據超時時間2秒鐘 根據業務調整
 
//定義了當從ClientConnectionManager中檢索ManagedClientConnection實例時使用的毫秒級的超時時間
//這個參數期望得到一個java.lang.Long類型的值。如果這個參數沒有被設置,默認等于CONNECTION_TIMEOUT,因此一定要設置。
Long CONN_MANAGER_TIMEOUT = 500L; //在httpclient4.2.3中我記得它被改成了一個對象導致直接用long會報錯,后來又改回來了
 
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SO_TIMEOUT);
params.setLongParameter(ClientPNames.CONN_MANAGER_TIMEOUT, CONN_MANAGER_TIMEOUT);
//在提交請求之前 測試連接是否可用
params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, true);
 
//另外設置http client的重試次數,默認是3次;當前是禁用掉(如果項目量不到,這個默認即可)
httpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));

3.2 如果配置了nginx的話,nginx也要設置面向兩端的keep-alive

現在的業務里,沒有nginx的情況反而比較稀少。nginx默認和client端打開長連接而和server端使用短鏈接。

注意client端的keepalive_timeout和keepalive_requests參數,以及upstream端的keepalive參數設置,這三個參數的意義在此也不再贅述。

以上就是我的全部設置。通過這些設置,成功地將原本每次請求250ms的耗時降低到了80左右,效果顯著。

JAR包如下:

<!-- httpclient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.6</version>
</dependency>

代碼如下:

//Basic認證
private static final CredentialsProvider credsProvider = new BasicCredentialsProvider();
//httpClient
private static final CloseableHttpClient httpclient;
//httpGet方法
private static final HttpGet httpget;
//
private static final RequestConfig reqestConfig;
//響應處理器
private static final ResponseHandler<String> responseHandler;
//jackson解析工具
private static final ObjectMapper mapper = new ObjectMapper();
static {
    System.setProperty("http.maxConnections","50");
    System.setProperty("http.keepAlive", "true");
    //設置basic校驗
    credsProvider.setCredentials(
            new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM),
            new UsernamePasswordCredentials("", ""));
    //創建http客戶端
    httpclient = HttpClients.custom()
            .useSystemProperties()
            .setRetryHandler(new DefaultHttpRequestRetryHandler(3,true))
            .setDefaultCredentialsProvider(credsProvider)
            .build();
    //初始化httpGet
    httpget = new HttpGet();
    //初始化HTTP請求配置
    reqestConfig = RequestConfig.custom()
            .setContentCompressionEnabled(true)
            .setSocketTimeout(100)
            .setAuthenticationEnabled(true)
            .setConnectionRequestTimeout(100)
            .setConnectTimeout(100).build();
    httpget.setConfig(reqestConfig);
    //初始化response解析器
    responseHandler = new BasicResponseHandler();
}
/*
 * 功能:返回響應
 * @param [url]
 * @return org.apache.http.client.methods.CloseableHttpResponse
 * @exception
 */
public static String getResponse(String url) throws IOException {
    HttpGet get = new HttpGet(url);
    String response = httpclient.execute(get,responseHandler);
    return response;
}
 
/*
 * 功能:發送http請求
 * @param [url]
 * @return org.json.JSONObject
 * @exception
 */
public static JSONObject getUrl(String url) throws Exception{
    try {
        httpget.setURI(URI.create(url));
        String response = httpclient.execute(httpget,responseHandler);
        JSONObject json = JSONObject.fromObject(response);
        return json;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
/*
 * 功能:發送http請求
 * @param [url]
 * @return com.fasterxml.jackson.databind.JsonNode
 * @exception
 */
public static JsonNode getUrl2(String url){
    try {
        httpget.setURI(URI.create(url));
        String response = httpclient.execute(httpget,responseHandler);
        JsonNode node = mapper.readTree(response);
        return node;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
/*
 * 功能:發送http請求,并用fastjson工具解析
 * @param [url]
 * @return com.fasterxml.jackson.databind.JsonNode
 * @exception
 */
public static com.alibaba.fastjson.JSONObject getUrl3(String url){
    try {
        httpget.setURI(URI.create(url));
        String response = httpclient.execute(httpget,responseHandler);
        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(response);
        return jsonObject;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-03-31 10:42:31

2023-10-07 08:54:28

項目httpPost對象

2025-02-26 03:00:00

2024-11-25 09:11:43

2024-01-31 08:50:41

Guava并發工具

2025-01-03 16:32:13

SpringBoot虛擬線程Java

2021-01-13 05:27:02

服務器性能高并發

2021-11-18 10:05:35

Java優化QPS

2023-08-16 11:39:19

高并發調優

2020-10-15 06:26:24

高并發場景冰河

2022-05-27 09:25:49

數據并發

2022-08-10 21:43:29

HttpClientHttp工具網絡

2024-04-12 08:28:38

優化查詢語句PostgreSQL索引

2020-09-03 06:33:35

高并發場景分布式鎖

2016-11-09 21:09:54

mysqlmysql優化

2022-05-11 11:25:49

模型方案

2022-08-04 18:23:28

屏幕共享卡頓流暢度

2022-02-02 21:50:25

底層偽共享CPU

2025-02-28 00:03:22

高并發TPS系統

2025-03-10 00:00:11

Spring框架數據
點贊
收藏

51CTO技術棧公眾號

天天干天天色天天干| 日本日本精品二区免费| 欧美极品aaaaabbbbb| 久久国产精品色av免费看| 一本大道久久a久久综合| 色女孩综合网| www.国产三级| 久久视频一区| 欧美激情久久久| 91国模少妇一区二区三区| 性欧美video另类hd尤物| 一区二区三区91| 日韩欧美一区二区三区四区| aaa一区二区三区| 亚洲综合激情| 欧美成人激情视频| av男人的天堂av| 亚洲一区二区三区日本久久九| 一本到不卡免费一区二区| 99热一区二区三区| 久久综合九色综合久| 国产黑丝在线一区二区三区| 国产精品777| 国产性生活网站| 四虎成人精品永久免费av九九| 亚洲成色999久久网站| 中文字幕 91| 亚洲午夜天堂| 亚洲成人7777| 粉嫩av一区二区三区天美传媒| 国产视频网址在线| 丁香五精品蜜臀久久久久99网站 | a一级免费视频| 日日天天久久| 亚洲成人黄色在线观看| 天堂av2020| 日韩一区二区三区免费视频| 色综合久久久久网| 日本网站免费在线观看| 国产盗摄一区二区| 亚洲三级在线播放| 亚洲砖区区免费| 成人福利在线| 久久久久久久免费视频了| 精品欧美一区二区在线观看视频| 性网爆门事件集合av| 激情综合亚洲精品| 国产综合在线观看视频| 这里只有久久精品视频| 日日夜夜免费精品视频| 青青草原成人在线视频| 91精品国产综合久久久蜜臀九色| 在线欧美一区| 久久频这里精品99香蕉| 精品处破女学生| 欧美三级不卡| 国产69精品久久久| 精品无码人妻一区二区三区| 国内综合精品午夜久久资源| 欧美福利小视频| 极品颜值美女露脸啪啪| 韩日精品在线| 国产+人+亚洲| 久久精品视频7| 日韩精品视频网站| 国产精品一区二区久久久久| 91亚洲国产成人久久精品麻豆| 久久精品国产精品亚洲综合| 91久久精品美女| www.色呦呦| 成人av免费在线| 精品亚洲欧美日韩| 韩国中文字幕2020精品| 国产精品久久久久婷婷| 干日本少妇视频| 国产在线xxx| 日韩欧美亚洲国产一区| 一本久道中文无码字幕av| jizz欧美| 日韩欧美www| 无套内谢大学处破女www小说| 竹菊久久久久久久| 日韩视频欧美视频| 国产性70yerg老太| 葵司免费一区二区三区四区五区| 国产精品久久久久久久午夜| 国产乱淫av片免费| 成人av电影免费在线播放| 欧美日韩中文国产一区发布| 老司机av在线免费看| 亚洲自拍偷拍麻豆| 免费在线观看的av网站| 亚洲精品tv| 精品亚洲永久免费精品 | 亚洲三级电影网站| 日韩欧美一区二| 久久久久久久性潮| 亚洲二区中文字幕| 欧日韩不卡视频| 日韩午夜精品| 成人黄色片网站| 婷婷色在线观看| 国产精品初高中害羞小美女文| 丰满少妇大力进入| 欧美成人三级| 日韩精品在线影院| 国产美女福利视频| 三级精品在线观看| 国产精品一区二| 四虎久久免费| 色综合天天综合色综合av| а 天堂 在线| 国产精品欧美在线观看| 欧美福利在线观看| 亚洲一级黄色大片| 久久综合九色综合97婷婷女人| 免费在线精品视频| 99只有精品| 日韩av在线免费播放| 久久中文免费视频| 久久精品国产亚洲aⅴ| 蜜桃av久久久亚洲精品| 日韩专区av| 7777精品伊人久久久大香线蕉| av鲁丝一区鲁丝二区鲁丝三区| 欧美在线观看天堂一区二区三区| 欧美中文字幕视频| 天堂av资源在线| 一区二区三区精品久久久| 国内自拍视频网| 国产精品亚洲片在线播放| 久久免费观看视频| 欧美美乳视频网站在线观看| 人妻妺妺窝人体色www聚色窝 | 免费在线成人| 国产伦精品一区二区三区视频孕妇| 免费av网站在线看| 欧美日韩中文一区| 中文字幕在线观看免费高清| 午夜在线精品偷拍| 精品久久久久久一区二区里番| 少女频道在线观看免费播放电视剧| 欧美三级电影一区| 中文字幕第69页| 日韩av高清在线观看| 欧美日韩精品免费观看| 少妇淫片在线影院| 日韩精品久久久久| 中文字幕亚洲高清| 91亚洲精品乱码久久久久久蜜桃| 欧美视频免费看欧美视频| 97久久综合区小说区图片区| 久久91亚洲人成电影网站| 国产理论视频在线观看| 亚洲欧美激情在线| 曰本三级日本三级日本三级| 欧美日本在线| 国产精品国产亚洲精品看不卡15 | 国产999在线| 美州a亚洲一视本频v色道| 色一情一乱一乱一91av| 日本a级片久久久| 成人毛片一区二区三区| 久久蜜桃香蕉精品一区二区三区| 日韩免费一级视频| 亚洲精品亚洲人成在线| 日本精品免费观看| 久久视频www| 欧美在线视频你懂得| 在线视频第一页| 久久99热99| 天天做天天躁天天躁| 国产ts一区| 97在线观看视频国产| 嫩草精品影院| 7777精品久久久大香线蕉| 久草资源在线视频| av激情综合网| www黄色在线| 国产精品久久观看| 国产成人一区二区三区免费看| 91丝袜在线| 亚洲欧美一区二区三区情侣bbw| 免费又黄又爽又猛大片午夜| 中文成人综合网| av在线天堂网| 久久精品一区二区国产| 在线视频一区观看| 97se亚洲| 国产91久久婷婷一区二区| 久久综合网导航| 日韩av在线播放资源| 中文字幕在线观看免费| 亚洲福利电影网| 成年人在线免费看片| 国产成人av电影在线| av免费在线播放网站| 中文av一区| 欧美专区一二三| 欧美在线在线| 日韩av三级在线观看| 制服丝袜中文字幕在线| 亚洲欧洲高清在线| 超碰免费在线97| 在线视频欧美精品| 日韩男人的天堂| 国产精品嫩草影院av蜜臀| 污污污www精品国产网站| 蜜臂av日日欢夜夜爽一区| av免费看网址| 97精品一区| 欧美极品一区| 91综合久久爱com| 国产精自产拍久久久久久| www.综合网.com| 少妇av一区二区三区| 三级无遮挡在线观看| 欧美成人一区二区三区在线观看| 中文字幕 国产精品| 亚洲成a天堂v人片| 国产精品丝袜一区二区| 国产视频一区二区在线| 捆绑裸体绳奴bdsm亚洲| 国产精品影视在线观看| 成年人网站大全| 日韩一级网站| 男人添女荫道口喷水视频| 加勒比久久综合| 久久国产精品-国产精品| 中文字幕一区二区三区四区久久 | 国产一区二区三区四| 日本黄网站免费| 国产欧美一级| 日韩视频在线视频| 国产精品啊v在线| 日本三日本三级少妇三级66| 成人免费av| 欧美国产一区二区在线| 成人av综合网| 99re视频在线| 精品视频一区二区三区| 国产日韩欧美影视| 成人不卡视频| 国产精品久久久av| 国产精品第一| 国产日韩欧美另类| 玖玖精品在线| 91精品在线国产| 国产日韩欧美中文在线| 91精品在线播放| 老司机亚洲精品一区二区| 亚洲综合中文字幕在线| 日本一区精品视频| 91一区二区三区| 亚洲国产一区二区三区网站| 999精品视频一区二区三区| 亚洲视频三区| 国产精选在线观看91| 麻豆精品少妇| 牛人盗摄一区二区三区视频| 综合伊思人在钱三区| 明星裸体视频一区二区| 精品国产精品| 亚洲人成网站在线观看播放| 希岛爱理一区二区三区| 路边理发店露脸熟妇泻火| 国产精品mm| av免费观看网| 日韩精品国产欧美| 三日本三级少妇三级99| 丁香一区二区三区| 久久久亚洲av波多野结衣| 久久久亚洲精品一区二区三区| 亚洲黄色免费视频| 亚洲图片激情小说| 久热精品在线观看| 欧美视频免费在线| 在线免费看av片| 日韩一区二区三区免费看 | 成人性生交大片免费看视频在线 | 国产农村老头老太视频| 日韩欧美一卡二卡| 深夜视频在线免费| 色噜噜久久综合伊人一本| www在线视频| 欧美亚洲国产精品| 成人免费91| 精品亚洲第一| 91精品久久久久久久蜜月| 久久av综合网| 久久99精品视频| 91丨porny丨对白| 国产人成亚洲第一网站在线播放 | 午夜久久久久久电影| 波多野结衣视频观看| 欧美一区二区三区四区在线观看| 五月婷婷丁香花| 久久亚洲欧美日韩精品专区| 欧美韩日亚洲| 国产精品激情av在线播放| 日日夜夜精品视频| 日韩av大全| 亚洲视频日本| 国产一级做a爰片久久| 成人中文字幕电影| 日韩精品久久久久久久的张开腿让| 亚洲国产成人av| 在线免费看91| 亚洲欧美日韩高清| 亚洲小说区图片| 国产精品成人免费电影| 国产精品白丝一区二区三区| 亚洲欧洲中文| 国产精品日本欧美一区二区三区| 欧洲美女亚洲激情| 国产农村妇女精品| 在线观看亚洲欧美| 欧美成人福利视频| 色影院视频在线| 国产精品v片在线观看不卡| 国产精品chinese在线观看| 一区二区三区日韩视频| 三级影片在线观看欧美日韩一区二区 | 国产黄色大片免费看| 午夜视频在线观看一区二区 | 亚洲国产精久久久久久久| 黄网站app在线观看| 国产精品福利网站| 九色精品国产蝌蚪| 999在线观看视频| 国产成人在线色| 国产精品视频看看| 欧美性淫爽ww久久久久无| 日本啊v在线| 91国产视频在线| 国产精品色呦| 欧美精品卡一卡二| 成人美女视频在线观看| 免费在线观看av网址| 欧美一区二区啪啪| 麻豆视频在线| 91老司机在线| 欧美高清视频手机在在线| 欧美日韩在线观看不卡| 欧美经典三级视频一区二区三区| 天干夜夜爽爽日日日日| 日韩精品极品在线观看| av日韩亚洲| 日本三级中国三级99人妇网站| 日韩一区精品字幕| 国产一二三四区在线| 在线亚洲人成电影网站色www| 草碰在线视频| 国产精品日韩久久久久| 四季av一区二区凹凸精品| 亚洲精品综合在线观看| 亚洲免费观看视频| 精品人妻少妇嫩草av无码专区| 欧美裸体xxxx极品少妇| www.爱久久| 大陆极品少妇内射aaaaa| 91浏览器在线视频| 男操女视频网站| 久久久av一区| caoporn成人免费视频在线| 成人免费在线网| 2019国产精品| 国产三级理论片| 久久精品国产亚洲一区二区| 国产精一区二区| 加勒比成人在线| 91网上在线视频| 中文无码精品一区二区三区| 日韩在线国产精品| 亚洲一区二区三区日本久久九| 大j8黑人w巨大888a片| 国产视频一区不卡| 国产浮力第一页| 97视频人免费观看| 国产探花在线精品一区二区| 国产福利精品一区二区三区| 亚洲第一综合色| 国产系列在线观看| 成人有码在线视频| 国产精品一区亚洲| 久久精品在线观看视频| 亚洲精品一区二区三区香蕉| 欧美黑人疯狂性受xxxxx野外| 国产系列第一页| www.成人网.com| 中文字幕自拍偷拍| 国内精品久久久久久久久| 国产中文精品久高清在线不| 91亚洲一区二区| 在线影视一区二区三区| 亚洲男同gay网站| 日韩久久不卡| 不卡av电影在线播放| 在线播放一级片| 91精品国产自产91精品|