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

Tomcat源碼分析 | 啟動過程深度解析

開發 前端
在啟動過程中,LifecycleBase 首先發出 STARTING_PREP 事件,StandardServer 額外還會發出 CONFIGURE_START_EVENT 和 STARTING 事件,通知 LifecycleListener 在啟動前進行準備工作。

前言

前文已述,Tomcat 的初始化由 Bootstrap 反射調用 Catalina 的 load 方法完成,包括解析 server.xml、實例化各組件、初始化組件等步驟。此番,我們將深入探究 Tomcat 如何啟動 Web 應用,并解析其加載 ServletContextListener 及 Servlet 的機制。

Tomcat 啟動邏輯層層遞進,各部件協同運作。其啟動流程自上而下,依次啟動各個組件,如圖:

圖片圖片

承接前文,我們已解析了 Catalina.load() 方法,接下來將深入探討 daemon.start() 方法的執行過程。

Bootstrap

daemon.start()

啟動過程與初始化類似,均由 Bootstrap 反射調用 Catalina 的 start 方法。

public void start()
    throws Exception {
    if( catalinaDaemnotallow==null ) init();

    Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
    method.invoke(catalinaDaemon, (Object [])null);
}

Catalina

public void start() {

    if (getServer() == null) {
        load();
    }

    if (getServer() == null) {
        log.fatal("Cannot start server. Server instance is not configured.");
        return;
    }

    long t1 = System.nanoTime();

    // Start the new server
    try {
        //調用Server的start方法,啟動Server組件
        getServer().start();
    } catch (LifecycleException e) {
        log.fatal(sm.getString("catalina.serverStartFail"), e);
        try {
            getServer().destroy();
        } catch (LifecycleException e1) {
            log.debug("destroy() failed for failed Server ", e1);
        }
        return;
    }

    long t2 = System.nanoTime();
    if(log.isInfoEnabled()) {
        log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms");
    }

    // Register shutdown hook
    // 注冊勾子,用于安全關閉tomcat
    if (useShutdownHook) {
        if (shutdownHook == null) {
            shutdownHook = new CatalinaShutdownHook();
        }
        Runtime.getRuntime().addShutdownHook(shutdownHook);

        // If JULI is being used, disable JULI's shutdown hook since
        // shutdown hooks run in parallel and log messages may be lost
        // if JULI's hook completes before the CatalinaShutdownHook()
        LogManager logManager = LogManager.getLogManager();
        if (logManager instanceof ClassLoaderLogManager) {
            ((ClassLoaderLogManager) logManager).setUseShutdownHook(
                    false);
        }
    }

    // Bootstrap中會設置await為true,其目的在于讓tomcat在shutdown端口阻塞監聽關閉命令
    if (await) {
        await();
        stop();
    }
}

Server

在先前的 Lifecycle 文章中,我們已闡述 StandardServer 重寫了 startInternal 方法,并在此基礎上實現了自身的啟動邏輯。

StandardServer.startInternal

protected void startInternal() throws LifecycleException {

    fireLifecycleEvent(CONFIGURE_START_EVENT, null);
    setState(LifecycleState.STARTING);

    globalNamingResources.start();

    // Start our defined Services
    synchronized (servicesLock) {
        for (int i = 0; i < services.length; i++) {
            services[i].start();
        }
    }
}

在啟動過程中,LifecycleBase 首先發出 STARTING_PREP 事件,StandardServer 額外還會發出 CONFIGURE_START_EVENT 和 STARTING 事件,通知 LifecycleListener 在啟動前進行準備工作。例如,NamingContextListener 會處理 CONFIGURE_START_EVENT 事件,實例化 Tomcat 相關的上下文以及 ContextResource 資源。

隨后,啟動 Service 組件,這部分邏輯將在后續文章中詳細分析。最后,LifecycleBase 發出 STARTED 事件,完成啟動流程。

Service

StandardService 的 start 代碼如下所示:

  1. 啟動 Engine,Engine 的子容器也會被啟動,Web 應用的部署將在這一步驟完成;
  2. 啟動 Executor,這是 Tomcat 使用 Lifecycle 封裝的線程池,繼承自 java.util.concurrent.Executor 以及 Tomcat 的 Lifecycle 接口;
  3. 啟動 Connector 組件,Connector 完成 Endpoint 的啟動,此時意味著 Tomcat 可以對外提供請求服務。

StandardService.startInternal

protected void startInternal() throws LifecycleException {

    setState(LifecycleState.STARTING);

    // 啟動Engine
    if (engine != null) {
        synchronized (engine) {
            engine.start();
        }
    }

    // 啟動Executor線程池
    synchronized (executors) {
        for (Executor executor: executors) {
            executor.start();
        }
    }

    // 啟動MapperListener
    mapperListener.start();

    // 啟動Connector
    synchronized (connectorsLock) {
        for (Connector connector: connectors) {
            try {
                // If it has already failed, don't try and start it
                if (connector.getState() != LifecycleState.FAILED) {
                    connector.start();
                }
            } catch (Exception e) {
                // logger......
            }
        }
    }
}

Engine

StandardEngine 的標準實現為 org.apache.catalina.core.StandardEngine。其構造函數的主要職責是使用默認的基礎閥門創建 StandardEngine 組件。

/**
 * Create a new StandardEngine component with the default basic Valve.
 */
public StandardEngine() {
    super();
    pipeline.setBasic(new StandardEngineValve());
    /* Set the jmvRoute using the system property jvmRoute */
    try {
        setJvmRoute(System.getProperty("jvmRoute"));
    } catch(Exception ex) {
        log.warn(sm.getString("standardEngine.jvmRouteFail"));
    }
    // By default, the engine will hold the reloading thread
    backgroundProcessorDelay = 10;
}

讓我們來深入分析 StandardEngine.startInternal 方法。

StandardEngine.startInternal

@Override
protected synchronized void startInternal() throws LifecycleException {

    // Log our server identification information
    if(log.isInfoEnabled())
        log.info( "Starting Servlet Engine: " + ServerInfo.getServerInfo());

    // Standard container startup
    super.startInternal();
}

StandardEngine、StandardHost、StandardContext、StandardWrapper 這幾個容器之間存在著父子關系。一個父容器可以包含多個子容器,并且每個子容器都對應一個父容器。Engine 是頂層父容器,它沒有父容器。各個組件的包含關系如下圖所示:

圖片圖片

默認情況下,StandardEngine 只有一個子容器 StandardHost,一個 StandardContext 對應一個 Web 應用,而一個 StandardWrapper 對應一個 Web 應用里面的一個 Servlet。

StandardEngine、StandardHost、StandardContext、StandardWrapper 都是繼承自 ContainerBase,各個容器的啟動是由父容器調用子容器的 start 方法完成的,也就是說由 StandardEngine 啟動 StandardHost,再由 StandardHost 啟動 StandardContext,以此類推。

由于它們都繼承自 ContainerBase,當調用 start 啟動 Container 容器時,首先會執行 ContainerBase 的 start 方法。ContainerBase 會尋找子容器,并在線程池中啟動子容器。StandardEngine 也不例外。

ContainerBase

ContainerBase 的 startInternal 方法如下所示,主要分為以下三個步驟:

  1. 啟動子容器
  2. 啟動 Pipeline,并發出 STARTING 事件
  3. 如果 backgroundProcessorDelay 參數 >= 0,則開啟 ContainerBackgroundProcessor 線程,用于調用子容器的 backgroundProcess 方法
protected synchronized void startInternal() throws LifecycleException {
    // 省略若干代碼......

    // 把子容器的啟動步驟放在線程中處理,默認情況下線程池只有一個線程處理任務隊列
    Container children[] = findChildren();
    List<Future<Void>> results = new ArrayList<>();
    for (int i = 0; i < children.length; i++) {
        results.add(startStopExecutor.submit(new StartChild(children[i])));
    }

    // 阻塞當前線程,直到子容器start完成
    boolean fail = false;
    for (Future<Void> result : results) {
        try {
            result.get();
        } catch (Exception e) {
            log.error(sm.getString("containerBase.threadedStartFailed"), e);
            fail = true;
        }
    }

    // 啟用Pipeline
    if (pipeline instanceof Lifecycle)
        ((Lifecycle) pipeline).start();
    setState(LifecycleState.STARTING);

    // 開啟ContainerBackgroundProcessor線程用于調用子容器的backgroundProcess方法,默認情況下backgroundProcessorDelay=-1,不會啟用該線程
    threadStart();
}

ContainerBase 會將 StartChild 任務丟給線程池處理,并獲取 Future 對象。然后,它會遍歷所有 Future,并進行阻塞式的 result.get() 操作,這將異步啟動轉換為同步啟動,只有所有子容器都啟動完成才會繼續運行。

我們再來看看提交到線程池的 StartChild 任務,它實現了 java.util.concurrent.Callable 接口,并在 call 方法中完成子容器的 start 動作。

private static class StartChild implements Callable<Void> {

    private Container child;

    public StartChild(Container child) {
        this.child = child;
    }

    @Override
    public Void call() throws LifecycleException {
        child.start();
        return null;
    }
}

啟動 Pipeline

默認使用 StandardPipeline 實現類,它也是一個 Lifecycle。在容器啟動時,StandardPipeline 會遍歷 Valve 鏈表,如果 Valve 是 Lifecycle 的子類,則會調用其 start 方法啟動 Valve 組件,代碼如下:

public class StandardPipeline extends LifecycleBase
        implements Pipeline, Contained {


    protected synchronized void startInternal() throws LifecycleException {

        Valve current = first;
        if (current == null) {
            current = basic;
        }
        while (current != null) {
            if (current instanceof Lifecycle)
                ((Lifecycle) current).start();
            current = current.getNext();
        }

        setState(LifecycleState.STARTING);
    }

}

Host

在分析 Host 時,我們可以從 Host 的構造函數入手,該方法主要負責設置基礎閥門。

ublic StandardHost() {
    super();
    pipeline.setBasic(new StandardHostValve());
}

StandardEngine.startInternal

protected synchronized void startInternal() throws LifecycleException {

    // errorValve默認使用org.apache.catalina.valves.ErrorReportValve
    String errorValve = getErrorReportValveClass();
    if ((errorValve != null) && (!errorValve.equals(""))) {
        try {
            boolean found = false;

            // 如果所有的閥門中已經存在這個實例,則不進行處理,否則添加到  Pipeline 中
            Valve[] valves = getPipeline().getValves();
            for (Valve valve : valves) {
                if (errorValve.equals(valve.getClass().getName())) {
                    found = true;
                    break;
                }
            }

            // 如果未找到則添加到 Pipeline 中,注意是添加到 basic valve 的前面
            // 默認情況下,first valve 是 AccessLogValve,basic 是 StandardHostValve
            if(!found) {
                Valve valve =
                    (Valve) Class.forName(errorValve).getConstructor().newInstance();
                getPipeline().addValve(valve);
            }
        } catch (Throwable t) {
            // 處理異常,省略......
        }
    }

    // 調用父類 ContainerBase,完成統一的啟動動作
    super.startInternal();
}

StandardHost Pipeline 包含的 Valve 組件:

  1. basic:org.apache.catalina.core.StandardHostValve
  2. first:org.apache.catalina.valves.AccessLogValve

需要注意的是,在往 Pipeline 中添加 Valve 閥門時,是添加到 first 后面,basic 前面。

Context

接下來,讓我們深入分析 Context 的實現類 org.apache.catalina.core.StandardContext。

首先,我們來看看構造方法,該方法用于設置 Context.pipeline 的基礎閥門。

public StandardContext() {
    super();
    pipeline.setBasic(new StandardContextValve());
    broadcaster = new NotificationBroadcasterSupport();
    // Set defaults
    if (!Globals.STRICT_SERVLET_COMPLIANCE) {
        // Strict servlet compliance requires all extension mapped servlets
        // to be checked against welcome files
        resourceOnlyServlets.add("jsp");
    }
}

啟動方法與之前分析的容器啟動方法類似,這里不再贅述。

Wrapper

Wrapper 是一個 Servlet 的包裝,我們先來看看構造方法。其主要作用是設置基礎閥門 StandardWrapperValve。

public StandardWrapper() {
    super();
    swValve=new StandardWrapperValve();
    pipeline.setBasic(swValve);
    broadcaster = new NotificationBroadcasterSupport();
}

這里每個容器中的 pipeline 設置的 StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve 都是非常重要的,它們在 HTTP 請求處理過程中扮演著關鍵角色,我們將在后續的文章中詳細講解。

結語

至此,整個啟動過程便告一段落。整個啟動過程由父組件控制子組件的啟動,一層層往下傳遞,直到最后全部啟動完成。

責任編輯:武曉燕 來源: 碼上遇見你
相關推薦

2014-06-23 10:31:09

Android啟動過程

2011-06-28 13:27:13

ARM Linux

2019-05-27 14:43:49

Tomcat架構部署

2020-04-20 21:30:51

Tomcat部署架構

2018-03-13 13:00:03

Linux運維啟動分析

2012-02-20 14:47:08

JavaPlay

2012-08-16 09:07:57

Erlang

2024-09-09 09:29:05

2011-07-28 10:34:38

Cocoa 程序 啟動

2011-09-05 17:35:18

MTK啟動過程RTOS

2009-12-03 10:00:46

Linux系統啟動

2021-01-07 07:33:06

Tomcat啟動工具

2021-07-02 06:34:53

Go語言sysmon

2010-05-06 14:05:15

Unix系統

2014-06-19 14:59:40

Android應用程序進程啟動

2014-06-20 11:20:37

Android應用程序進程啟動

2014-06-19 14:30:28

Android應用程序進程啟動

2014-06-19 14:54:11

Android應用程序進程啟動

2014-06-20 11:05:56

Android應用程序進程啟動

2014-06-20 11:24:34

Android應用程序進程啟動
點贊
收藏

51CTO技術棧公眾號

a视频免费在线观看| 我和岳m愉情xxxⅹ视频| 国产啊啊啊视频在线观看| 成人在线一区二区三区| 91国内在线视频| 亚洲性猛交xxxx乱大交| 国产一区二区| 免费一级欧美片在线播放| 在线电影欧美成精品| 肉大捧一出免费观看网站在线播放| 国产成人精品一区二三区四区五区| 在线欧美一区| 最近2019中文字幕mv免费看| 日本女人性视频| 成人在线视频播放| 亚洲午夜在线观看视频在线| 日本视频一区在线观看| h狠狠躁死你h高h| 日韩精品欧美精品| 91高清在线免费观看| 在线观看美女av| 国产成人久久| 亚洲精品国精品久久99热| 黄色www网站| 成人高清免费在线| 国产日本欧洲亚洲| 国产欧美一区二区三区不卡高清| 中文字幕日本人妻久久久免费| 国产精品九九| 久久久精品网站| 免费看黄色三级| 欧美精品中文| 欧美mv日韩mv国产网站app| 最新中文字幕免费视频| 亚洲天堂av影院| 精品在线免费视频| 国产xxx69麻豆国语对白| 久久9999久久免费精品国产| 国产精品极品在线观看| 在线电影院国产精品| 国产三级三级三级看三级| 国产理论在线| 性欧美疯狂xxxxbbbb| 成人女人免费毛片| 国产极品在线播放| 欧美 日韩 国产一区二区在线视频| 在线视频国产日韩| 不卡av免费在线| 国产在线精彩视频| 亚洲国产精品综合小说图片区| 久久久久亚洲av无码专区喷水| 成年人视频网站在线| 久久久精品中文字幕麻豆发布| 国产一区二区高清不卡| 色窝窝无码一区二区三区成人网站| 精品一区二区三区视频| 国产综合色香蕉精品| 中文字幕网址在线| 久久se精品一区精品二区| 国产美女直播视频一区| 影音先锋国产资源| 久久99精品久久久久婷婷| 成人性生交大片免费看视频直播 | 亚洲少妇一区二区| 亚洲大奶少妇| 亚洲国产精品国自产拍av秋霞| 这里只有精品在线观看视频| 免费日韩一区二区三区| 国产视频欧美视频| 少妇精品无码一区二区免费视频| 欧洲视频一区| 久久亚洲精品毛片| 久久久久国产精品夜夜夜夜夜| 欧美三级网页| 亲子乱一区二区三区电影 | 免费网站在线观看人| 亚洲动漫第一页| 97成人在线观看视频| porn视频在线观看| 中文字幕亚洲欧美在线不卡| 成人精品一二区| 日本黄视频在线观看| 久久丝袜美腿综合| 在线视频不卡一区二区| 色婷婷视频在线观看| 高跟丝袜欧美一区| 性chinese极品按摩| 久久的色偷偷| 欧洲国产伦久久久久久久| 色乱码一区二区三区在线| 日韩免费高清视频网站| 日韩av一卡二卡| 婷婷综合在线视频| 亚洲性色视频| 国产精品久久久久久久久借妻 | 午夜免费激情视频| 亚洲一区二区三区高清| 国产专区欧美专区| 青青九九免费视频在线| 亚洲视频免费看| 日韩在线视频在线观看| 成人黄色91| 亚洲男女自偷自拍图片另类| 艳妇荡乳欲伦69影片| 午夜在线播放视频欧美| 亚洲一区二区久久久久久久| 成人免费视频毛片| 亚洲精品国产首次亮相| 午夜精品久久久久久99热软件| 日批视频免费观看| 不卡的av网站| 国产高清在线精品一区二区三区| 欧美日韩影视| 亚洲一区二区三区四区不卡 | 精品无人区卡一卡二卡三乱码免费卡 | 无码精品一区二区三区在线播放 | 久久男人资源站| 福利一区视频| 欧美自拍偷拍一区| 亚洲图片欧美另类| 婷婷六月综合| 国产精品 欧美在线| 日本xxxxwww| 亚洲欧美精品午睡沙发| 久久综合伊人77777麻豆最新章节| 亚洲一区二区三区日本久久九| 一区二区三区视频在线 | 丝袜美腿美女被狂躁在线观看| 香蕉av福利精品导航| 午夜免费一级片| 视频在线不卡免费观看| 日本亚洲欧美三级| 亚洲三级中文字幕| 亚洲丰满少妇videoshd| 国产乱淫av麻豆国产免费| 久久久久久美女精品| 国产精品日韩欧美大师| 国产资源在线观看| 久久久国产精华| 激情深爱综合网| 成人线上播放| 欧美精品电影免费在线观看| 亚洲 欧美 视频| 成+人+亚洲+综合天堂| 欧美视频在线第一页| 国产日韩一区二区三免费高清| 日韩在线欧美在线| 亚洲在线免费观看视频| 国产精品美女久久久久久| 免费看黄色一级大片| 久操精品在线| 久久精品2019中文字幕| 一级特黄aa大片| 成人欧美一区二区三区1314| 欧美国产日韩另类| 91超碰成人| 高清国产一区| 国产高清自产拍av在线| 精品亚洲aⅴ在线观看| 99精品人妻国产毛片| 久久久久久电影| 日韩肉感妇bbwbbwbbw| 日韩中文首页| 亚洲曰本av电影| av中文资源在线资源免费观看| 亚洲第一精品久久忘忧草社区| 日韩黄色精品视频| 91免费观看在线| 今天免费高清在线观看国语| 久久精品九色| 97精品伊人久久久大香线蕉| 神马久久高清| 亚洲精品国产第一综合99久久| 在线a免费观看| 在线观看日韩av电影| 欧美另类高清视频在线| 美女黄视频在线观看| 日韩一级片网址| 中日韩黄色大片| 欧美国产日产图区| 在线一区二区不卡| 国产日韩亚洲欧美精品| 亚洲欧美日韩精品综合在线观看| 日韩一级淫片| 国产成人精品视频在线| 国产网站在线免费观看| 日韩激情视频在线播放| 91亚洲国产成人精品一区| 亚洲自拍偷拍网站| 99精品欧美一区二区| 国产精品一卡二卡| 最新av在线免费观看| 性欧美freehd18| 欧美大奶子在线| 嫩草在线播放| 日韩一区二区在线观看视频| 亚洲天堂视频网站| 亚洲欧洲国产专区| 国产美女喷水视频| 国产伦精品一区二区三区免费| www.中文字幕在线| 影音先锋日韩在线| 欧美一区二区在线视频观看| 麻豆国产精品| 国产成人久久精品| 国产三级伦理在线| 日韩视频免费在线观看| 亚洲欧美日韩动漫| 日韩亚洲电影在线| 日韩精品在线一区二区三区| 亚洲一区二区四区蜜桃| 亚洲精品国产精品乱码在线观看| 视频在线在亚洲| 亚洲精品久久久久久久蜜桃臀| 日韩欧美电影| 欧美三日本三级少妇三99| youjizz亚洲| 亚洲最大福利视频网| 欧美xxxxhdvideosex| 中文字幕自拍vr一区二区三区| 亚洲av成人无码久久精品老人| 欧美一区二区大片| 亚洲综合精品国产一区二区三区| 色综合中文字幕| 亚欧视频在线观看| 亚洲高清视频的网址| 一级性生活免费视频| 国产欧美精品一区| 最近中文字幕免费| 久久日一线二线三线suv| www.17c.com喷水少妇| 成人午夜激情片| 亚洲成人福利视频| 国产成人啪午夜精品网站男同| 视频免费1区二区三区| 男女激情视频一区| 少妇一级淫免费放| 青青草97国产精品免费观看| aaa毛片在线观看| 一本色道88久久加勒比精品| 韩日视频在线观看| 亚洲区一区二| 国产一级爱c视频| 日韩午夜免费视频| 亚洲 高清 成人 动漫| 免费日韩一区二区| 人妻无码视频一区二区三区| 久久国产精品99国产| 可以在线看的黄色网址| 天堂一区二区在线免费观看| 国产精品无码一本二本三本色| 国产精品亚洲欧美| 国产成人亚洲精品无码h在线| 国产美女一区| 亚洲最大综合网| 国内精品不卡在线| 人妻换人妻仑乱| 成人国产一区二区三区精品| 中文字幕人妻一区| 91论坛在线播放| 亚洲色图 激情小说| 最新中文字幕一区二区三区 | 91一区在线| 日韩精品一区二区三区电影| 欧美福利一区| 国产原创中文在线观看 | 日韩专区精品| 国产 欧美 日本| 在线视频日韩| 亚洲国产精品三区| 国产精品一区二区你懂的| 一本色道久久hezyo无码| 91在线视频播放| 极品尤物一区二区| 亚洲最快最全在线视频| 在线观看精品国产| 欧美日韩极品在线观看一区| 国产深喉视频一区二区| 亚洲精品国产美女| 日韩专区在线| 午夜精品视频在线| 色狠狠一区二区三区| av观看久久| 欧美综合在线视频观看| 欧美图片激情小说| 日韩激情视频在线观看| 免费欧美一级片| 久久久久国产精品麻豆ai换脸 | 亚洲精品免费网站| 婷婷激情久久| 潘金莲一级淫片aaaaa免费看| 国产精品一二| 亚洲综合中文网| 国产视频在线观看一区二区三区 | 欧美理论电影在线| 人妻妺妺窝人体色www聚色窝| 伊人伊成久久人综合网小说| 青春草视频在线观看| 国产精品成人va在线观看| 波多野结衣在线一区二区| 色一情一区二区三区四区| 精久久久久久| 在线观看日本www| 久久久精品国产免费观看同学| 强行糟蹋人妻hd中文| 91福利小视频| 日韩在线观看视频一区| 精品国产一区二区三区久久狼5月| 涩涩涩在线视频| 99国产盗摄| 91精品精品| 亚洲一级免费观看| 久久在线观看免费| 国产主播在线播放| 3d动漫精品啪啪1区2区免费| 国产主播福利在线| 91高清视频免费| 澳门久久精品| 桥本有菜av在线| 免费在线观看精品| 日本乱子伦xxxx| 精品日韩视频在线观看| 欧美一级视频免费| 九色91av视频| 尤物视频在线看| 国产美女91呻吟求| 成人看的视频| 北条麻妃在线视频| 久久综合色一综合色88| 日本少妇久久久| 精品久久久久久最新网址| 成人av免费| 亚洲a区在线视频| 日韩综合一区| 日本黄大片一区二区三区| 亚洲国产精品成人综合| 国产又粗又猛又黄视频| 国产网站欧美日韩免费精品在线观看 | av中文字幕网址| 国产精品第13页| 在线观看毛片视频| 色婷婷av一区二区三区在线观看| 国产一区一一区高清不卡| 日韩视频专区| 婷婷久久综合| 亚洲综合123| 亚洲精品国产无天堂网2021| a天堂视频在线| 欧美极品在线播放| 国产精品久久久久久久久久白浆 | 国产尤物在线播放| 欧美一级淫片007| 色操视频在线| 九九九九精品九九九九| 免费亚洲视频| 亚洲精品国产精品乱码在线观看| 欧美日韩高清一区二区三区| 久久综合之合合综合久久| yellow视频在线观看一区二区| 国产在线成人| 美女又爽又黄视频毛茸茸| 色综合久久88色综合天天6| 成人午夜电影在线观看| 国产一区二区在线播放| 一区二区三区在线观看免费| 日本天堂在线播放| 一本大道久久精品懂色aⅴ| yourporn在线观看视频| 成人在线播放av| 狠狠入ady亚洲精品经典电影| av无码一区二区三区| 欧美在线视频不卡| 黄色免费在线观看| 国内不卡一区二区三区| 日韩电影网1区2区| 欧美色图亚洲视频| 日韩大陆欧美高清视频区| 四虎4545www精品视频| 超碰在线免费观看97| 99久久精品国产导航| 在线观看日韩一区二区| 欧美极品少妇xxxxⅹ免费视频| 免费精品国产的网站免费观看| 久久国产激情视频| 亚洲电影在线播放| 91在线看片| 国内精品二区| 美美哒免费高清在线观看视频一区二区 | wwwwxxxx日韩| 一区二区三区四区不卡在线 | 欧美1区2区3区4区| 手机看片一级片| 五月激情丁香一区二区三区| 99riav在线| 久久精品日产第一区二区三区| 老司机免费视频一区二区| 欧美三日本三级少妇99| 久久久精品在线观看| 国产免费久久| 激情综合激情五月|