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

Tomcat 架構(gòu)設(shè)計 25 年后依舊能打!我學(xué)到了什么?

開發(fā) 架構(gòu)
這是因為請求到達 Engine 容器中之前,Mapper 組件已經(jīng)對請求進行了路由處理,Mapper 組件通過請求的 URL 定位了相應(yīng)的容器,并且把容器對象保存到了請求對象中。

 你好,我是碼哥,可以叫我靚仔。是一個擁抱硬核技術(shù)和對象,面向人民幣編程的男人。友情提示:閱讀本文前需要對 Tomcat 有一個全局架構(gòu)認識,可先翻閱《Tomcat 架構(gòu)深度解析》。

Tomcat 是 Sun 公司在 1998 年開發(fā)的。當時開發(fā) Tomcat 的目標是成為 Sun 公司的 Java Servlet 和 JSP 規(guī)范的參考實現(xiàn)。

如今已經(jīng)成為業(yè)務(wù)開發(fā)首選的 Web 應(yīng)用服務(wù)器,Spring Boot 直接將 Tomcat 內(nèi)置作為 Web 應(yīng)用啟動,二十五年寶刀未老。其中的架構(gòu)設(shè)計思維值得我們深入學(xué)習和借鑒。

碼哥今天帶你深入探究,學(xué)會借鑒 Tomcat 的設(shè)計思想在工作中做好架構(gòu)設(shè)計。

在Tomcat 架構(gòu)解析到設(shè)計思想借鑒中我們學(xué)到 Tomcat 的總體架構(gòu),學(xué)會從宏觀上怎么去設(shè)計一個復(fù)雜系統(tǒng),怎么設(shè)計頂層模塊,以及模塊之間的關(guān)系;

Tomcat 實現(xiàn)的 2 個核心功能:

  • 處理 Socket 連接,負責網(wǎng)絡(luò)字節(jié)流與 Request 和 Response 對象的轉(zhuǎn)化。
  • 加載并管理 Servlet ,以及處理具體的 Request 請求。

所以 Tomcat 設(shè)計了兩個核心組件連接器(Connector)和容器(Container),連接器負責對外交流,容器負責內(nèi)部處理。

Tomcat整體架構(gòu)Tomcat整體架構(gòu)

管理組件,運籌帷幄

本篇作為 Tomcat 系列的第三篇,帶大家體會 Tomcat 是如何構(gòu)建的?每個組件如何管理組件的?連接器和容器是如何被啟動和管理的?

Tomcat 啟動流程:startup.sh -> catalina.sh start ->java -jar org.apache.catalina.startup.Bootstrap.main()

Tomcat 啟動流程Tomcat 啟動流程

Bootstrap、Catalina、Server、Service、 Engine 都承擔了什么責任?

圖片圖片

單獨寫一篇介紹他們是因為你可以看到這些啟動類或者組件不處理具體請求,它們的任務(wù)主要是管理,管理下層組件的生命周期,并且給下層組件分配任務(wù),也就是把請求路由到負責干活兒的組件。

他們就像一個公司的高層,管理整個公司的運作,將任務(wù)分配給專業(yè)的人。

我們在設(shè)計軟件系統(tǒng)中,不可避免地會遇到需要一些管理作用的組件,就可以學(xué)習和借鑒 Tomcat 是如何抽象和管理這些組件的。

Bootstrap

當執(zhí)行 startup.sh 腳本的時候,就會啟動一個 JVM 運行 Tomcat 的啟動類 Bootstrap 的 main 方法。

先看下他的成員變量窺探核心功能:

public final class Bootstrap {
    ClassLoader commonLoader = null;
    ClassLoader catalinaLoader = null;
    ClassLoader sharedLoader = null;
}

它的主要任務(wù)就是初始化 Tomcat 定義的類加載器,同時創(chuàng)建 Catalina 對象。

Bootstrap 猶如女媧,女媧造人,它初始化了類加載器,加載萬物。

關(guān)于為何自定義各種類加載器詳情請查看碼哥的 Tomcat 架構(gòu)設(shè)計解析 類加載器部分。

初始化類加載器

如何WebAppClassLoader

假如我們在 Tomcat 中運行了兩個 Web 應(yīng)用程序,兩個 Web 應(yīng)用中有同名的 Servlet,但是功能不同,Tomcat 需要同時加載和管理這兩個同名的 Servlet類,保證它們不會沖突,因此 Web 應(yīng)用之間的類需要隔離。

Tomcat 的解決方案是自定義一個類加載器 WebAppClassLoader, 并且給每個 Web 應(yīng)用創(chuàng)建一個類加載器實例。

我們知道,Context 容器組件對應(yīng)一個 Web 應(yīng)用。因此,每個 Context容器負責創(chuàng)建和維護一個 WebAppClassLoader加載器實例。

這背后的原理是,不同的加載器實例加載的類被認為是不同的類,即使它們的類名相同。

Tomcat 的自定義類加載器 WebAppClassLoader打破了雙親委托機制,它首先自己嘗試去加載某個類,如果找不到則通過 ExtClassLoader 加載 JRE 核心類防止黑客攻擊,無法加載再代理給 AppClassLoader 加載器,其目的是優(yōu)先加載 Web 應(yīng)用自己定義的類。

具體實現(xiàn)就是重寫 ClassLoader的兩個方法:findClass和 loadClass。

SharedClassLoader

假如兩個 Web 應(yīng)用都依賴同一個第三方的 JAR 包,比如 Spring,那 Spring的 JAR 包被加載到內(nèi)存后,Tomcat要保證這兩個 Web 應(yīng)用能夠共享,也就是說 Spring的 JAR 包只被加載一次。

SharedClassLoader 就是 Web 應(yīng)用共享的類庫的加載器,專門加載 Web 應(yīng)用共享的類。

如果 WebAppClassLoader自己沒有加載到某個類,就會委托父加載器 SharedClassLoader去加載這個類,SharedClassLoader會在指定目錄下加載共享類,之后返回給 WebAppClassLoader,這樣共享的問題就解決了。

CatalinaClassloader

如何隔離 Tomcat 本身的類和 Web 應(yīng)用的類?

要共享可以通過父子關(guān)系,要隔離那就需要兄弟關(guān)系了。

兄弟關(guān)系就是指兩個類加載器是平行的,它們可能擁有同一個父加載器,基于此 Tomcat 又設(shè)計一個類加載器 CatalinaClassloader,專門來加載 Tomcat 自身的類。

這樣設(shè)計有個問題,那 Tomcat 和各 Web 應(yīng)用之間需要共享一些類時該怎么辦呢?

老辦法,還是再增加一個 CommonClassLoader,作為 CatalinaClassloader和 SharedClassLoader 的父加載器。

CommonClassLoader能加載的類都可以被 CatalinaClassLoader和 SharedClassLoader 使用。

Catalina

Catalina 就好像是一個帝王,管理天下。就是它創(chuàng)建 Server 以及所有子組件。

Catalina 的主要任務(wù)就是創(chuàng)建 Server,解析 server.xml 把里面配置的各個組件創(chuàng)建出來,并調(diào)用每個組件的 init和 start方法,將整個 Tomcat 啟動,這樣整個帝國就在正常運作了。

我們可以根據(jù) Tomcat 配置文件來直觀感受下:

<Server port="8005" shutdown="SHUTDOWN"> // 頂層組件,可包含多個 Service,代表一個 Tomcat 實例

  <Service name="Catalina">  // 頂層組件,包含一個 Engine ,多個連接器
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  // 連接器

 // 容器組件:一個 Engine 處理 Service 所有請求,包含多個 Host
    <Engine name="Catalina" defaultHost="localhost">
   // 容器組件:處理指定Host下的客戶端請求, 可包含多個 Context
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
   // 容器組件:處理特定 Context Web應(yīng)用的所有客戶端請求
   <Context></Context>
      </Host>
    </Engine>
  </Service>
</Server>

作為帝王,Catalina 還需要處理國家的各種異常情況,比如有人搶公章(執(zhí)行了 Ctrl + C 關(guān)閉 Tomcat)。

Tomcat 要如何清理資源呢?

通過向 JVM 注冊一個「關(guān)閉鉤子」,具體關(guān)鍵邏輯詳見

org.apache.catalina.startup.Catalina#start 源碼:

  1. Server 不存在則解析 server.xml 創(chuàng)建;
  2. 創(chuàng)建失敗則報錯;
  3. 啟動 Server;
  4. 創(chuàng)建并注冊「關(guān)閉鉤子」;
  5. await 方法監(jiān)聽停止請求。
/**
     * Start a new server instance.
     */
    public void start() {

        // 如果 Catalina 持有的 Server 為空則解析 server.xml 創(chuàng)建
        if (getServer() == null) {
            load();
        }

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

        // Start the new server
        try {
            getServer().start();
        } catch (LifecycleException e) {
            // 省略部分代碼
        }

        // 創(chuàng)建鉤子并注冊
        if (useShutdownHook) {
            if (shutdownHook == null) {
                shutdownHook = new CatalinaShutdownHook();
            }
            Runtime.getRuntime().addShutdownHook(shutdownHook);
        }

        // 監(jiān)聽停止請求,內(nèi)部調(diào)用 Server 的 stop
        if (await) {
            await();
            stop();
        }
    }

當我們需要在 JVM 關(guān)閉做一些清理工作,比如將緩存數(shù)據(jù)刷到磁盤或者清理一些文件,就可以向 JVM 注冊一個「關(guān)閉鉤子」。

它其實就是一個線程,當 JVM 停止前嘗試執(zhí)行這個線程的 run 方法。

org.apache.catalina.startup.Catalina.CatalinaShutdownHook

protected class CatalinaShutdownHook extends Thread {

        @Override
        public void run() {
            try {
                if (getServer() != null) {
                    Catalina.this.stop();
                }
            } catch (Throwable ex) {
              // 省略部分代碼....
            }
        }
    }

其實就是執(zhí)行了 Catalina 的 stop 方法,通過它將整個 Tomcat 停止。

Server

Server 組件的職責就是管理 Service 組件,負責調(diào)用持有的 Service 的 start 方法。

他就像是帝國的丞相,負責管理多個事業(yè)部,每個事業(yè)部就是一個 Service。

它管理兩個部門:

  • Connector 連接器:對外市場營銷部,推廣吹牛寫 PPT 的。
  • Container 容器:研發(fā)部門,沒有性生活的 996 社畜 。

實現(xiàn)類是 org.apache.catalina.core.StandardServer,Server 繼承 org.apache.catalina.util.LifecycleMBeanBase,所以他的生命周期也被統(tǒng)一管理,Server 的子組件是 Service,所以還需要管理 Service 的生命周期。

也就是說在啟動和關(guān)閉 Server 的時候會分別先調(diào)用 Service 的 啟動和停止方法。

這就是設(shè)計思想呀,抽象出生命周期 Lifecycle 接口,體現(xiàn)出接口隔離原則,將生命周期的相關(guān)功能內(nèi)聚。

我們接著看 Server 如何管理 Service 的,核心源碼如下 org.apache.catalina.core.StandardServer#addService:

public void addService(Service service) {

        service.setServer(this);

        synchronized (servicesLock) {
            // 創(chuàng)建 長度 +1 的數(shù)組
            Service results[] = new Service[services.length + 1];
            // 將舊的數(shù)據(jù)復(fù)制到新數(shù)組
            System.arraycopy(services, 0, results, 0, services.length);
            results[services.length] = service;
            services = results;
            // 啟動 Service 組件
            if (getState().isAvailable()) {
                try {
                    service.start();
                } catch (LifecycleException e) {
                    // Ignore
                }
            }

            // 發(fā)送事件
            support.firePropertyChange("service", null, service);
        }

    }

在添加 Service 過程中動態(tài)拓展數(shù)組長度,為了節(jié)省內(nèi)存。

除此之外,Server 組件還有一個重要的任務(wù)是啟動一個 Socket 來監(jiān)聽停止端口,這就是為什么你能通過 shutdown 命令來關(guān)閉 Tomcat。

不知道你留意到?jīng)]有,上面 Caralina 的啟動方法的最后一行代碼就是調(diào)用了 Server 的 await 方法。

在 await 方法里會創(chuàng)建一個 Socket 監(jiān)聽 8005 端口,并在一個死循環(huán)里接收 Socket 上的連接請求,如果有新的連接到來就建立連接,然后從 Socket 中讀取數(shù)據(jù);如果讀到的數(shù)據(jù)是停止命令“SHUTDOWN”,就退出循環(huán),進入 stop 流程。

Service

他的職責就是管理 Connector 連接器 和 頂層容器 Engine,會分別調(diào)用他們的 start 方法。至此,整個 Tomcat 就算啟動完成了。

Service 就是事業(yè)部的話事人,管理兩個職能部門對外推廣部(連接器),對內(nèi)研發(fā)部(容器)。

Service 組件的實現(xiàn)類是org.apache.catalina.core.StandardService,直接看關(guān)鍵的成員變量。

public class StandardService extends LifecycleMBeanBase implements Service {
    // 名字
    private String name = null;

    // 所屬的 Server 實例
    private Server server = null;

    // 連接器數(shù)組
    protected Connector connectors[] = new Connector[0];
    private final Object connectorsLock = new Object();

    // 對應(yīng)的 Engine 容器
    private Engine engine = null;

    // 映射器及其監(jiān)聽器
    protected final Mapper mapper = new Mapper();
    protected final MapperListener mapperListener = new MapperListener(this);
}

繼承 LifecycleMBeanBase 而 LifecycleMBeanBase 又繼承 LifecycleBase,這里實際上是模板方法模式的運用,org.apache.catalina.util.LifecycleBase#init,org.apache.catalina.util.LifecycleBase#start,org.apache.catalina.util.LifecycleBase#stop 分別是對應(yīng)的模板方法,內(nèi)部定義了整個算法流程,子類去實現(xiàn)自己內(nèi)部具體變化部分,將變與不變抽象出來實現(xiàn)開閉原則設(shè)計思路。

那為什么還有一個 MapperListener?這是因為 Tomcat 支持熱部署,當 Web 應(yīng)用的部署發(fā)生變化時,Mapper 中的映射信息也要跟著變化,MapperListener 就是一個監(jiān)聽器,它監(jiān)聽容器的變化,并把信息更新到 Mapper 中,這是典型的觀察者模式。

作為“管理”角色的組件,最重要的是維護其他組件的生命周期。

此外在啟動各種組件時,要注意它們的依賴關(guān)系,也就是說,要注意啟動的順序。我們來看看 Service 啟動方法:

protected void startInternal() throws LifecycleException {

    //1. 觸發(fā)啟動監(jiān)聽器
    setState(LifecycleState.STARTING);

    //2. 先啟動 Engine,Engine 會啟動它子容器
    if (engine != null) {
        synchronized (engine) {
            engine.start();
        }
    }

    //3. 再啟動 Mapper 監(jiān)聽器
    mapperListener.start();

    //4. 最后啟動連接器,連接器會啟動它子組件,比如 Endpoint
    synchronized (connectorsLock) {
        for (Connector connector: connectors) {
            if (connector.getState() != LifecycleState.FAILED) {
                connector.start();
            }
        }
    }
}

這里啟動順序也很講究,Service 先啟動了 Engine 組件,再啟動 Mapper 監(jiān)聽器,最后才是啟動連接器。

這很好理解,因為內(nèi)層組件啟動好了才能對外提供服務(wù),產(chǎn)品沒做出來,市場部也不能瞎忽悠,研發(fā)好了才能啟動外層的連接器組件。

而 Mapper 也依賴容器組件,容器組件啟動好了才能監(jiān)聽它們的變化,因此 Mapper 和 MapperListener 在容器組件之后啟動。

組件停止的順序跟啟動順序正好相反的,也是基于它們的依賴關(guān)系。

Engine

他是最頂層的容器組件。繼承 Container,所有的容器組件都繼承 Container,這里實際上運用了組合模式統(tǒng)一管理。

他的實現(xiàn)類是 org.apache.catalina.core.StandardEngine,繼承 ContainerBase。

public class StandardEngine extends ContainerBase implements Engine {
}

他的子容器是 Host,所以持有 Host 容器數(shù)組,這個屬性每個容器都會存在,所以放在抽象類中

protected final HashMap<String, Container> children = new HashMap<>();

ContainerBase 用 HashMap 保存了它的子容器,并且 ContainerBase 還實現(xiàn)了子容器的“增刪改查”,甚至連子組件的啟動和停止都提供了默認實現(xiàn),比如 ContainerBase 會用專門的線程池來啟動子容器。

org.apache.catalina.core.ContainerBase#startInternal

// Start our child containers, if any
Container children[] = findChildren();
List<Future<Void>> results = new ArrayList<>();
for (Container child : children) {
  results.add(startStopExecutor.submit(new StartChild(child)));
}

Engine 在啟動 Host 子容器時就直接重用了這個方法。

容器組件最重要的功能是處理請求,而 Engine 容器對請求的“處理”,其實就是把請求轉(zhuǎn)發(fā)給某一個 Host 子容器來處理,具體是通過 Valve 來實現(xiàn)的。

每一個容器組件都有一個 Pipeline,而 Pipeline 中有一個基礎(chǔ)閥(Basic Valve),透過構(gòu)造方法創(chuàng)建 Pipeline。

public StandardEngine() {

    super();
    pipeline.setBasic(new StandardEngineValve());
    // 省略部分代碼

}

Engine 容器的基礎(chǔ)閥定義如下:

final class StandardEngineValve extends ValveBase {

    public final void invoke(Request request, Response response)
      throws IOException, ServletException {

      // 拿到請求中的 Host 容器
      Host host = request.getHost();
      if (host == null) {
          return;
      }

      // 調(diào)用 Host 容器中的 Pipeline 中的第一個 Valve
      host.getPipeline().getFirst().invoke(request, response);
  }

}

這個基礎(chǔ)閥實現(xiàn)非常簡單,就是把請求轉(zhuǎn)發(fā)到 Host 容器。

從代碼中可以看到,處理請求的 Host 容器對象是從請求中拿到的,請求對象中怎么會有 Host 容器呢?

這是因為請求到達 Engine 容器中之前,Mapper 組件已經(jīng)對請求進行了路由處理,Mapper 組件通過請求的 URL 定位了相應(yīng)的容器,并且把容器對象保存到了請求對象中。

責任編輯:武曉燕 來源: 碼哥字節(jié)
相關(guān)推薦

2021-03-09 09:55:02

Vuejs前端代碼

2021-07-28 07:01:09

薅羊毛架構(gòu)Vue+SSR

2015-07-20 10:02:57

Java團隊領(lǐng)導(dǎo)人

2022-03-27 09:06:04

React類型定義前端

2016-01-18 10:06:05

編程

2020-10-30 12:40:04

Reac性能優(yōu)化

2019-11-25 10:58:19

Tomcat架構(gòu)Web

2020-02-22 15:01:51

后端前端開發(fā)

2023-10-16 08:55:43

Redisson分布式

2022-09-13 08:05:47

AlloyDb架構(gòu)數(shù)據(jù)庫

2020-12-31 10:47:03

開發(fā)Vuejs技術(shù)

2023-04-10 07:40:36

GraphQLRest通信模式

2020-07-06 15:24:50

技術(shù)人工智能面試

2022-07-19 08:04:04

HTTP應(yīng)用層協(xié)議

2023-06-03 00:05:18

TypeScriptJSDoc掃描器

2024-11-13 09:22:40

2023-12-13 08:31:23

2017-02-05 17:53:12

2024-04-12 08:54:13

從庫數(shù)據(jù)庫應(yīng)用

2020-07-07 08:52:16

機器學(xué)習機器學(xué)習工具人工智能
點贊
收藏

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

毛片av在线播放| 国产精品一区二区久久精品| 成年女人免费视频| 欧美人体一区二区三区| 国产精品久久久久久久久快鸭 | 亚洲国产欧美一区| 日韩在线xxx| 天堂亚洲精品| 久久久亚洲国产美女国产盗摄| 国产美女精彩久久| 91国产丝袜播放在线| 国产精品99一区二区三| 日韩av资源在线播放| 波多结衣在线观看| 蜜桃av在线播放| 18欧美乱大交hd1984| 精品一区二区视频| 国产suv一区二区| 日韩中文字幕1| 久久久女人电视剧免费播放下载| 国产激情av在线| 精品人人人人| 欧美成人三级在线| 日本人69视频| 欧美三级网址| 午夜精品免费在线| 国内自拍中文字幕| 青青青青在线| 国产日韩综合av| 国产伦精品一区二区| 国产免费不卡av| 老司机免费视频一区二区三区| 91精品国产91久久久| 亚洲国产美女视频| 水蜜桃久久夜色精品一区| 亚洲免费高清视频| 久久精品综合视频| 99精品国产一区二区三区2021 | 免费成人网www| 欧美成人性福生活免费看| 亚洲黄色av片| 精品女同一区二区三区在线观看| 一本大道av伊人久久综合| av网站手机在线观看| 中国av在线播放| 亚洲欧美福利一区二区| 亚洲一区二区三区免费看| 大乳在线免费观看| 国产日本欧美一区二区| 欧美另类一区| 黄色大片在线看| 久久久亚洲综合| 欧美日韩亚洲一区二区三区四区| 午夜视频免费看| 99久久99久久精品免费看蜜桃| 成人精品水蜜桃| 亚洲男人第一天堂| 成人av免费在线播放| 国产精品国模大尺度私拍| 亚洲精品综合久久| 成人av网站免费观看| 精品伦精品一区二区三区视频| 欧美一级特黄aaaaaa大片在线观看| 国产成人精品三级麻豆| av日韩免费电影| 三级在线观看网站| 97超碰欧美中文字幕| 欧美12av| 日韩黄色影院| 亚洲精品视频在线观看免费| 黄色a级片免费看| 55av亚洲| 欧美吻胸吃奶大尺度电影| 在线观看国产一级片| 精品一区二区三区中文字幕| 亚洲成色www8888| 五月婷婷综合在线观看| 精品国产123区| 久久手机免费视频| 日韩av电影网址| 裸体一区二区| 91丨九色丨国产在线| 人妻与黑人一区二区三区| 久久久一区二区三区| 一区二区三区在线观看www| 污污网站在线看| 一本到一区二区三区| 三级性生活视频| 97久久综合精品久久久综合| 亚洲人在线视频| caoporn91| 欧美亚洲一级| 91免费人成网站在线观看18| 无码国产伦一区二区三区视频| 国产欧美日韩亚州综合| 国产又粗又猛又爽又黄的网站| 美女的胸无遮挡在线观看 | 97久久国产精品| 高潮无码精品色欲av午夜福利| 国产一区二区不卡在线| 蜜桃导航-精品导航| 麻豆av免费在线观看| 精品magnet| 午夜啪啪小视频| 香蕉精品久久| 欧美巨乳美女视频| 亚洲av无码乱码国产精品fc2| 国产成人综合亚洲91猫咪| 日本婷婷久久久久久久久一区二区| 91三级在线| 欧美性一区二区| 人妻体内射精一区二区三区| 91亚洲国产成人久久精品| 91精品成人久久| 国产黄色av网站| 欧美国产一区二区| 国产毛片视频网站| 欧美a在线观看| 尤物yw午夜国产精品视频明星| 国产无套在线观看| 狠狠色狠狠色综合| 亚洲欧美国产不卡| 日本综合字幕| 日韩av在线一区二区| 久久黄色免费视频| 国产精品一区一区三区| 亚洲伊人婷婷| 精品国产欧美日韩一区二区三区| 亚洲国产精品国自产拍av秋霞| 日韩欧美123区| 美女爽到高潮91| 亚洲高清视频一区| 性欧美videohd高精| 精品性高朝久久久久久久| 国产一级免费av| 国产二区国产一区在线观看| 国产91av视频在线观看| 成人在线中文| 色偷偷噜噜噜亚洲男人的天堂| 成年人视频免费| 久久亚洲精品小早川怜子| 欧美一级视频在线播放| 国产精品极品在线观看| 欧美日本亚洲视频| www.色播.com| 亚洲综合色自拍一区| 欧美性猛交xx| 欧美粗暴jizz性欧美20| 亚洲影视九九影院在线观看| 欧美高清视频| 日韩一区二区免费视频| 欧美成人三级视频| 国产成人av一区| 欧美人成在线观看| 希岛爱理av免费一区二区| 奇门遁甲1982国语版免费观看高清| 亚洲欧美日韩动漫| 狠狠色噜噜狠狠狠狠97| 97人妻精品一区二区免费| 日韩av午夜在线观看| 亚洲国产另类久久久精品极度| 成人在线视频免费看| 久久精品电影网站| 性欧美8khd高清极品| 亚洲午夜三级在线| 激情综合丁香五月| 欧美aaa在线| 特级黄色录像片| 成人另类视频| 热久久免费视频精品| 国产九色在线| 在线综合+亚洲+欧美中文字幕| 欧美色图亚洲天堂| 91美女视频网站| 中文字幕在线导航| 一级毛片免费高清中文字幕久久网| eeuss一区二区三区| 瑟瑟视频在线看| 中日韩美女免费视频网址在线观看| 一区二区三区免费在线| 亚洲一二三区不卡| 国产91丝袜美女在线播放| 九九久久精品视频 | 日本系列欧美系列| 欧美日韩亚洲国产成人| 丁香婷婷成人| 国产精品色午夜在线观看| av在线网址观看| 精品一区二区三区四区在线| 一二区在线观看| 性做久久久久久| 老司机福利在线观看| 成人小视频免费观看| 国产成人综合一区| 国内一区二区三区| 亚洲人一区二区| 牛牛视频精品一区二区不卡| 国产精品一区二区三区成人| hd国产人妖ts另类视频| 日韩在线观看你懂的| 无码国产精品一区二区免费16| 9191久久久久久久久久久| 日韩毛片在线视频| 亚洲日本成人在线观看| 性猛交娇小69hd| 播五月开心婷婷综合| 亚洲欧美日本一区二区| 亚洲一区二区网站| av动漫在线播放| 成人在线免费观看视频| 久久久久久久久久久久久久一区 | 欧美精品 日韩| 91精品国产综合久久久蜜臀九色| 亚洲美女屁股眼交| 国产调教在线观看| 久久先锋影音av| 日本一级片在线播放| 国产美女精品人人做人人爽| 午夜在线观看av| 久久精品二区三区| 久久久亚洲精品无码| 欧美国产日本| 激情五月五月婷婷| 日韩一区二区在线| 天天综合狠狠精品| 国产精品亚洲二区| 国产精品一区在线播放| 麻豆国产一区二区三区四区| 国产在线视频91| 久久精品97| 国产精品亚洲自拍| 草莓视频成人appios| 日本一区二区三区在线播放| 国产夫妻在线播放| 久久久亚洲国产天美传媒修理工| 在线视频中文字幕第一页| 久久九九亚洲综合| 福利视频在线| 久久国产精品影视| 综合久久2o19| 欧美激情a在线| 欧美女同一区| 久久久人成影片一区二区三区| 黄色小说在线播放| 久久全球大尺度高清视频| 韩国成人免费视频| 国内精品久久影院| 欧美少妇网站| 日本aⅴ大伊香蕉精品视频| 97se综合| 国产精品久久久久福利| 99久久伊人| 成人精品aaaa网站| 日韩视频一区二区三区四区| 99re在线播放| 日韩在线黄色| 欧美中日韩一区二区三区| 国产日韩视频在线| 亚洲精品在线免费看| 亚洲字幕久久| 国产freexxxx性播放麻豆| 中文一区在线| 国产超碰在线播放| 国产一区二区精品久久99| 中文字幕天堂av| 26uuu亚洲综合色欧美| 91l九色lporny| 亚洲免费毛片网站| 在线观看免费国产视频| 色婷婷av一区二区三区gif| 中文字幕乱码人妻无码久久| 91麻豆精品国产自产在线| 欧美 日韩 国产 成人 在线 91 | 午夜国产福利在线| 免费av一区二区| 国产精品原创| 国产精品小说在线| 伊人久久影院| 欧美日韩国产免费一区二区三区| 日韩精品网站| 欧美这里只有精品| 艳母动漫在线观看| 久久经典综合| 亚洲AV成人精品| 久久精品视频免费| 日本少妇高清视频| 色综合一区二区| 国产精品视频在线观看免费| 亚洲国产精品久久久久久| 成人jjav| 性欧美长视频免费观看不卡| 91国内外精品自在线播放| 国产伦理一区二区三区| 日韩精品一区二区久久| 日本人体一区二区| 久久精品免费看| 欧美图片一区二区| 亚洲精品免费视频| 精品视频一二三区| 亚洲激情视频在线播放| 国产乱色在线观看| 日本一本a高清免费不卡| 视频在线亚洲| 正在播放国产精品| 免费在线成人| 一级黄色免费视频| 国产精品国产三级国产aⅴ入口 | 欧美精品高清视频| 奇米影视888狠狠狠777不卡| 欧美久久久精品| 国产国产一区| 欧美日韩免费高清| 99国产精品久久久久久久成人热| 久久久久久综合网| 欧美激情一区二区| 日本熟女毛茸茸| 亚洲国产精品美女| 美女网站视频在线| 3d动漫精品啪啪一区二区三区免费 | 欧美性猛交一区二区三区精品| 日批视频免费播放| 色综合久久悠悠| www久久久| 中文字幕综合在线观看| 日本午夜一本久久久综合| 人妻少妇精品视频一区二区三区| 亚洲一线二线三线视频| 97免费观看视频| 色偷偷av一区二区三区| 99re久久| 亚洲欧美在线网| 蜜臀99久久精品久久久久久软件| 在线不卡av电影| 日本韩国一区二区三区视频| 日本精品专区| 2019最新中文字幕| 亚洲天堂日韩在线| 免费看的黄色大片| 91香蕉视频在线| 五月婷婷视频在线| 日韩高清免费在线| 成人勉费视频| 日本成人看片网址| 日日噜噜夜夜狠狠视频欧美人 | 亚洲成a人片在线观看中文| www.av日韩| 久久久久久一区二区三区| 国产亚洲精品美女久久| 久久久久久久久久网| 不卡一区二区三区四区| 女人十八岁毛片| 亚洲一级黄色av| 欧洲成人一区| 手机看片日韩国产| 成人免费黄色大片| wwwwww国产| 亚洲一二三在线| 亚洲精品乱码日韩| 中国老女人av| 成人不卡免费av| 中文字幕精品无| 日韩中文字幕在线视频播放| 国产成人免费视频网站视频社区 | 国产精品12| 亚洲一区网站| 国产日产在线观看| 日韩三级电影网址| 深夜成人在线| 亚洲欧美日韩国产yyy| 国产乱码精品1区2区3区| 久久精品女人毛片国产| 亚洲天堂影视av| 国产视频网站一区二区三区| 日韩视频在线视频| 欧美国产丝袜视频| 国产av无码专区亚洲av| 2024亚洲男人天堂| 日韩欧美一区二区三区免费看| 美女被艹视频网站| 婷婷中文字幕一区三区| 99riav在线| 国产欧美日韩综合精品二区| 麻豆成人在线| 欧美成人三级在线观看| 亚洲欧美日韩在线高清直播| aa亚洲一区一区三区| 缅甸午夜性猛交xxxx| 国产精品久久久久7777按摩| 亚洲美女福利视频| 国产欧美va欧美va香蕉在| 亚洲精品美女91| 日本精品在线免费观看| 日韩成人免费视频| 免费视频成人| 日韩黄色片视频| 亚洲影院久久精品| 日韩伦理在线观看| 麻豆一区区三区四区产品精品蜜桃| 精品写真视频在线观看| 亚洲影院在线播放|