国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

解析Tomcat架構(gòu)原理到架構(gòu)設(shè)計(jì)

 更新時(shí)間:2021年06月22日 16:41:31   作者:碼哥字節(jié)  
一般學(xué)習(xí)的時(shí)候也是先總覽一下整體,然后逐個(gè)部分個(gè)個(gè)擊破,最后形成思路,了解具體細(xì)節(jié),Tomcat的結(jié)構(gòu)很復(fù)雜,但是Tomcat非常的模塊化,找到了Tomcat最核心的模塊,問(wèn)題才可以游刃而解,了解了Tomcat的整體架構(gòu)對(duì)以后深入了解Tomcat來(lái)說(shuō)至關(guān)重要

一、學(xué)習(xí)目的

1.1、掌握 Tomcat 架構(gòu)設(shè)計(jì)與原理提高內(nèi)功

宏觀上看

Tomcat 作為一個(gè) 「Http 服務(wù)器 + Servlet 容器」,對(duì)我們屏蔽了應(yīng)用層協(xié)議和網(wǎng)絡(luò)通信細(xì)節(jié),給我們的是標(biāo)準(zhǔn)的 RequestResponse 對(duì)象;對(duì)于具體的業(yè)務(wù)邏輯則作為變化點(diǎn),交給我們來(lái)實(shí)現(xiàn)。我們使用了SpringMVC 之類(lèi)的框架,可是卻從來(lái)不需要考慮 TCP 連接、 Http 協(xié)議的數(shù)據(jù)處理與響應(yīng)。就是因?yàn)?Tomcat 已經(jīng)為我們做好了這些,我們只需要關(guān)注每個(gè)請(qǐng)求的具體業(yè)務(wù)邏輯。

微觀上看

Tomcat 內(nèi)部也隔離了變化點(diǎn)與不變點(diǎn),使用了組件化設(shè)計(jì),目的就是為了實(shí)現(xiàn)「俄羅斯套娃式」的高度定制化(組合模式),而每個(gè)組件的生命周期管理又有一些共性的東西,則被提取出來(lái)成為接口和抽象類(lèi),讓具體子類(lèi)實(shí)現(xiàn)變化點(diǎn),也就是模板方法設(shè)計(jì)模式。

當(dāng)今流行的微服務(wù)也是這個(gè)思路,按照功能將單體應(yīng)用拆成「微服務(wù)」,拆分過(guò)程要將共性提取出來(lái),而這些共性就會(huì)成為核心的基礎(chǔ)服務(wù)或者通用庫(kù)?!钢信_(tái)」思想亦是如此。

設(shè)計(jì)模式往往就是封裝變化的一把利器,合理的運(yùn)用設(shè)計(jì)模式能讓我們的代碼與系統(tǒng)設(shè)計(jì)變得優(yōu)雅且整潔。

這就是學(xué)習(xí)優(yōu)秀開(kāi)源軟件能獲得的「內(nèi)功」,從不會(huì)過(guò)時(shí),其中的設(shè)計(jì)思想與哲學(xué)才是根本之道。從中借鑒設(shè)計(jì)經(jīng)驗(yàn),合理運(yùn)用設(shè)計(jì)模式封裝變與不變,更能從它們的源碼中汲取經(jīng)驗(yàn),提升自己的系統(tǒng)設(shè)計(jì)能力。

1.2、宏觀理解一個(gè)請(qǐng)求如何與 Spring 聯(lián)系起來(lái)

在工作過(guò)程中,我們對(duì) Java 語(yǔ)法已經(jīng)很熟悉了,甚至「背」過(guò)一些設(shè)計(jì)模式,用過(guò)很多 Web 框架,但是很少有機(jī)會(huì)將他們用到實(shí)際項(xiàng)目中,讓自己獨(dú)立設(shè)計(jì)一個(gè)系統(tǒng)似乎也是根據(jù)需求一個(gè)個(gè) Service 實(shí)現(xiàn)而已。腦子里似乎沒(méi)有一張 Java Web 開(kāi)發(fā)全景圖,比如我并不知道瀏覽器的請(qǐng)求是怎么跟 Spring 中的代碼聯(lián)系起來(lái)的。

為了突破這個(gè)瓶頸,為何不站在巨人的肩膀上學(xué)習(xí)優(yōu)秀的開(kāi)源系統(tǒng),看大牛們是如何思考這些問(wèn)題。

學(xué)習(xí) Tomcat 的原理,我發(fā)現(xiàn) Servlet 技術(shù)是 Web 開(kāi)發(fā)的原點(diǎn),幾乎所有的 Java Web 框架(比如 Spring)都是基于 Servlet 的封裝,Spring 應(yīng)用本身就是一個(gè) ServletDispatchSevlet),而 Tomcat 和 Jetty 這樣的 Web 容器,負(fù)責(zé)加載和運(yùn)行 Servlet。如圖所示:

1.3、提升自己的系統(tǒng)設(shè)計(jì)能力

學(xué)習(xí) Tomcat ,我還發(fā)現(xiàn)用到不少 Java 高級(jí)技術(shù),比如 Java 多線(xiàn)程并發(fā)編程、Socket 網(wǎng)絡(luò)編程以及反射等。之前也只是了解這些技術(shù),為了面試也背過(guò)一些題。但是總感覺(jué)「知道」與會(huì)用之間存在一道溝壑,通過(guò)對(duì) Tomcat 源碼學(xué)習(xí),我學(xué)會(huì)了什么場(chǎng)景去使用這些技術(shù)。

還有就是系統(tǒng)設(shè)計(jì)能力,比如面向接口編程、組件化組合模式、骨架抽象類(lèi)、一鍵式啟停、對(duì)象池技術(shù)以及各種設(shè)計(jì)模式,比如模板方法、觀察者模式、責(zé)任鏈模式等,之后我也開(kāi)始模仿它們并把這些設(shè)計(jì)思想運(yùn)用到實(shí)際的工作中。

二、整體架構(gòu)設(shè)計(jì)

今天咱們就來(lái)一步一步分析 Tomcat 的設(shè)計(jì)思路,一方面我們可以學(xué)到 Tomcat 的總體架構(gòu),學(xué)會(huì)從宏觀上怎么去設(shè)計(jì)一個(gè)復(fù)雜系統(tǒng),怎么設(shè)計(jì)頂層模塊,以及模塊之間的關(guān)系;另一方面也為我們深入學(xué)習(xí) Tomcat 的工作原理打下基礎(chǔ)。

Tomcat 啟動(dòng)流程:

startup.sh -> catalina.sh start ->java -jar org.apache.catalina.startup.Bootstrap.main()

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

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

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

Tomcat為了實(shí)現(xiàn)支持多種 I/O 模型和應(yīng)用層協(xié)議,一個(gè)容器可能對(duì)接多個(gè)連接器,就好比一個(gè)房間有多個(gè)門(mén)。

  • Server 對(duì)應(yīng)的就是一個(gè) Tomcat 實(shí)例。
  • Service 默認(rèn)只有一個(gè),也就是一個(gè) Tomcat 實(shí)例默認(rèn)一個(gè) Service。
  • Connector:一個(gè) Service 可能多個(gè) 連接器,接受不同連接協(xié)議。
  • Container: 多個(gè)連接器對(duì)應(yīng)一個(gè)容器,頂層容器其實(shí)就是 Engine。

每個(gè)組件都有對(duì)應(yīng)的生命周期,需要啟動(dòng),同時(shí)還要啟動(dòng)自己內(nèi)部的子組件,比如一個(gè) Tomcat 實(shí)例包含一個(gè) Service,一個(gè) Service 包含多個(gè)連接器和一個(gè)容器。而一個(gè)容器包含多個(gè) Host, Host 內(nèi)部可能有多個(gè) Contex t 容器,而一個(gè) Context 也會(huì)包含多個(gè) Servlet,所以 Tomcat 利用組合模式管理組件每個(gè)組件,對(duì)待過(guò)個(gè)也想對(duì)待單個(gè)組一樣對(duì)待。整體上每個(gè)組件設(shè)計(jì)就像是「俄羅斯套娃」一樣。

2.1、連接器

在開(kāi)始講連接器前,我先鋪墊一下 Tomcat支持的多種 I/O 模型和應(yīng)用層協(xié)議。

Tomcat支持的 I/O 模型有:

  • NIO:非阻塞 I/O,采用 Java NIO 類(lèi)庫(kù)實(shí)現(xiàn)。
  • NIO2:異步I/O,采用 JDK 7 最新的 NIO2 類(lèi)庫(kù)實(shí)現(xiàn)。
  • APR:采用 Apache可移植運(yùn)行庫(kù)實(shí)現(xiàn),是 C/C++ 編寫(xiě)的本地庫(kù)。

Tomcat 支持的應(yīng)用層協(xié)議有:

  • HTTP/1.1:這是大部分 Web 應(yīng)用采用的訪問(wèn)協(xié)議。
  • AJP:用于和 Web 服務(wù)器集成(如 Apache)。
  • HTTP/2:HTTP 2.0 大幅度的提升了 Web 性能。

所以一個(gè)容器可能對(duì)接多個(gè)連接器。連接器對(duì) Servlet 容器屏蔽了網(wǎng)絡(luò)協(xié)議與 I/O 模型的區(qū)別,無(wú)論是 Http 還是 AJP,在容器中獲取到的都是一個(gè)標(biāo)準(zhǔn)的 ServletRequest 對(duì)象。

細(xì)化連接器的功能需求就是:

  • 監(jiān)聽(tīng)網(wǎng)絡(luò)端口。
  • 接受網(wǎng)絡(luò)連接請(qǐng)求。
  • 讀取請(qǐng)求網(wǎng)絡(luò)字節(jié)流。
  • 根據(jù)具體應(yīng)用層協(xié)議(HTTP/AJP)解析字節(jié)流,生成統(tǒng)一的 Tomcat Request 對(duì)象。
  • Tomcat Request 對(duì)象轉(zhuǎn)成標(biāo)準(zhǔn)的 ServletRequest。
  • 調(diào)用 Servlet容器,得到 ServletResponse。
  • ServletResponse轉(zhuǎn)成 Tomcat Response 對(duì)象。
  • Tomcat Response 轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)流。將響應(yīng)字節(jié)流寫(xiě)回給瀏覽器。

需求列清楚后,我們要考慮的下一個(gè)問(wèn)題是,連接器應(yīng)該有哪些子模塊??jī)?yōu)秀的模塊化設(shè)計(jì)應(yīng)該考慮高內(nèi)聚、低耦合。

  • 高內(nèi)聚是指相關(guān)度比較高的功能要盡可能集中,不要分散。
  • 低耦合是指兩個(gè)相關(guān)的模塊要盡可能減少依賴(lài)的部分和降低依賴(lài)的程度,不要讓兩個(gè)模塊產(chǎn)生強(qiáng)依賴(lài)。

我們發(fā)現(xiàn)連接器需要完成 3 個(gè)高內(nèi)聚的功能:

  • 網(wǎng)絡(luò)通信。
  • 應(yīng)用層協(xié)議解析。
  • Tomcat Request/ResponseServletRequest/ServletResponse 的轉(zhuǎn)化。

因此 Tomcat 的設(shè)計(jì)者設(shè)計(jì)了 3 個(gè)組件來(lái)實(shí)現(xiàn)這 3 個(gè)功能,分別是 EndPoint、Processor 和 Adapter。

網(wǎng)絡(luò)通信的 I/O 模型是變化的, 應(yīng)用層協(xié)議也是變化的,但是整體的處理邏輯是不變的,EndPoint 負(fù)責(zé)提供字節(jié)流給 Processor,Processor負(fù)責(zé)提供 Tomcat Request 對(duì)象給 Adapter,Adapter負(fù)責(zé)提供 ServletRequest對(duì)象給容器。

2.2、封裝變與不變

因此 Tomcat 設(shè)計(jì)了一系列抽象基類(lèi)來(lái)封裝這些穩(wěn)定的部分,抽象基類(lèi) AbstractProtocol實(shí)現(xiàn)了 ProtocolHandler接口。每一種應(yīng)用層協(xié)議有自己的抽象基類(lèi),比如 AbstractAjpProtocolAbstractHttp11Protocol,具體協(xié)議的實(shí)現(xiàn)類(lèi)擴(kuò)展了協(xié)議層抽象基類(lèi)。

這就是模板方法設(shè)計(jì)模式的運(yùn)用。

總結(jié)下來(lái),連接器的三個(gè)核心組件 Endpoint、ProcessorAdapter來(lái)分別做三件事情,其中 EndpointProcessor放在一起抽象成了 ProtocolHandler組件,它們的關(guān)系如下圖所示。

ProtocolHandler 組件:

主要處理 網(wǎng)絡(luò)連接 和 應(yīng)用層協(xié)議 ,包含了兩個(gè)重要部件 EndPoint 和 Processor,兩個(gè)組件組合形成 ProtocoHandler,下面我來(lái)詳細(xì)介紹它們的工作原理。

EndPoint:

EndPoint是通信端點(diǎn),即通信監(jiān)聽(tīng)的接口,是具體的 Socket 接收和發(fā)送處理器,是對(duì)傳輸層的抽象,因此 EndPoint是用來(lái)實(shí)現(xiàn) TCP/IP 協(xié)議數(shù)據(jù)讀寫(xiě)的,本質(zhì)調(diào)用操作系統(tǒng)的 socket 接口。

EndPoint是一個(gè)接口,對(duì)應(yīng)的抽象實(shí)現(xiàn)類(lèi)是 AbstractEndpoint,而 AbstractEndpoint的具體子類(lèi),比如在 NioEndpointNio2Endpoint中,有兩個(gè)重要的子組件:AcceptorSocketProcessor

其中 Acceptor 用于監(jiān)聽(tīng) Socket 連接請(qǐng)求。SocketProcessor用于處理 Acceptor 接收到的 Socket請(qǐng)求,它實(shí)現(xiàn) Runnable接口,在 Run方法里調(diào)用應(yīng)用層協(xié)議處理組件 Processor 進(jìn)行處理。為了提高處理能力,SocketProcessor被提交到線(xiàn)程池來(lái)執(zhí)行。

我們知道,對(duì)于 Java 的多路復(fù)用器的使用,無(wú)非是兩步:

  • 創(chuàng)建一個(gè) Seletor,在它身上注冊(cè)各種感興趣的事件,然后調(diào)用 select 方法,等待感興趣的事情發(fā)生。
  • 感興趣的事情發(fā)生了,比如可以讀了,這時(shí)便創(chuàng)建一個(gè)新的線(xiàn)程從 Channel 中讀數(shù)據(jù)。

在 Tomcat 中 NioEndpoint 則是 AbstractEndpoint 的具體實(shí)現(xiàn),里面組件雖然很多,但是處理邏輯還是前面兩步。它一共包含 LimitLatch、AcceptorPoller、SocketProcessorExecutor 共 5 個(gè)組件,分別分工合作實(shí)現(xiàn)整個(gè) TCP/IP 協(xié)議的處理。

LimitLatch 是連接控制器,它負(fù)責(zé)控制最大連接數(shù),NIO 模式下默認(rèn)是 10000,達(dá)到這個(gè)閾值后,連接請(qǐng)求被拒絕。

Acceptor跑在一個(gè)單獨(dú)的線(xiàn)程里,它在一個(gè)死循環(huán)里調(diào)用 accept方法來(lái)接收新連接,一旦有新的連接請(qǐng)求到來(lái),accept方法返回一個(gè) Channel 對(duì)象,接著把 Channel對(duì)象交給 Poller 去處理。

Poller 的本質(zhì)是一個(gè) Selector,也跑在單獨(dú)線(xiàn)程里。Poller在內(nèi)部維護(hù)一個(gè) Channel數(shù)組,它在一個(gè)死循環(huán)里不斷檢測(cè) Channel的數(shù)據(jù)就緒狀態(tài),一旦有 Channel可讀,就生成一個(gè) SocketProcessor任務(wù)對(duì)象扔給 Executor去處理。

SocketProcessor 實(shí)現(xiàn)了 Runnable 接口,其中 run 方法中的 getHandler().process(socketWrapper, SocketEvent.CONNECT_FAIL); 代碼則是獲取 handler 并執(zhí)行處理 socketWrapper,最后通過(guò) socket 獲取合適應(yīng)用層協(xié)議處理器,也就是調(diào)用 Http11Processor 組件來(lái)處理請(qǐng)求。Http11Processor 讀取 Channel 的數(shù)據(jù)來(lái)生成 ServletRequest 對(duì)象,Http11Processor 并不是直接讀取 Channel 的。這是因?yàn)?Tomcat 支持同步非阻塞 I/O 模型和異步 I/O 模型,在 Java API 中,相應(yīng)的 Channel 類(lèi)也是不一樣的,比如有 AsynchronousSocketChannel 和 SocketChannel,為了對(duì) Http11Processor 屏蔽這些差異,Tomcat 設(shè)計(jì)了一個(gè)包裝類(lèi)叫作 SocketWrapper,Http11Processor 只調(diào)用 SocketWrapper 的方法去讀寫(xiě)數(shù)據(jù)。

Executor就是線(xiàn)程池,負(fù)責(zé)運(yùn)行 SocketProcessor任務(wù)類(lèi),SocketProcessorrun方法會(huì)調(diào)用 Http11Processor 來(lái)讀取和解析請(qǐng)求數(shù)據(jù)。我們知道,Http11Processor是應(yīng)用層協(xié)議的封裝,它會(huì)調(diào)用容器獲得響應(yīng),再把響應(yīng)通過(guò) Channel寫(xiě)出。

工作流程如下所示:

Processor:

Processor 用來(lái)實(shí)現(xiàn) HTTP 協(xié)議,Processor 接收來(lái)自 EndPoint 的 Socket,讀取字節(jié)流解析成 Tomcat Request 和 Response 對(duì)象,并通過(guò) Adapter 將其提交到容器處理,Processor 是對(duì)應(yīng)用層協(xié)議的抽象。

從圖中我們看到,EndPoint 接收到 Socket 連接后,生成一個(gè) SocketProcessor 任務(wù)提交到線(xiàn)程池去處理,SocketProcessor 的 Run 方法會(huì)調(diào)用 HttpProcessor 組件去解析應(yīng)用層協(xié)議,Processor 通過(guò)解析生成 Request 對(duì)象后,會(huì)調(diào)用 Adapter 的 Service 方法,方法內(nèi)部通過(guò) 以下代碼將請(qǐng)求傳遞到容器中。

// Calling the container
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);

Adapter 組件:

由于協(xié)議的不同,Tomcat 定義了自己的 Request 類(lèi)來(lái)存放請(qǐng)求信息,這里其實(shí)體現(xiàn)了面向?qū)ο蟮乃季S。但是這個(gè) Request 不是標(biāo)準(zhǔn)的 ServletRequest ,所以不能直接使用 Tomcat 定義 Request 作為參數(shù)直接容器。

Tomcat 設(shè)計(jì)者的解決方案是引入 CoyoteAdapter,這是適配器模式的經(jīng)典運(yùn)用,連接器調(diào)用 CoyoteAdapterSevice 方法,傳入的是 Tomcat Request 對(duì)象,CoyoteAdapter負(fù)責(zé)將 Tomcat Request 轉(zhuǎn)成 ServletRequest,再調(diào)用容器的 Service方法。

2.3、容器

連接器負(fù)責(zé)外部交流,容器負(fù)責(zé)內(nèi)部處理。具體來(lái)說(shuō)就是,連接器處理 Socket 通信和應(yīng)用層協(xié)議的解析,得到 Servlet請(qǐng)求;而容器則負(fù)責(zé)處理 Servlet請(qǐng)求。

容器:顧名思義就是拿來(lái)裝東西的, 所以 Tomcat 容器就是拿來(lái)裝載 Servlet。

Tomcat 設(shè)計(jì)了 4 種容器,分別是 Engine、Host、ContextWrapper。Server 代表 Tomcat 實(shí)例。

要注意的是這 4 種容器不是平行關(guān)系,屬于父子關(guān)系,如下圖所示:

你可能會(huì)問(wèn),為啥要設(shè)計(jì)這么多層次的容器,這不是增加復(fù)雜度么?其實(shí)這背后的考慮是,Tomcat 通過(guò)一種分層的架構(gòu),使得 Servlet 容器具有很好的靈活性。因?yàn)檫@里正好符合一個(gè) Host 多個(gè) Context, 一個(gè) Context 也包含多個(gè) Servlet,而每個(gè)組件都需要統(tǒng)一生命周期管理,所以組合模式設(shè)計(jì)這些容器

Wrapper 表示一個(gè) Servlet ,Context 表示一個(gè) Web 應(yīng)用程序,而一個(gè) Web 程序可能有多個(gè) Servlet ;Host 表示一個(gè)虛擬主機(jī),或者說(shuō)一個(gè)站點(diǎn),一個(gè) Tomcat 可以配置多個(gè)站點(diǎn)(Host);一個(gè)站點(diǎn)( Host) 可以部署多個(gè) Web 應(yīng)用;Engine 代表 引擎,用于管理多個(gè)站點(diǎn)(Host),一個(gè) Service 只能有 一個(gè) Engine。

可通過(guò) Tomcat 配置文件加深對(duì)其層次關(guān)系理解。

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

  <Service name="Catalina">  // 頂層組件,包含一個(gè) Engine ,多個(gè)連接器
    <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" />  // 連接器

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

如何管理這些容器?我們發(fā)現(xiàn)容器之間具有父子關(guān)系,形成一個(gè)樹(shù)形結(jié)構(gòu),是不是想到了設(shè)計(jì)模式中的 組合模式 。

Tomcat 就是用組合模式來(lái)管理這些容器的。具體實(shí)現(xiàn)方法是,所有容器組件都實(shí)現(xiàn)了 Container接口,因此組合模式可以使得用戶(hù)對(duì)單容器對(duì)象和組合容器對(duì)象的使用具有一致性。這里單容器對(duì)象指的是最底層的 Wrapper,組合容器對(duì)象指的是上面的 Context、Host或者 Engine。Container 接口定義如下:

public interface Container extends Lifecycle {
    public void setName(String name);
    public Container getParent();
    public void setParent(Container container);
    public void addChild(Container child);
    public void removeChild(Container child);
    public Container findChild(String name);
}

我們看到了getParent、SetParent、addChildremoveChild等方法,這里正好驗(yàn)證了我們說(shuō)的組合模式。我們還看到 Container接口拓展了 Lifecycle ,Tomcat 就是通過(guò) Lifecycle 統(tǒng)一管理所有容器的組件的生命周期。通過(guò)組合模式管理所有容器,拓展 Lifecycle 實(shí)現(xiàn)對(duì)每個(gè)組件的生命周期管理 ,Lifecycle 主要包含的方法init()、start()、stop() 和 destroy()。

2.4、請(qǐng)求定位 Servlet 的過(guò)程

一個(gè)請(qǐng)求是如何定位到讓哪個(gè) WrapperServlet 處理的?答案是,Tomcat 是用 Mapper 組件來(lái)完成這個(gè)任務(wù)的。

Mapper 組件的功能就是將用戶(hù)請(qǐng)求的 URL 定位到一個(gè) Servlet,它的工作原理是:Mapper組件里保存了 Web 應(yīng)用的配置信息,其實(shí)就是容器組件與訪問(wèn)路徑的映射關(guān)系,比如 Host容器里配置的域名、Context容器里的 Web應(yīng)用路徑,以及 Wrapper容器里 Servlet 映射的路徑,你可以想象這些配置信息就是一個(gè)多層次的 Map。

當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),Mapper 組件通過(guò)解析請(qǐng)求 URL 里的域名和路徑,再到自己保存的 Map 里去查找,就能定位到一個(gè) Servlet。請(qǐng)你注意,一個(gè)請(qǐng)求 URL 最后只會(huì)定位到一個(gè) Wrapper容器,也就是一個(gè) Servlet

假如有用戶(hù)訪問(wèn)一個(gè) URL,比如圖中的http://user.shopping.com:8080/order/buy,Tomcat 如何將這個(gè) URL 定位到一個(gè) Servlet 呢?

1.首先根據(jù)協(xié)議和端口號(hào)確定 Service 和 Engine。Tomcat 默認(rèn)的 HTTP 連接器監(jiān)聽(tīng) 8080 端口、默認(rèn)的 AJP 連接器監(jiān)聽(tīng) 8009 端口。上面例子中的 URL 訪問(wèn)的是 8080 端口,因此這個(gè)請(qǐng)求會(huì)被 HTTP 連接器接收,而一個(gè)連接器是屬于一個(gè) Service 組件的,這樣 Service 組件就確定了。我們還知道一個(gè) Service 組件里除了有多個(gè)連接器,還有一個(gè)容器組件,具體來(lái)說(shuō)就是一個(gè) Engine 容器,因此 Service 確定了也就意味著 Engine 也確定了。

2.根據(jù)域名選定 Host。 Service 和 Engine 確定后,Mapper 組件通過(guò) URL 中的域名去查找相應(yīng)的 Host 容器,比如例子中的 URL 訪問(wèn)的域名是user.shopping.com,因此 Mapper 會(huì)找到 Host2 這個(gè)容器。

3.根據(jù) URL 路徑找到 Context 組件。 Host 確定以后,Mapper 根據(jù) URL 的路徑來(lái)匹配相應(yīng)的 Web 應(yīng)用的路徑,比如例子中訪問(wèn)的是 /order,因此找到了 Context4 這個(gè) Context 容器。

4.根據(jù) URL 路徑找到 Wrapper(Servlet)。 Context 確定后,Mapper 再根據(jù) web.xml 中配置的 Servlet 映射路徑來(lái)找到具體的 Wrapper 和 Servlet。

連接器中的 Adapter 會(huì)調(diào)用容器的 Service 方法來(lái)執(zhí)行 Servlet,最先拿到請(qǐng)求的是 Engine 容器,Engine 容器對(duì)請(qǐng)求做一些處理后,會(huì)把請(qǐng)求傳給自己子容器 Host 繼續(xù)處理,依次類(lèi)推,最后這個(gè)請(qǐng)求會(huì)傳給 Wrapper 容器,Wrapper 會(huì)調(diào)用最終的 Servlet 來(lái)處理。那么這個(gè)調(diào)用過(guò)程具體是怎么實(shí)現(xiàn)的呢?答案是使用 Pipeline-Valve 管道。

Pipeline-Valve 是責(zé)任鏈模式,責(zé)任鏈模式是指在一個(gè)請(qǐng)求處理的過(guò)程中有很多處理者依次對(duì)請(qǐng)求進(jìn)行處理,每個(gè)處理者負(fù)責(zé)做自己相應(yīng)的處理,處理完之后將再調(diào)用下一個(gè)處理者繼續(xù)處理,Valve 表示一個(gè)處理點(diǎn)(也就是一個(gè)處理閥門(mén)),因此 invoke方法就是來(lái)處理請(qǐng)求的。

public interface Valve {
  public Valve getNext();
  public void setNext(Valve valve);
  public void invoke(Request request, Response response)
}

繼續(xù)看 Pipeline 接口

public interface Pipeline {
  public void addValve(Valve valve);
  public Valve getBasic();
  public void setBasic(Valve valve);
  public Valve getFirst();
}

Pipeline中有 addValve方法。Pipeline 中維護(hù)了 Valve鏈表,Valve可以插入到 Pipeline中,對(duì)請(qǐng)求做某些處理。我們還發(fā)現(xiàn) Pipeline 中沒(méi)有 invoke 方法,因?yàn)檎麄€(gè)調(diào)用鏈的觸發(fā)是 Valve 來(lái)完成的,Valve完成自己的處理后,調(diào)用 getNext.invoke() 來(lái)觸發(fā)下一個(gè) Valve 調(diào)用。

其實(shí)每個(gè)容器都有一個(gè) Pipeline 對(duì)象,只要觸發(fā)了這個(gè) Pipeline 的第一個(gè) Valve,這個(gè)容器里 Pipeline中的 Valve 就都會(huì)被調(diào)用到。但是,不同容器的 Pipeline 是怎么鏈?zhǔn)接|發(fā)的呢,比如 Engine 中 Pipeline 需要調(diào)用下層容器 Host 中的 Pipeline。

這是因?yàn)?Pipeline中還有個(gè) getBasic方法。這個(gè) BasicValve處于 Valve鏈表的末端,它是 Pipeline中必不可少的一個(gè) Valve,負(fù)責(zé)調(diào)用下層容器的 Pipeline 里的第一個(gè) Valve。

整個(gè)過(guò)程分是通過(guò)連接器中的 CoyoteAdapter 觸發(fā),它會(huì)調(diào)用 Engine 的第一個(gè) Valve:

@Override
public void service(org.apache.coyote.Request req, org.apache.coyote.Response res) {
    // 省略其他代碼
    // Calling the container
    connector.getService().getContainer().getPipeline().getFirst().invoke(
        request, response);
    ...
}

Wrapper 容器的最后一個(gè) Valve 會(huì)創(chuàng)建一個(gè) Filter 鏈,并調(diào)用 doFilter() 方法,最終會(huì)調(diào)到 Servletservice方法。

前面我們不是講到了 Filter,似乎也有相似的功能,那 ValveFilter有什么區(qū)別嗎?它們的區(qū)別是:

  • ValveTomcat的私有機(jī)制,與 Tomcat 的基礎(chǔ)架構(gòu) API是緊耦合的。Servlet API是公有的標(biāo)準(zhǔn),所有的 Web 容器包括 Jetty 都支持 Filter 機(jī)制。
  • 另一個(gè)重要的區(qū)別是 Valve工作在 Web 容器級(jí)別,攔截所有應(yīng)用的請(qǐng)求;而 Servlet Filter 工作在應(yīng)用級(jí)別,只能攔截某個(gè) Web 應(yīng)用的所有請(qǐng)求。如果想做整個(gè) Web容器的攔截器,必須通過(guò) Valve來(lái)實(shí)現(xiàn)。

Lifecycle 生命周期

前面我們看到 Container容器 繼承了 Lifecycle 生命周期。如果想讓一個(gè)系統(tǒng)能夠?qū)ν馓峁┓?wù),我們需要?jiǎng)?chuàng)建、組裝并啟動(dòng)這些組件;在服務(wù)停止的時(shí)候,我們還需要釋放資源,銷(xiāo)毀這些組件,因此這是一個(gè)動(dòng)態(tài)的過(guò)程。也就是說(shuō),Tomcat 需要?jiǎng)討B(tài)地管理這些組件的生命周期。

如何統(tǒng)一管理組件的創(chuàng)建、初始化、啟動(dòng)、停止和銷(xiāo)毀?如何做到代碼邏輯清晰?如何方便地添加或者刪除組件?如何做到組件啟動(dòng)和停止不遺漏、不重復(fù)?

一鍵式啟停:LifeCycle 接口

設(shè)計(jì)就是要找到系統(tǒng)的變化點(diǎn)和不變點(diǎn)。這里的不變點(diǎn)就是每個(gè)組件都要經(jīng)歷創(chuàng)建、初始化、啟動(dòng)這幾個(gè)過(guò)程,這些狀態(tài)以及狀態(tài)的轉(zhuǎn)化是不變的。而變化點(diǎn)是每個(gè)具體組件的初始化方法,也就是啟動(dòng)方法是不一樣的。

因此,Tomcat 把不變點(diǎn)抽象出來(lái)成為一個(gè)接口,這個(gè)接口跟生命周期有關(guān),叫作 LifeCycle。LifeCycle 接口里定義這么幾個(gè)方法:init()、start()、stop() 和 destroy(),每個(gè)具體的組件(也就是容器)去實(shí)現(xiàn)這些方法。

在父組件的 init() 方法里需要?jiǎng)?chuàng)建子組件并調(diào)用子組件的 init() 方法。同樣,在父組件的 start()方法里也需要調(diào)用子組件的 start() 方法,因此調(diào)用者可以無(wú)差別的調(diào)用各組件的 init() 方法和 start() 方法,這就是組合模式的使用,并且只要調(diào)用最頂層組件,也就是 Server 組件的 init()start() 方法,整個(gè) Tomcat 就被啟動(dòng)起來(lái)了。所以 Tomcat 采取組合模式管理容器,容器繼承 LifeCycle 接口,這樣就可以向針對(duì)單個(gè)對(duì)象一樣一鍵管理各個(gè)容器的生命周期,整個(gè) Tomcat 就啟動(dòng)起來(lái)。

可擴(kuò)展性:LifeCycle 事件

我們?cè)賮?lái)考慮另一個(gè)問(wèn)題,那就是系統(tǒng)的可擴(kuò)展性。因?yàn)楦鱾€(gè)組件init()start() 方法的具體實(shí)現(xiàn)是復(fù)雜多變的,比如在 Host 容器的啟動(dòng)方法里需要掃描 webapps 目錄下的 Web 應(yīng)用,創(chuàng)建相應(yīng)的 Context 容器,如果將來(lái)需要增加新的邏輯,直接修改start() 方法?這樣會(huì)違反開(kāi)閉原則,那如何解決這個(gè)問(wèn)題呢?開(kāi)閉原則說(shuō)的是為了擴(kuò)展系統(tǒng)的功能,你不能直接修改系統(tǒng)中已有的類(lèi),但是你可以定義新的類(lèi)。

組件的 init()start() 調(diào)用是由它的父組件的狀態(tài)變化觸發(fā)的,上層組件的初始化會(huì)觸發(fā)子組件的初始化,上層組件的啟動(dòng)會(huì)觸發(fā)子組件的啟動(dòng),因此我們把組件的生命周期定義成一個(gè)個(gè)狀態(tài),把狀態(tài)的轉(zhuǎn)變看作是一個(gè)事件。而事件是有監(jiān)聽(tīng)器的,在監(jiān)聽(tīng)器里可以實(shí)現(xiàn)一些邏輯,并且監(jiān)聽(tīng)器也可以方便的添加和刪除,這就是典型的觀察者模式。

以下就是 Lyfecycle 接口的定義:

重用性:LifeCycleBase 抽象基類(lèi)

再次看到抽象模板設(shè)計(jì)模式。

有了接口,我們就要用類(lèi)去實(shí)現(xiàn)接口。一般來(lái)說(shuō)實(shí)現(xiàn)類(lèi)不止一個(gè),不同的類(lèi)在實(shí)現(xiàn)接口時(shí)往往會(huì)有一些相同的邏輯,如果讓各個(gè)子類(lèi)都去實(shí)現(xiàn)一遍,就會(huì)有重復(fù)代碼。那子類(lèi)如何重用這部分邏輯呢?其實(shí)就是定義一個(gè)基類(lèi)來(lái)實(shí)現(xiàn)共同的邏輯,然后讓各個(gè)子類(lèi)去繼承它,就達(dá)到了重用的目的。

Tomcat 定義一個(gè)基類(lèi) LifeCycleBase 來(lái)實(shí)現(xiàn) LifeCycle 接口,把一些公共的邏輯放到基類(lèi)中去,比如生命狀態(tài)的轉(zhuǎn)變與維護(hù)、生命事件的觸發(fā)以及監(jiān)聽(tīng)器的添加和刪除等,而子類(lèi)就負(fù)責(zé)實(shí)現(xiàn)自己的初始化、啟動(dòng)和停止等方法。

public abstract class LifecycleBase implements Lifecycle{
    // 持有所有的觀察者
    private final List<LifecycleListener> lifecycleListeners = new CopyOnWriteArrayList<>();
    /**
     * 發(fā)布事件
     *
     * @param type  Event type
     * @param data  Data associated with event.
     */
    protected void fireLifecycleEvent(String type, Object data) {
        LifecycleEvent event = new LifecycleEvent(this, type, data);
        for (LifecycleListener listener : lifecycleListeners) {
            listener.lifecycleEvent(event);
        }
    }
    // 模板方法定義整個(gè)啟動(dòng)流程,啟動(dòng)所有容器
    @Override
    public final synchronized void init() throws LifecycleException {
        //1. 狀態(tài)檢查
        if (!state.equals(LifecycleState.NEW)) {
            invalidTransition(Lifecycle.BEFORE_INIT_EVENT);
        }

        try {
            //2. 觸發(fā) INITIALIZING 事件的監(jiān)聽(tīng)器
            setStateInternal(LifecycleState.INITIALIZING, null, false);
            // 3. 調(diào)用具體子類(lèi)的初始化方法
            initInternal();
            // 4. 觸發(fā) INITIALIZED 事件的監(jiān)聽(tīng)器
            setStateInternal(LifecycleState.INITIALIZED, null, false);
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            setStateInternal(LifecycleState.FAILED, null, false);
            throw new LifecycleException(
                    sm.getString("lifecycleBase.initFail",toString()), t);
        }
    }
}

Tomcat 為了實(shí)現(xiàn)一鍵式啟停以及優(yōu)雅的生命周期管理,并考慮到了可擴(kuò)展性和可重用性,將面向?qū)ο笏枷牒驮O(shè)計(jì)模式發(fā)揮到了極致,Containaer接口維護(hù)了容器的父子關(guān)系,Lifecycle 組合模式實(shí)現(xiàn)組件的生命周期維護(hù),生命周期每個(gè)組件有變與不變的點(diǎn),運(yùn)用模板方法模式。 分別運(yùn)用了組合模式、觀察者模式、骨架抽象類(lèi)和模板方法。

如果你需要維護(hù)一堆具有父子關(guān)系的實(shí)體,可以考慮使用組合模式。

觀察者模式聽(tīng)起來(lái) “高大上”,其實(shí)就是當(dāng)一個(gè)事件發(fā)生后,需要執(zhí)行一連串更新操作。實(shí)現(xiàn)了低耦合、非侵入式的通知與更新機(jī)制。

Container 繼承了 LifeCycle,StandardEngine、StandardHost、StandardContext 和 StandardWrapper 是相應(yīng)容器組件的具體實(shí)現(xiàn)類(lèi),因?yàn)樗鼈兌际侨萜?,所以繼承了 ContainerBase 抽象基類(lèi),而 ContainerBase 實(shí)現(xiàn)了 Container 接口,也繼承了 LifeCycleBase 類(lèi),它們的生命周期管理接口和功能接口是分開(kāi)的,這也符合設(shè)計(jì)中接口分離的原則。

三、Tomcat 為何打破雙親委派機(jī)制

3.1、雙親委派

我們知道 JVM的類(lèi)加載器加載 Class 的時(shí)候基于雙親委派機(jī)制,也就是會(huì)將加載交給自己的父加載器加載,如果 父加載器為空則查找Bootstrap 是否加載過(guò),當(dāng)無(wú)法加載的時(shí)候才讓自己加載。JDK 提供一個(gè)抽象類(lèi) ClassLoader,這個(gè)抽象類(lèi)中定義了三個(gè)關(guān)鍵方法。對(duì)外使用loadClass(String name) 用于子類(lèi)重寫(xiě)打破雙親委派:loadClass(String name, boolean resolve)

public Class<?> loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, false);
}
protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // 查找該 class 是否已經(jīng)被加載過(guò)
        Class<?> c = findLoadedClass(name);
        // 如果沒(méi)有加載過(guò)
        if (c == null) {
            // 委托給父加載器去加載,遞歸調(diào)用
            if (parent != null) {
                c = parent.loadClass(name, false);
            } else {
                // 如果父加載器為空,查找 Bootstrap 是否加載過(guò)
                c = findBootstrapClassOrNull(name);
            }
            // 若果依然加載不到,則調(diào)用自己的 findClass 去加載
            if (c == null) {
                c = findClass(name);
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}
protected Class<?> findClass(String name){
    //1. 根據(jù)傳入的類(lèi)名 name,到在特定目錄下去尋找類(lèi)文件,把.class 文件讀入內(nèi)存
    ...

        //2. 調(diào)用 defineClass 將字節(jié)數(shù)組轉(zhuǎn)成 Class 對(duì)象
        return defineClass(buf, off, len);
}

// 將字節(jié)碼數(shù)組解析成一個(gè) Class 對(duì)象,用 native 方法實(shí)現(xiàn)
protected final Class<?> defineClass(byte[] b, int off, int len){
    ...
}

JDK 中有 3 個(gè)類(lèi)加載器,另外你也可以自定義類(lèi)加載器,它們的關(guān)系如下圖所示。

  • BootstrapClassLoader是啟動(dòng)類(lèi)加載器,由 C 語(yǔ)言實(shí)現(xiàn),用來(lái)加載 JVM啟動(dòng)時(shí)所需要的核心類(lèi),比如rt.jar、resources.jar等。
  • ExtClassLoader是擴(kuò)展類(lèi)加載器,用來(lái)加載\jre\lib\ext目錄下 JAR 包。
  • AppClassLoader是系統(tǒng)類(lèi)加載器,用來(lái)加載 classpath下的類(lèi),應(yīng)用程序默認(rèn)用它來(lái)加載類(lèi)。
  • 自定義類(lèi)加載器,用來(lái)加載自定義路徑下的類(lèi)。

這些類(lèi)加載器的工作原理是一樣的,區(qū)別是它們的加載路徑不同,也就是說(shuō) findClass這個(gè)方法查找的路徑不同。雙親委托機(jī)制是為了保證一個(gè) Java 類(lèi)在 JVM 中是唯一的,假如你不小心寫(xiě)了一個(gè)與 JRE 核心類(lèi)同名的類(lèi),比如 Object類(lèi),雙親委托機(jī)制能保證加載的是 JRE里的那個(gè) Object類(lèi),而不是你寫(xiě)的 Object類(lèi)。這是因?yàn)?AppClassLoader在加載你的 Object 類(lèi)時(shí),會(huì)委托給 ExtClassLoader去加載,而 ExtClassLoader又會(huì)委托給 BootstrapClassLoader,BootstrapClassLoader發(fā)現(xiàn)自己已經(jīng)加載過(guò)了 Object類(lèi),會(huì)直接返回,不會(huì)去加載你寫(xiě)的 Object類(lèi)。我們最多只能 獲取到 ExtClassLoader這里注意下。

3.2、Tomcat 熱加載

Tomcat 本質(zhì)是通過(guò)一個(gè)后臺(tái)線(xiàn)程做周期性的任務(wù),定期檢測(cè)類(lèi)文件的變化,如果有變化就重新加載類(lèi)。我們來(lái)看 ContainerBackgroundProcessor具體是如何實(shí)現(xiàn)的。

protected class ContainerBackgroundProcessor implements Runnable {

    @Override
    public void run() {
        // 請(qǐng)注意這里傳入的參數(shù)是 " 宿主類(lèi) " 的實(shí)例
        processChildren(ContainerBase.this);
    }

    protected void processChildren(Container container) {
        try {
            //1. 調(diào)用當(dāng)前容器的 backgroundProcess 方法。
            container.backgroundProcess();

            //2. 遍歷所有的子容器,遞歸調(diào)用 processChildren,
            // 這樣當(dāng)前容器的子孫都會(huì)被處理
            Container[] children = container.findChildren();
            for (int i = 0; i < children.length; i++) {
            // 這里請(qǐng)你注意,容器基類(lèi)有個(gè)變量叫做 backgroundProcessorDelay,如果大于 0,表明子容器有自己的后臺(tái)線(xiàn)程,無(wú)需父容器來(lái)調(diào)用它的 processChildren 方法。
                if (children[i].getBackgroundProcessorDelay() <= 0) {
                    processChildren(children[i]);
                }
            }
        } catch (Throwable t) { ... }

Tomcat 的熱加載就是在 Context 容器實(shí)現(xiàn),主要是調(diào)用了 Context 容器的 reload 方法。拋開(kāi)細(xì)節(jié)從宏觀上看主要完成以下任務(wù):

  • 停止和銷(xiāo)毀 Context 容器及其所有子容器,子容器其實(shí)就是 Wrapper,也就是說(shuō) Wrapper 里面 Servlet 實(shí)例也被銷(xiāo)毀了。
  • 停止和銷(xiāo)毀 Context 容器關(guān)聯(lián)的 Listener 和 Filter。
  • 停止和銷(xiāo)毀 Context 下的 Pipeline 和各種 Valve。
  • 停止和銷(xiāo)毀 Context 的類(lèi)加載器,以及類(lèi)加載器加載的類(lèi)文件資源。
  • 啟動(dòng) Context 容器,在這個(gè)過(guò)程中會(huì)重新創(chuàng)建前面四步被銷(xiāo)毀的資源。

在這個(gè)過(guò)程中,類(lèi)加載器發(fā)揮著關(guān)鍵作用。一個(gè) Context 容器對(duì)應(yīng)一個(gè)類(lèi)加載器,類(lèi)加載器在銷(xiāo)毀的過(guò)程中會(huì)把它加載的所有類(lèi)也全部銷(xiāo)毀。Context 容器在啟動(dòng)過(guò)程中,會(huì)創(chuàng)建一個(gè)新的類(lèi)加載器來(lái)加載新的類(lèi)文件。

3.3、Tomcat 的類(lèi)加載器

Tomcat 的自定義類(lèi)加載器 WebAppClassLoader打破了雙親委托機(jī)制,它首先自己嘗試去加載某個(gè)類(lèi),如果找不到再代理給父類(lèi)加載器,其目的是優(yōu)先加載 Web 應(yīng)用自己定義的類(lèi)。具體實(shí)現(xiàn)就是重寫(xiě) ClassLoader的兩個(gè)方法:findClassloadClass。

findClass 方法

org.apache.catalina.loader.WebappClassLoaderBase#findClass;

為了方便理解和閱讀,我去掉了一些細(xì)節(jié):

public Class<?> findClass(String name) throws ClassNotFoundException {
    ...

    Class<?> clazz = null;
    try {
            //1. 先在 Web 應(yīng)用目錄下查找類(lèi)
            clazz = findClassInternal(name);
    }  catch (RuntimeException e) {
           throw e;
       }

    if (clazz == null) {
    try {
            //2. 如果在本地目錄沒(méi)有找到,交給父加載器去查找
            clazz = super.findClass(name);
    }  catch (RuntimeException e) {
           throw e;
       }

    //3. 如果父類(lèi)也沒(méi)找到,拋出 ClassNotFoundException
    if (clazz == null) {
        throw new ClassNotFoundException(name);
     }

    return clazz;
}

1.先在 Web 應(yīng)用本地目錄下查找要加載的類(lèi)。

2.如果沒(méi)有找到,交給父加載器去查找,它的父加載器就是上面提到的系統(tǒng)類(lèi)加載器 AppClassLoader。

3.如何父加載器也沒(méi)找到這個(gè)類(lèi),拋出 ClassNotFound異常。

loadClass 方法

再來(lái)看 Tomcat 類(lèi)加載器的 loadClass方法的實(shí)現(xiàn),同樣我也去掉了一些細(xì)節(jié):

public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {

    synchronized (getClassLoadingLock(name)) {

        Class<?> clazz = null;

        //1. 先在本地 cache 查找該類(lèi)是否已經(jīng)加載過(guò)
        clazz = findLoadedClass0(name);
        if (clazz != null) {
            if (resolve)
                resolveClass(clazz);
            return clazz;
        }

        //2. 從系統(tǒng)類(lèi)加載器的 cache 中查找是否加載過(guò)
        clazz = findLoadedClass(name);
        if (clazz != null) {
            if (resolve)
                resolveClass(clazz);
            return clazz;
        }

        // 3. 嘗試用 ExtClassLoader 類(lèi)加載器類(lèi)加載,為什么?
        ClassLoader javaseLoader = getJavaseClassLoader();
        try {
            clazz = javaseLoader.loadClass(name);
            if (clazz != null) {
                if (resolve)
                    resolveClass(clazz);
                return clazz;
            }
        } catch (ClassNotFoundException e) {
            // Ignore
        }

        // 4. 嘗試在本地目錄搜索 class 并加載
        try {
            clazz = findClass(name);
            if (clazz != null) {
                if (resolve)
                    resolveClass(clazz);
                return clazz;
            }
        } catch (ClassNotFoundException e) {
            // Ignore
        }

        // 5. 嘗試用系統(tǒng)類(lèi)加載器 (也就是 AppClassLoader) 來(lái)加載
            try {
                clazz = Class.forName(name, false, parent);
                if (clazz != null) {
                    if (resolve)
                        resolveClass(clazz);
                    return clazz;
                }
            } catch (ClassNotFoundException e) {
                // Ignore
            }
       }

    //6. 上述過(guò)程都加載失敗,拋出異常
    throw new ClassNotFoundException(name);
}

主要有六個(gè)步驟:

1.先在本地 Cache 查找該類(lèi)是否已經(jīng)加載過(guò),也就是說(shuō) Tomcat 的類(lèi)加載器是否已經(jīng)加載過(guò)這個(gè)類(lèi)。

2.如果 Tomcat 類(lèi)加載器沒(méi)有加載過(guò)這個(gè)類(lèi),再看看系統(tǒng)類(lèi)加載器是否加載過(guò)。

3.如果都沒(méi)有,就讓ExtClassLoader去加載,這一步比較關(guān)鍵,目的 防止 Web 應(yīng)用自己的類(lèi)覆蓋 JRE 的核心類(lèi)。因?yàn)?Tomcat 需要打破雙親委托機(jī)制,假如 Web 應(yīng)用里自定義了一個(gè)叫 Object 的類(lèi),如果先加載這個(gè) Object 類(lèi),就會(huì)覆蓋 JRE 里面的那個(gè) Object 類(lèi),這就是為什么 Tomcat 的類(lèi)加載器會(huì)優(yōu)先嘗試用 ExtClassLoader去加載,因?yàn)?ExtClassLoader會(huì)委托給 BootstrapClassLoader去加載,BootstrapClassLoader發(fā)現(xiàn)自己已經(jīng)加載了 Object 類(lèi),直接返回給 Tomcat 的類(lèi)加載器,這樣 Tomcat 的類(lèi)加載器就不會(huì)去加載 Web 應(yīng)用下的 Object 類(lèi)了,也就避免了覆蓋 JRE 核心類(lèi)的問(wèn)題。

4.如果 ExtClassLoader加載器加載失敗,也就是說(shuō) JRE核心類(lèi)中沒(méi)有這類(lèi),那么就在本地 Web 應(yīng)用目錄下查找并加載。

5.如果本地目錄下沒(méi)有這個(gè)類(lèi),說(shuō)明不是 Web 應(yīng)用自己定義的類(lèi),那么由系統(tǒng)類(lèi)加載器去加載。這里請(qǐng)你注意,Web 應(yīng)用是通過(guò)Class.forName調(diào)用交給系統(tǒng)類(lèi)加載器的,因?yàn)?code>Class.forName的默認(rèn)加載器就是系統(tǒng)類(lèi)加載器。

6.如果上述加載過(guò)程全部失敗,拋出 ClassNotFound異常。

3.4、Tomcat 類(lèi)加載器層次

Tomcat 作為 Servlet容器,它負(fù)責(zé)加載我們的 Servlet類(lèi),此外它還負(fù)責(zé)加載 Servlet所依賴(lài)的 JAR 包。并且 Tomcat本身也是也是一個(gè) Java 程序,因此它需要加載自己的類(lèi)和依賴(lài)的 JAR 包。首先讓我們思考這一下這幾個(gè)問(wèn)題:

1.假如我們?cè)?Tomcat 中運(yùn)行了兩個(gè) Web 應(yīng)用程序,兩個(gè) Web 應(yīng)用中有同名的 Servlet,但是功能不同,Tomcat 需要同時(shí)加載和管理這兩個(gè)同名的 Servlet類(lèi),保證它們不會(huì)沖突,因此 Web 應(yīng)用之間的類(lèi)需要隔離。

2.假如兩個(gè) Web 應(yīng)用都依賴(lài)同一個(gè)第三方的 JAR 包,比如 Spring,那 Spring的 JAR 包被加載到內(nèi)存后,Tomcat要保證這兩個(gè) Web 應(yīng)用能夠共享,也就是說(shuō) Spring的 JAR 包只被加載一次,否則隨著依賴(lài)的第三方 JAR 包增多,JVM的內(nèi)存會(huì)膨脹。

3.跟 JVM 一樣,我們需要隔離 Tomcat 本身的類(lèi)和 Web 應(yīng)用的類(lèi)。

1. WebAppClassLoader

Tomcat 的解決方案是自定義一個(gè)類(lèi)加載器 WebAppClassLoader, 并且給每個(gè) Web 應(yīng)用創(chuàng)建一個(gè)類(lèi)加載器實(shí)例。我們知道,Context 容器組件對(duì)應(yīng)一個(gè) Web 應(yīng)用,因此,每個(gè) Context容器負(fù)責(zé)創(chuàng)建和維護(hù)一個(gè) WebAppClassLoader加載器實(shí)例。這背后的原理是,不同的加載器實(shí)例加載的類(lèi)被認(rèn)為是不同的類(lèi),即使它們的類(lèi)名相同。這就相當(dāng)于在 Java 虛擬機(jī)內(nèi)部創(chuàng)建了一個(gè)個(gè)相互隔離的 Java 類(lèi)空間,每一個(gè) Web 應(yīng)用都有自己的類(lèi)空間,Web 應(yīng)用之間通過(guò)各自的類(lèi)加載器互相隔離。

2.SharedClassLoader

本質(zhì)需求是兩個(gè) Web 應(yīng)用之間怎么共享庫(kù)類(lèi),并且不能重復(fù)加載相同的類(lèi)。在雙親委托機(jī)制里,各個(gè)子加載器都可以通過(guò)父加載器去加載類(lèi),那么把需要共享的類(lèi)放到父加載器的加載路徑下不就行了嗎。

因此 Tomcat 的設(shè)計(jì)者又加了一個(gè)類(lèi)加載器 SharedClassLoader,作為 WebAppClassLoader的父加載器,專(zhuān)門(mén)來(lái)加載 Web 應(yīng)用之間共享的類(lèi)。如果 WebAppClassLoader自己沒(méi)有加載到某個(gè)類(lèi),就會(huì)委托父加載器 SharedClassLoader去加載這個(gè)類(lèi),SharedClassLoader會(huì)在指定目錄下加載共享類(lèi),之后返回給 WebAppClassLoader,這樣共享的問(wèn)題就解決了。

3. CatalinaClassloader

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

要共享可以通過(guò)父子關(guān)系,要隔離那就需要兄弟關(guān)系了。兄弟關(guān)系就是指兩個(gè)類(lèi)加載器是平行的,它們可能擁有同一個(gè)父加載器,基于此 Tomcat 又設(shè)計(jì)一個(gè)類(lèi)加載器 CatalinaClassloader,專(zhuān)門(mén)來(lái)加載 Tomcat 自身的類(lèi)。

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

老辦法,還是再增加一個(gè) CommonClassLoader,作為 CatalinaClassloaderSharedClassLoader的父加載器。CommonClassLoader能加載的類(lèi)都可以被 CatalinaClassLoaderSharedClassLoader使用

四、整體架構(gòu)設(shè)計(jì)解析收獲總結(jié)

通過(guò)前面對(duì) Tomcat 整體架構(gòu)的學(xué)習(xí),知道了 Tomcat 有哪些核心組件,組件之間的關(guān)系。以及 Tomcat 是怎么處理一個(gè) HTTP 請(qǐng)求的。下面我們通過(guò)一張簡(jiǎn)化的類(lèi)圖來(lái)回顧一下,從圖上你可以看到各種組件的層次關(guān)系,圖中的虛線(xiàn)表示一個(gè)請(qǐng)求在 Tomcat 中流轉(zhuǎn)的過(guò)程。

4.1、連接器

Tomcat 的整體架構(gòu)包含了兩個(gè)核心組件連接器和容器。連接器負(fù)責(zé)對(duì)外交流,容器負(fù)責(zé)內(nèi)部處理。連接器用 ProtocolHandler接口來(lái)封裝通信協(xié)議和 I/O模型的差異,ProtocolHandler內(nèi)部又分為 EndPointProcessor模塊,EndPoint負(fù)責(zé)底層 Socket通信,Proccesor負(fù)責(zé)應(yīng)用層協(xié)議解析。連接器通過(guò)適配器 Adapter調(diào)用容器。

對(duì) Tomcat 整體架構(gòu)的學(xué)習(xí),我們可以得到一些設(shè)計(jì)復(fù)雜系統(tǒng)的基本思路。首先要分析需求,根據(jù)高內(nèi)聚低耦合的原則確定子模塊,然后找出子模塊中的變化點(diǎn)和不變點(diǎn),用接口和抽象基類(lèi)去封裝不變點(diǎn),在抽象基類(lèi)中定義模板方法,讓子類(lèi)自行實(shí)現(xiàn)抽象方法,也就是具體子類(lèi)去實(shí)現(xiàn)變化點(diǎn)。

4.2、容器

運(yùn)用了組合模式 管理容器、通過(guò) 觀察者模式 發(fā)布啟動(dòng)事件達(dá)到解耦、開(kāi)閉原則。骨架抽象類(lèi)和模板方法抽象變與不變,變化的交給子類(lèi)實(shí)現(xiàn),從而實(shí)現(xiàn)代碼復(fù)用,以及靈活的拓展。使用責(zé)任鏈的方式處理請(qǐng)求,比如記錄日志等。

4.3、類(lèi)加載器

Tomcat 的自定義類(lèi)加載器 WebAppClassLoader為了隔離 Web 應(yīng)用打破了雙親委托機(jī)制,它首先自己嘗試去加載某個(gè)類(lèi),如果找不到再代理給父類(lèi)加載器,其目的是優(yōu)先加載 Web 應(yīng)用自己定義的類(lèi)。防止 Web 應(yīng)用自己的類(lèi)覆蓋 JRE 的核心類(lèi),使用 ExtClassLoader 去加載,這樣即打破了雙親委派,又能安全加載。

五、實(shí)際場(chǎng)景運(yùn)用

簡(jiǎn)單的分析了 Tomcat 整體架構(gòu)設(shè)計(jì),從 【連接器】 到 【容器】,并且分別細(xì)說(shuō)了一些組件的設(shè)計(jì)思想以及設(shè)計(jì)模式。接下來(lái)就是如何學(xué)以致用,借鑒優(yōu)雅的設(shè)計(jì)運(yùn)用到實(shí)際工作開(kāi)發(fā)中。學(xué)習(xí),從模仿開(kāi)始。

5.1、責(zé)任鏈模式

在工作中,有這么一個(gè)需求,用戶(hù)可以輸入一些信息并可以選擇查驗(yàn)該企業(yè)的 【工商信息】、【司法信息】、【中登情況】等如下如所示的一個(gè)或者多個(gè)模塊,而且模塊之間還有一些公共的東西是要各個(gè)模塊復(fù)用。

這里就像一個(gè)請(qǐng)求,會(huì)被多個(gè)模塊去處理。所以每個(gè)查詢(xún)模塊我們可以抽象為 處理閥門(mén),使用一個(gè) List 將這些 閥門(mén)保存起來(lái),這樣新增模塊我們只需要新增一個(gè)閥門(mén)即可,實(shí)現(xiàn)了開(kāi)閉原則,同時(shí)將一堆查驗(yàn)的代碼解耦到不同的具體閥門(mén)中,使用抽象類(lèi)提取 “不變的”功能。

具體示例代碼如下所示:

首先抽象我們的處理閥門(mén), NetCheckDTO是請(qǐng)求信息

/**
 * 責(zé)任鏈模式:處理每個(gè)模塊閥門(mén)
 */
public interface Valve {
    /**
     * 調(diào)用
     * @param netCheckDTO
     */
    void invoke(NetCheckDTO netCheckDTO);
}

定義抽象基類(lèi),復(fù)用代碼。

public abstract class AbstractCheckValve implements Valve {
    public final AnalysisReportLogDO getLatestHistoryData(NetCheckDTO netCheckDTO, NetCheckDataTypeEnum checkDataTypeEnum){
        // 獲取歷史記錄,省略代碼邏輯
    }

    // 獲取查驗(yàn)數(shù)據(jù)源配置
    public final String getModuleSource(String querySource, ModuleEnum moduleEnum){
       // 省略代碼邏輯
    }
}

定義具體每個(gè)模塊處理的業(yè)務(wù)邏輯,比如 【百度負(fù)面新聞】對(duì)應(yīng)的處理

@Slf4j
@Service
public class BaiduNegativeValve extends AbstractCheckValve {
    @Override
    public void invoke(NetCheckDTO netCheckDTO) {

    }
}

最后就是管理用戶(hù)選擇要查驗(yàn)的模塊,我們通過(guò) List 保存。用于觸發(fā)所需要的查驗(yàn)?zāi)K

@Slf4j
@Service
public class NetCheckService {
    // 注入所有的閥門(mén)
    @Autowired
    private Map<String, Valve> valveMap;

    /**
     * 發(fā)送查驗(yàn)請(qǐng)求
     *
     * @param netCheckDTO
     */
    @Async("asyncExecutor")
    public void sendCheckRequest(NetCheckDTO netCheckDTO) {
        // 用于保存客戶(hù)選擇處理的模塊閥門(mén)
        List<Valve> valves = new ArrayList<>();

        CheckModuleConfigDTO checkModuleConfig = netCheckDTO.getCheckModuleConfig();
        // 將用戶(hù)選擇查驗(yàn)的模塊添加到 閥門(mén)鏈條中
        if (checkModuleConfig.getBaiduNegative()) {
            valves.add(valveMap.get("baiduNegativeValve"));
        }
        // 省略部分代碼.......
        if (CollectionUtils.isEmpty(valves)) {
            log.info("網(wǎng)查查驗(yàn)?zāi)K為空,沒(méi)有需要查驗(yàn)的任務(wù)");
            return;
        }
        // 觸發(fā)處理
        valves.forEach(valve -> valve.invoke(netCheckDTO));
    }
}

5.2、模板方法模式

需求是這樣的,可根據(jù)客戶(hù)錄入的財(cái)報(bào) excel 數(shù)據(jù)或者企業(yè)名稱(chēng)執(zhí)行財(cái)報(bào)分析。

對(duì)于非上市的則解析 excel -> 校驗(yàn)數(shù)據(jù)是否合法->執(zhí)行計(jì)算。

上市企業(yè):判斷名稱(chēng)是否存在 ,不存在則發(fā)送郵件并中止計(jì)算-> 從數(shù)據(jù)庫(kù)拉取財(cái)報(bào)數(shù)據(jù),初始化查驗(yàn)日志、生成一條報(bào)告記錄,觸發(fā)計(jì)算-> 根據(jù)失敗與成功修改任務(wù)狀態(tài) 。

重要的 ”變“ 與 ”不變“,

  • 不變的是整個(gè)流程是初始化查驗(yàn)日志、初始化一條報(bào)告、前期校驗(yàn)數(shù)據(jù)(若是上市公司校驗(yàn)不通過(guò)還需要構(gòu)建郵件數(shù)據(jù)并發(fā)送)、從不同來(lái)源拉取財(cái)報(bào)數(shù)據(jù)并且適配通用數(shù)據(jù)、然后觸發(fā)計(jì)算,任務(wù)異常與成功都需要修改狀態(tài)。
  • 變化的是上市與非上市校驗(yàn)規(guī)則不一樣,獲取財(cái)報(bào)數(shù)據(jù)方式不一樣,兩種方式的財(cái)報(bào)數(shù)據(jù)需要適配

整個(gè)算法流程是固定的模板,但是需要將算法內(nèi)部變化的部分具體實(shí)現(xiàn)延遲到不同子類(lèi)實(shí)現(xiàn),這正是模板方法模式的最佳場(chǎng)景。

public abstract class AbstractAnalysisTemplate {
    /**
     * 提交財(cái)報(bào)分析模板方法,定義骨架流程
     * @param reportAnalysisRequest
     * @return
     */
    public final FinancialAnalysisResultDTO doProcess(FinancialReportAnalysisRequest reportAnalysisRequest) {
        FinancialAnalysisResultDTO analysisDTO = new FinancialAnalysisResultDTO();
		// 抽象方法:提交查驗(yàn)的合法校驗(yàn)
        boolean prepareValidate = prepareValidate(reportAnalysisRequest, analysisDTO);
        log.info("prepareValidate 校驗(yàn)結(jié)果 = {} ", prepareValidate);
        if (!prepareValidate) {
			// 抽象方法:構(gòu)建通知郵件所需要的數(shù)據(jù)
            buildEmailData(analysisDTO);
            log.info("構(gòu)建郵件信息,data = {}", JSON.toJSONString(analysisDTO));
            return analysisDTO;
        }
        String reportNo = FINANCIAL_REPORT_NO_PREFIX + reportAnalysisRequest.getUserId() + SerialNumGenerator.getFixLenthSerialNumber();
        // 生成分析日志
        initFinancialAnalysisLog(reportAnalysisRequest, reportNo);
		// 生成分析記錄
        initAnalysisReport(reportAnalysisRequest, reportNo);

        try {
            // 抽象方法:拉取財(cái)報(bào)數(shù)據(jù),不同子類(lèi)實(shí)現(xiàn)
            FinancialDataDTO financialData = pullFinancialData(reportAnalysisRequest);
            log.info("拉取財(cái)報(bào)數(shù)據(jù)完成, 準(zhǔn)備執(zhí)行計(jì)算");
            // 測(cè)算指標(biāo)
            financialCalcContext.calc(reportAnalysisRequest, financialData, reportNo);
			// 設(shè)置分析日志為成功
            successCalc(reportNo);
        } catch (Exception e) {
            log.error("財(cái)報(bào)計(jì)算子任務(wù)出現(xiàn)異常", e);
			// 設(shè)置分析日志失敗
            failCalc(reportNo);
            throw e;
        }
        return analysisDTO;
    }
}

最后新建兩個(gè)子類(lèi)繼承該模板,并實(shí)現(xiàn)抽象方法。這樣就將上市與非上市兩種類(lèi)型的處理邏輯解耦,同時(shí)又復(fù)用了代碼。

5.3、策略模式

需求是這樣,要做一個(gè)萬(wàn)能識(shí)別銀行流水的 excel 接口,假設(shè)標(biāo)準(zhǔn)流水包含【交易時(shí)間、收入、支出、交易余額、付款人賬號(hào)、付款人名字、收款人名稱(chēng)、收款人賬號(hào)】等字段。現(xiàn)在我們解析出來(lái)每個(gè)必要字段所在 excel 表頭的下標(biāo)。但是流水有多種情況:

1.一種就是包含所有標(biāo)準(zhǔn)字段。

2.收入、支出下標(biāo)是同一列,通過(guò)正負(fù)來(lái)區(qū)分收入與支出。

3.收入與支出是同一列,有一個(gè)交易類(lèi)型的字段來(lái)區(qū)分。

4.特殊銀行的特殊處理。

也就是我們要根據(jù)解析對(duì)應(yīng)的下標(biāo)找到對(duì)應(yīng)的處理邏輯算法,我們可能在一個(gè)方法里面寫(xiě)超多 if else 的代碼,整個(gè)流水處理都偶合在一起,假如未來(lái)再來(lái)一種新的流水類(lèi)型,還要繼續(xù)改老代碼。最后可能出現(xiàn) “又臭又長(zhǎng),難以維護(hù)” 的代碼復(fù)雜度。

這個(gè)時(shí)候我們可以用到策略模式,將不同模板的流水使用不同的處理器處理,根據(jù)模板找到對(duì)應(yīng)的策略算法去處理。即使未來(lái)再加一種類(lèi)型,我們只要新加一種處理器即可,高內(nèi)聚低耦合,且可拓展。

定義處理器接口,不同處理器去實(shí)現(xiàn)處理邏輯。將所有的處理器注入到 BankFlowDataHandlerdata_processor_map中,根據(jù)不同的場(chǎng)景取出對(duì)已經(jīng)的處理器處理流水。

public interface DataProcessor {
    /**
     * 處理流水?dāng)?shù)據(jù)
     * @param bankFlowTemplateDO 流水下標(biāo)數(shù)據(jù)
     * @param row
     * @return
     */
    BankTransactionFlowDO doProcess(BankFlowTemplateDO bankFlowTemplateDO, List<String> row);

    /**
     * 是否支持處理該模板,不同類(lèi)型的流水策略根據(jù)模板數(shù)據(jù)判斷是否支持解析
     * @return
     */
    boolean isSupport(BankFlowTemplateDO bankFlowTemplateDO);
}

// 處理器的上下文
@Service
@Slf4j
public class BankFlowDataContext {
    // 將所有處理器注入到 map 中
    @Autowired
    private List<DataProcessor> processors;

    // 找對(duì)對(duì)應(yīng)的處理器處理流水
    public void process() {
         DataProcessor processor = getProcessor(bankFlowTemplateDO);
      	 for(DataProcessor processor : processors) {
           if (processor.isSupport(bankFlowTemplateDO)) {
             // row 就是一行流水?dāng)?shù)據(jù)
        		 processor.doProcess(bankFlowTemplateDO, row);
             break;
           }
         }

    }


}

定義默認(rèn)處理器,處理正常模板,新增模板只要新增處理器實(shí)現(xiàn) DataProcessor即可。

/**
 * 默認(rèn)處理器:正對(duì)規(guī)范流水模板
 *
 */
@Component("defaultDataProcessor")
@Slf4j
public class DefaultDataProcessor implements DataProcessor {

    @Override
    public BankTransactionFlowDO doProcess(BankFlowTemplateDO bankFlowTemplateDO) {
        // 省略處理邏輯細(xì)節(jié)
        return bankTransactionFlowDO;
    }

    @Override
    public String strategy(BankFlowTemplateDO bankFlowTemplateDO) {
      // 省略判斷是否支持解析該流水
      boolean isDefault = true;

      return isDefault;
    }
}

通過(guò)策略模式,我們將不同處理邏輯分配到不同的處理類(lèi)中,這樣完全解耦,便于拓展。

使用內(nèi)嵌 Tomcat 方式調(diào)試源代碼:GitHub: https://github.com/UniqueDong/tomcat-embedded

以上就是解析Tomcat架構(gòu)原理到架構(gòu)設(shè)計(jì)的詳細(xì)內(nèi)容,更多關(guān)于Tomcat 架構(gòu)原理 架構(gòu)設(shè)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解

    Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解

    這篇文章主要為大家介紹了Tomcat架構(gòu)設(shè)計(jì)及Servlet作用規(guī)范講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • tomcat設(shè)置自啟動(dòng)的方法實(shí)現(xiàn)

    tomcat設(shè)置自啟動(dòng)的方法實(shí)現(xiàn)

    本文主要介紹了在不同操作系統(tǒng)(Windows、MacOS、Ubuntu/Linux)下設(shè)置Tomcat自啟動(dòng)服務(wù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • IntelliJ IDE運(yùn)行Tomcat報(bào)錯(cuò)解決辦法

    IntelliJ IDE運(yùn)行Tomcat報(bào)錯(cuò)解決辦法

    這篇文章主要介紹了 IntelliJ IDE運(yùn)行Tomcat報(bào)錯(cuò)解決辦法的相關(guān)資料,出現(xiàn)“Unable to ping server at localhost:1099”錯(cuò)誤解決方法,需要的朋友可以參考下
    2017-08-08
  • 通過(guò)Tomcat開(kāi)啟JMX監(jiān)控的方法圖解

    通過(guò)Tomcat開(kāi)啟JMX監(jiān)控的方法圖解

    這篇文章主要介紹了Tomcat開(kāi)啟JMX監(jiān)控,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • tomcat報(bào)錯(cuò):地址localhost:8080已在使用中的解決方法

    tomcat報(bào)錯(cuò):地址localhost:8080已在使用中的解決方法

    今天使用tomcat發(fā)現(xiàn)一個(gè)問(wèn)題,本文就介紹一下報(bào)錯(cuò)地址localhost:8080已在使用中的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Tomcat?Catalina為什么不new出來(lái)原理解析

    Tomcat?Catalina為什么不new出來(lái)原理解析

    這篇文章主要為大家介紹了Tomcat?Catalina為什么不new出來(lái)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Tomcat 8.5 環(huán)境搭建步驟

    Tomcat 8.5 環(huán)境搭建步驟

    Tomcat是一個(gè)流行的開(kāi)源Java Servlet容器,它提供了一個(gè)運(yùn)行Java Web應(yīng)用程序的平臺(tái),本文將為您提供關(guān)于如何搭建Tomcat 8.5環(huán)境的詳細(xì)指南,感興趣的朋友一起看看吧
    2024-01-01
  • Tomcat安裝與配置Native APR模式的教程

    Tomcat安裝與配置Native APR模式的教程

    APR是Apache HTTP服務(wù)器的支持庫(kù),提供了一組映射到下層操作系統(tǒng)的API。通過(guò) tomcat-native 庫(kù),使tomcat運(yùn)行時(shí)通過(guò)APR更多的調(diào)用本地API,達(dá)到提升性能的目的。下面這篇文章詳細(xì)介紹了Tomcat安裝與配置Native APR模式的教程,需要的朋友可以參考借鑒,一起來(lái)看看吧。
    2017-02-02
  • 解決安裝tomcat時(shí)出現(xiàn)的問(wèn)題

    解決安裝tomcat時(shí)出現(xiàn)的問(wèn)題

    這篇文章主要介紹了解決安裝tomcat時(shí)出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Win7系統(tǒng)下tomcat7.0配置教程

    Win7系統(tǒng)下tomcat7.0配置教程

    這篇文章主要為大家詳細(xì)介紹了Windows7系統(tǒng)下tomcat7.0配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論

亚洲中文字幕乱码区| 精品国产亚洲av一淫| 97人妻总资源视频| 欧美黑人巨大性xxxxx猛交| 99人妻视频免费在线| 中文字幕乱码av资源| 日韩美女综合中文字幕pp| 午夜激情久久不卡一区二区| 男女啪啪视频免费在线观看 | 久久久久久久一区二区三| 亚洲综合一区二区精品久久| 国产精品一区二区久久久av| 男人操女人的逼免费视频| 国产+亚洲+欧美+另类| 日韩剧情片电影在线收看| 日本a级视频老女人| 超级福利视频在线观看| 人妻素人精油按摩中出| 国产女人露脸高潮对白视频 | 91久久人澡人人添人人爽乱| 在线观看免费av网址大全| 日本人妻少妇18—xx| 日韩伦理短片在线观看| 国产亚洲欧美45p| 欧美日本在线观看一区二区 | 欧美地区一二三专区| 黑人3p华裔熟女普通话| 青青青青青青青在线播放视频| 91成人在线观看免费视频| 偷拍3456eee| 在线观看视频污一区| 婷婷久久久久深爱网| 天堂av在线官网中文| 国产成人小视频在线观看无遮挡| 欧美亚洲免费视频观看| 免费在线黄色观看网站| 欧美亚洲自偷自拍 在线| 97色视频在线观看| 久久久精品精品视频视频| 青青草视频手机免费在线观看| 亚洲av天堂在线播放| 五月色婷婷综合开心网4438| 国产又粗又黄又硬又爽| 成年人该看的视频黄免费| 成人免费做爰高潮视频| 美日韩在线视频免费看| 午夜毛片不卡免费观看视频 | 在线观看欧美黄片一区二区三区| 91免费放福利在线观看| 国产在线自在拍91国语自产精品| 久久久久国产成人精品亚洲午夜| av在线免费中文字幕| 中文字幕一区二区自拍| 亚洲Av无码国产综合色区| 91国内精品自线在拍白富美| 亚洲精品国产在线电影| 80电影天堂网官网| 午夜蜜桃一区二区三区| 黄色在线观看免费观看在线| 一区二区三区四区中文| 亚洲成人av一区久久| 香蕉91一区二区三区| 一级黄色av在线观看| 亚洲福利天堂久久久久久| 100%美女蜜桃视频| jiuse91九色视频| 亚洲高清国产一区二区三区| 男人靠女人的逼视频| 国产欧美日韩在线观看不卡| 天天干天天操天天插天天日| 青娱乐在线免费视频盛宴| 天天日天天爽天天干| av黄色成人在线观看| 午夜成午夜成年片在线观看 | 人人妻人人爽人人添夜| 人人爱人人妻人人澡39| 激情内射在线免费观看| 亚洲成人av在线一区二区| 午夜激情久久不卡一区二区| 免费大片在线观看视频网站| 日韩在线视频观看有码在线| av一区二区三区人妻| 免费av岛国天堂网站| 在线观看国产网站资源| 一区二区三区麻豆福利视频| 中文字幕人妻熟女在线电影| 免费高清自慰一区二区三区网站 | 一个人免费在线观看ww视频| 97色视频在线观看| 色综合久久五月色婷婷综合| 欧美韩国日本国产亚洲| 欧美成人一二三在线网| 二区中出在线观看老师| 成年午夜免费无码区| 啊啊啊视频试看人妻| 日韩一区二区三区三州| 很黄很污很色的午夜网站在线观看| 3344免费偷拍视频| 国产av自拍偷拍盛宴| 午夜精品福利91av| 色狠狠av线不卡香蕉一区二区| 91小伙伴中女熟女高潮| 在线观看欧美黄片一区二区三区| 日本女人一级免费片| 99亚洲美女一区二区三区| 国产美女一区在线观看| 亚洲成人午夜电影在线观看| 欧美专区第八页一区在线播放| 无码精品一区二区三区人| 中文字幕在线一区精品| 亚洲成人激情视频免费观看了| 日韩三级黄色片网站| 天天干天天操天天摸天天射| 国产亚洲天堂天天一区| 2022精品久久久久久中文字幕| 中文字幕乱码人妻电影| 亚洲国产成人在线一区| 在线免费观看日本伦理| 中文亚洲欧美日韩无线码| 亚洲 欧美 自拍 偷拍 在线| 成人18禁网站在线播放| 真实国模和老外性视频| 亚洲图库另类图片区| huangse网站在线观看| 日本韩国在线观看一区二区| 中文字幕—97超碰网| 2020国产在线不卡视频| 最新激情中文字幕视频| 国产一区av澳门在线观看| 精品av国产一区二区三区四区| 亚洲熟女久久久36d| 狠狠躁狠狠爱网站视频| 在线免费观看亚洲精品电影| 狠狠操狠狠操免费视频| 老师啊太大了啊啊啊尻视频| 精品一区二区三区欧美| 久久精品国产999| 美女av色播在线播放| 成人av中文字幕一区| 91免费福利网91麻豆国产精品| 2021最新热播中文字幕| 91精品国产麻豆国产| 精品老妇女久久9g国产| 久久久人妻一区二区| 最新国产亚洲精品中文在线| 午夜场射精嗯嗯啊啊视频| 亚洲欧洲一区二区在线观看| 青青青aaaa免费| 热99re69精品8在线播放| 一区国内二区日韩三区欧美| 在线观看av2025| gav成人免费播放| 久久久久久97三级| 国产精品一区二区av国| 日韩美女搞黄视频免费| 亚洲高清国产自产av| 国产精品成人xxxx| 午夜蜜桃一区二区三区| 色吉吉影音天天干天天操| 在线免费91激情四射 | 亚洲成人三级在线播放 | 欧美黑人性猛交xxxxⅹooo| 亚洲av无乱一区二区三区性色| 青青青视频自偷自拍38碰| 日本一道二三区视频久久| 天天干天天操天天玩天天射| 视频 国产 精品 熟女 | 一区二区麻豆传媒黄片| 亚洲国产40页第21页| 免费无毒热热热热热热久| 天天日天天敢天天干| 韩国三级aaaaa高清视频| 最近的中文字幕在线mv视频| 中文字幕第1页av一天堂网| 日韩美女搞黄视频免费| 99婷婷在线观看视频| 熟女在线视频一区二区三区| 国产综合视频在线看片| 熟妇一区二区三区高清版| 久久人人做人人妻人人玩精品vr| 国产chinesehd精品麻豆| 天天躁日日躁狠狠躁躁欧美av | 欧洲日韩亚洲一区二区三区 | 护士特殊服务久久久久久久| 在线国产中文字幕视频| 一区二区三区精品日本| av天堂中文免费在线| 欧洲国产成人精品91铁牛tv| 91人妻精品一区二区在线看| asmr福利视频在线观看| 在线不卡日韩视频播放| 精品高跟鞋丝袜一区二区| 久久综合老鸭窝色综合久久| 福利视频一区二区三区筱慧 | 国产97在线视频观看| 大黑人性xxxxbbbb| 亚洲一级美女啪啪啪| 欧美日韩人妻久久精品高清国产| 伊人开心婷婷国产av| 亚洲女人的天堂av| 成人免费公开视频无毒| 521精品视频在线观看| 日本精品一区二区三区在线视频。 | 欧美交性又色又爽又黄麻豆| 天堂av狠狠操蜜桃| 亚洲av自拍偷拍综合| 欧美少妇性一区二区三区| 不卡日韩av在线观看| 边摸边做超爽毛片18禁色戒| 久久丁香花五月天色婷婷| 人妻爱爱 中文字幕| 小泽玛利亚视频在线观看| 中国无遮挡白丝袜二区精品| 韩国一级特黄大片做受| 北条麻妃肉色丝袜视频| 亚洲熟妇无码一区二区三区| 日本福利午夜电影在线观看| 欧美交性又色又爽又黄麻豆| 久久久精品999精品日本| 久草视频在线看免费| 国产av福利网址大全| 国产中文精品在线观看| 看一级特黄a大片日本片黑人| 91国产资源在线视频| 阴茎插到阴道里面的视频| 中文字幕在线乱码一区二区| 天天艹天天干天天操| 亚洲高清国产自产av| 中文字幕日韩人妻在线三区| 97黄网站在线观看| 九九视频在线精品播放| av在线观看网址av| 欧美黑人性暴力猛交喷水| 动漫精品视频在线观看| 国产一区二区视频观看| 国产中文精品在线观看| 精品老妇女久久9g国产| 国产精品精品精品999| 日本熟妇丰满厨房55| 99精品视频之69精品视频| 蜜桃视频17c在线一区二区| 国产亚洲视频在线二区| 中文字幕 人妻精品| 老司机欧美视频在线看| 亚国产成人精品久久久| 久久这里有免费精品| 国产又粗又硬又猛的毛片视频| 日本成人一区二区不卡免费在线| 亚洲av男人的天堂你懂的| 韩国AV无码不卡在线播放| av手机免费在线观看高潮| 国产黄色高清资源在线免费观看| 天天摸天天亲天天舔天天操天天爽| 人妻少妇亚洲精品中文字幕| 青青社区2国产视频| 中字幕人妻熟女人妻a62v网| 91av中文视频在线| 521精品视频在线观看| 久久久久久97三级| 97超碰免费在线视频| 换爱交换乱高清大片| 99精品国自产在线人| 伊人情人综合成人久久网小说| av在线shipin| 亚洲中文字幕综合小综合| 成年人啪啪视频在线观看| 福利午夜视频在线观看| 国产 在线 免费 精品| 综合页自拍视频在线播放| 日本高清在线不卡一区二区| 天天操天天干天天日狠狠插| 搡老妇人老女人老熟女| 精品国产亚洲av一淫| 在线不卡成人黄色精品| 日本人妻精品久久久久久| 人妻丰满熟妇综合网| 国产欧美精品一区二区高清 | 91麻豆精品91久久久久同性| 国产视频一区在线观看| gav成人免费播放| 欧美久久久久久三级网| 亚洲免费va在线播放| 亚洲高清一区二区三区视频在线| 午夜久久久久久久精品熟女| 日日操综合成人av| 中文字幕人妻三级在线观看| 人妻少妇亚洲一区二区| 亚洲成人黄色一区二区三区 | 在线 中文字幕 一区| 亚洲av在线观看尤物| 国产福利小视频大全| 欧美一区二区三区激情啪啪啪| 国产日韩欧美视频在线导航| 9色在线视频免费观看| 欧美日韩不卡一区不区二区| 1769国产精品视频免费观看| 亚洲天堂精品久久久| 自拍偷拍 国产资源| 动漫av网站18禁| 久草视频首页在线观看| 一区二区三区四区五区性感视频| 亚洲va欧美va人人爽3p| 国产精品视频一区在线播放| 免费男阳茎伸入女阳道视频| ka0ri在线视频| 精品久久久久久久久久久99| 亚洲成人激情av在线| 国产在线一区二区三区麻酥酥| 日日操综合成人av| 老司机午夜精品视频资源| 特大黑人巨大xxxx| 人妻激情图片视频小说| 婷婷久久一区二区字幕网址你懂得| 日本xx片在线观看| 日本一本午夜在线播放| 日本成人一区二区不卡免费在线| 日本精品视频不卡一二三| 欧美特色aaa大片| 日本高清撒尿pissing| 9久在线视频只有精品| 欧美视频综合第一页| 超鹏97历史在线观看| 中文字幕在线一区精品| 国产乱子伦精品视频潮优女| 亚洲欧美人精品高清| 久久午夜夜伦痒痒想咳嗽P| 国内资源最丰富的网站| 国产精品久久久久久久久福交| 人妻另类专区欧美制服| 国产黑丝高跟鞋视频在线播放| 激情国产小视频在线| 538精品在线观看视频| 亚洲天堂精品久久久| 中文字幕日韩人妻在线三区| 中文字幕日韩无敌亚洲精品| 国产精品人妻熟女毛片av久| 很黄很污很色的午夜网站在线观看| 精品91高清在线观看| 国产高潮无码喷水AV片在线观看| 国产视频一区在线观看| 一区二区三区久久久91| 欧美日韩激情啪啪啪| 国际av大片在线免费观看| 99久久99久国产黄毛片| 亚洲精品 欧美日韩| 四虎永久在线精品免费区二区| 日本熟妇色熟妇在线观看| 91欧美在线免费观看| 北条麻妃av在线免费观看| 18禁污污污app下载| 喷水视频在线观看这里只有精品| 五月色婷婷综合开心网4438| jiuse91九色视频| 中文字幕在线视频一区二区三区| 18禁免费av网站| 黄片色呦呦视频免费看| 国产夫妻视频在线观看免费| 青青青青青青青青青青草青青| 在线成人日韩av电影| 绝色少妇高潮3在线观看| 青青草视频手机免费在线观看| 成人亚洲精品国产精品| 日本人妻少妇18—xx| 97黄网站在线观看| 人妻凌辱欧美丰满熟妇| 国产在线91观看免费观看| 亚洲av色图18p| 人妻久久久精品69系列| 色在线观看视频免费的| 亚洲熟妇无码一区二区三区| av中文字幕福利网| 国产真实灌醉下药美女av福利| 成年人黄色片免费网站| 韩国男女黄色在线观看| 精品人人人妻人人玩日产欧| 黑人进入丰满少妇视频| 青青擦在线视频国产在线| 日韩a级黄色小视频| 亚洲成人午夜电影在线观看| 我想看操逼黄色大片| 80电影天堂网官网| 69精品视频一区二区在线观看| 日韩中文字幕在线播放第二页 | v888av在线观看视频| 欧美乱妇无乱码一区二区| 久久久久久久久久久免费女人| 亚洲图片欧美校园春色| 成年人该看的视频黄免费| 日本一二三区不卡无| 无码中文字幕波多野不卡| 欧美亚洲国产成人免费在线 | 大香蕉伊人中文字幕| 欧洲日韩亚洲一区二区三区| 人人妻人人爽人人添夜| 五十路老熟女码av| 韩国黄色一级二级三级| 亚洲va国产va欧美精品88| 日韩不卡中文在线视频网站| 在线不卡日韩视频播放| 都市激情校园春色狠狠| 天天操天天插天天色| 青青社区2国产视频| 日韩黄色片在线观看网站| 日本一本午夜在线播放| 无码国产精品一区二区高潮久久4| 日本少妇高清视频xxxxx| 涩涩的视频在线观看视频| 最新中文字幕免费视频| 欧美精产国品一二三区| 操日韩美女视频在线免费看| av一本二本在线观看| 大肉大捧一进一出好爽在线视频| 日韩精品中文字幕福利| 天堂av在线官网中文| 欧美一区二区三区乱码在线播放| 密臀av一区在线观看| 黄色资源视频网站日韩| 亚洲在线一区二区欧美| 中文字幕亚洲久久久| 天天躁日日躁狠狠躁躁欧美av| 日韩美女福利视频网| 成人av免费不卡在线观看| 国产精品入口麻豆啊啊啊| 自拍偷拍亚洲另类色图| 黄色的网站在线免费看| 亚洲欧美综合另类13p| 国产乱子伦精品视频潮优女| 2020久久躁狠狠躁夜夜躁 | 99久久超碰人妻国产| 欧美另类重口味极品在线观看| 国产亚洲视频在线二区| 精品一区二区三区在线观看| 韩国爱爱视频中文字幕| 亚洲天堂第一页中文字幕| 日本高清成人一区二区三区| AV天堂一区二区免费试看| 亚洲av色香蕉一区二区三区| 精品国产成人亚洲午夜| 青青擦在线视频国产在线| 91免费放福利在线观看| 蜜桃视频17c在线一区二区| 好吊视频—区二区三区| 夜夜骑夜夜操夜夜奸| 在线观看国产网站资源| 黄色视频在线观看高清无码| 国产欧美精品一区二区高清| 粗大的内捧猛烈进出爽大牛汉子| 三级av中文字幕在线观看| 成人区人妻精品一区二视频| 日韩加勒比东京热二区| 亚洲高清免费在线观看视频| 好男人视频在线免费观看网站| 人妻在线精品录音叫床| 亚洲欧美一卡二卡三卡| 在线免费观看亚洲精品电影| 国产白嫩美女一区二区| 婷婷六月天中文字幕| 国产高清精品极品美女| 91国产在线免费播放| 一区二区三区国产精选在线播放| 中国产一级黄片免费视频播放| 亚洲一区制服丝袜美腿| 日本一区精品视频在线观看| 男人天堂色男人av| 一区二区三区四区视频在线播放 | 亚洲精品无码久久久久不卡| 激情内射在线免费观看| 91九色porny蝌蚪国产成人| 欧美日韩激情啪啪啪| 亚洲免费在线视频网站| 日韩欧美国产精品91| 一区二区三区精品日本| 亚洲 欧美 自拍 偷拍 在线| 40道精品招牌菜特色| 偷拍自拍亚洲美腿丝袜| 午夜福利资源综合激情午夜福利资| 影音先锋女人av噜噜色| 日韩欧美一级aa大片| 都市激情校园春色狠狠| 888欧美视频在线| 久草视频在线看免费| 亚洲一级av大片免费观看| 中文字幕第三十八页久久 | 日本少妇高清视频xxxxx | 国产普通话插插视频| 久久久超爽一二三av| 中文字幕一区的人妻欧美日韩| 2020韩国午夜女主播在线| 天天射,天天操,天天说| 亚洲一区二区三区偷拍女厕91 | 97国产在线观看高清| 欧美偷拍自拍色图片| 日本www中文字幕| 欧美精产国品一二三区| 色伦色伦777国产精品| 在线视频国产欧美日韩| 亚洲国产中文字幕啊啊啊不行了| 福利国产视频在线观看| 2018在线福利视频| 日韩欧美中文国产在线| 中国把吊插入阴蒂的视频| 中文字幕人妻一区二区视频| 国产丰满熟女成人视频| 18禁美女无遮挡免费| 韩国女主播精品视频网站| 久久久麻豆精亚洲av麻花| 80电影天堂网官网| 亚洲 欧美 自拍 偷拍 在线| 欧美专区第八页一区在线播放| 日日操夜夜撸天天干| 成年人啪啪视频在线观看| 视频二区在线视频观看| 97精品人妻一区二区三区精品| 午夜蜜桃一区二区三区| 日本精品美女在线观看| 伊人成人在线综合网| 欧美韩国日本国产亚洲| 国产亚洲精品视频合集| 中文字幕中文字幕 亚洲国产| 在线观看黄色成年人网站 | 日韩av大胆在线观看| av老司机精品在线观看| 天天日天天干天天要| 国产黑丝高跟鞋视频在线播放| 欧美一区二区三区啪啪同性| 亚洲熟女久久久36d| 精品国产成人亚洲午夜| 国产精品精品精品999| 岛国青草视频在线观看| 日本韩国在线观看一区二区| av欧美网站在线观看| 蜜桃色婷婷久久久福利在线| 色哟哟国产精品入口| 人妻爱爱 中文字幕| 一区二区三区久久久91| 91天堂天天日天天操| 国产欧美精品一区二区高清| 好吊视频—区二区三区| 国产成人精品av网站| 日韩一个色综合导航| 中文字幕,亚洲人妻| 亚洲午夜在线视频福利| 黄色片年轻人在线观看| 亚洲精品中文字幕下载| 久碰精品少妇中文字幕av| 很黄很污很色的午夜网站在线观看 | 精品乱子伦一区二区三区免费播| 国产精品亚洲а∨天堂免| 香蕉片在线观看av| 中文字幕高清资源站| 国产伊人免费在线播放| 首之国产AV医生和护士小芳| 成熟熟女国产精品一区| 激情人妻校园春色亚洲欧美| 青青擦在线视频国产在线| 天天色天天爱天天爽| 欧美一区二区三区久久久aaa| 国产麻豆国语对白露脸剧情| 中文字幕中文字幕 亚洲国产| 无码日韩人妻精品久久| 最新国产精品网址在线观看| 亚洲av男人的天堂你懂的| 日日夜夜大香蕉伊人| 快点插进来操我逼啊视频| 国产揄拍高清国内精品对白 | 黄色成年网站午夜在线观看| 全国亚洲男人的天堂| 中文字幕第1页av一天堂网| 在线视频免费观看网| 久久精品国产999| 夜夜骑夜夜操夜夜奸| 中文字幕无码一区二区免费| 夜夜嗨av蜜臀av| 女人精品内射国产99| 日本女大学生的黄色小视频| 久草视频在线免播放| www久久久久久久久久久| 久久丁香花五月天色婷婷| 亚洲欧美综合在线探花| 国产黄色片蝌蚪九色91| 人妻丝袜榨强中文字幕| 天天通天天透天天插| 夜鲁夜鲁狠鲁天天在线| 国产精品人妻一区二区三区网站| 午夜激情高清在线观看| 亚洲国产精品免费在线观看| 91亚洲国产成人精品性色| 欧美特色aaa大片| 欧美日韩精品永久免费网址| 免费看美女脱光衣服的视频| 天天日天天干天天搡| 国产在线观看黄色视频| 香蕉片在线观看av| 动色av一区二区三区| 亚洲精品国产综合久久久久久久久| 换爱交换乱高清大片| 午夜免费观看精品视频| 人妻少妇av在线观看| 在线视频自拍第三页| 国产高清在线观看1区2区| 亚洲男人让女人爽的视频| 国产精品成久久久久三级蜜臀av| 午夜美女福利小视频| 东京干手机福利视频| 人妻av无码专区久久绿巨人| 五十路人妻熟女av一区二区| 最新97国产在线视频| 视频久久久久久久人妻| 亚洲一级美女啪啪啪| 精品一区二区三区三区88 | 中文乱理伦片在线观看| 国产又粗又猛又爽又黄的视频在线| 精品亚洲在线免费观看| 人妻少妇精品久久久久久| 日本免费视频午夜福利视频| 丝袜肉丝一区二区三区四区在线| 欧美天堂av无线av欧美| 福利午夜视频在线观看| 91免费观看国产免费| 久久尻中国美女视频| 天天日天天干天天舔天天射| 久久久91蜜桃精品ad| av日韩在线观看大全| 乱亲女秽乱长久久久| 久精品人妻一区二区三区 | 天天摸天天日天天操| 午夜免费体验区在线观看| 国产亚洲四十路五十路| 在线免费91激情四射 | 精品一区二区三区午夜| 久草电影免费在线观看| 偷拍3456eee| 人人妻人人澡欧美91精品| 亚洲欧美一卡二卡三卡| 国产精品久久久久网| 色婷婷久久久久swag精品| 1区2区3区4区视频在线观看| 啪啪啪18禁一区二区三区 | 亚洲成人情色电影在线观看| 天天干天天搞天天摸| 黄色av网站免费在线| 好男人视频在线免费观看网站| 91免费黄片可看视频| 日本韩国亚洲综合日韩欧美国产| 91麻豆精品91久久久久同性| 中文字幕一区二区亚洲一区| 青青尤物在线观看视频网站| 亚洲综合乱码一区二区| 色综合天天综合网国产成人| 亚洲丝袜老师诱惑在线观看| 91超碰青青中文字幕| 欧洲日韩亚洲一区二区三区| 大香蕉福利在线观看| 亚洲精品成人网久久久久久小说| 国产又大又黄免费观看| av俺也去在线播放| 国产亚洲国产av网站在线| 成人av在线资源网站| 中文字幕奴隷色的舞台50| 成人av亚洲一区二区| 国产精品黄片免费在线观看| 涩涩的视频在线观看视频| 老鸭窝在线观看一区| 99热久久极品热亚洲| 欧美一区二区三区啪啪同性| 性生活第二下硬不起来| 一区二区视频在线观看视频在线| 视频 国产 精品 熟女 | 亚洲最大黄 嗯色 操 啊| 国产成人午夜精品福利| 午夜精品一区二区三区更新| 国产亚州色婷婷久久99精品| 大鸡巴操娇小玲珑的女孩逼| 最新欧美一二三视频| 蝴蝶伊人久久中文娱乐网| 免费黄高清无码国产| 中文字幕无码日韩专区免费| 国产精品一区二区av国| 三上悠亚和黑人665番号| 人妻最新视频在线免费观看| av天堂中文免费在线| 中文字幕综合一区二区| 欧美成人综合色在线噜噜| 日韩欧美一级aa大片| 国产无遮挡裸体免费直播视频| 美女视频福利免费看| 亚洲av无女神免非久久| 青青青青青操视频在线观看| 偷拍自拍亚洲美腿丝袜| 成人午夜电影在线观看 久久| 北条麻妃高跟丝袜啪啪| 国产福利小视频大全| 天天干天天操天天玩天天射| 在线观看免费视频网| 91欧美在线免费观看| 国产又粗又猛又爽又黄的视频在线| 国产福利小视频免费观看| 在线国产中文字幕视频| 天堂女人av一区二区| 久久久精品国产亚洲AV一| 青青青青操在线观看免费| 成熟丰满熟妇高潮xx×xx| 78色精品一区二区三区| 亚洲欧美国产麻豆综合| 91免费放福利在线观看| 亚洲少妇高潮免费观看| 欧美天堂av无线av欧美| 少妇被强干到高潮视频在线观看| 久久久久久97三级| 国产精品久久久久久久久福交| 中文字幕无码一区二区免费| 91精品一区二区三区站长推荐| 精品高潮呻吟久久av| 青青伊人一精品视频| 久久美欧人妻少妇一区二区三区| 日本熟妇喷水xxx| 日韩人妻xxxxx| 日本丰满熟妇BBXBBXHD| 午夜美女福利小视频| 日韩加勒比东京热二区| 五十路人妻熟女av一区二区| 51精品视频免费在线观看| 超pen在线观看视频公开97| 亚洲国产第一页在线观看| 硬鸡巴动态操女人逼视频| 无码日韩人妻精品久久| av在线shipin| 国产精品久久久久久久久福交 | 天堂女人av一区二区| 天天做天天爽夜夜做少妇| 欧美精品国产综合久久| av久久精品北条麻妃av观看| 美女日逼视频免费观看| 亚洲嫩模一区二区三区| av视屏免费在线播放| 亚洲护士一区二区三区| 岳太深了紧紧的中文字幕| 精品91自产拍在线观看一区| 国产之丝袜脚在线一区二区三区 | 国产亚洲欧美45p| 国产午夜激情福利小视频在线| 国产精品手机在线看片| 午夜成午夜成年片在线观看| 中出中文字幕在线观看| 在线播放一区二区三区Av无码| 女蜜桃臀紧身瑜伽裤| 亚洲精品 日韩电影| 亚洲特黄aaaa片| 绯色av蜜臀vs少妇| 男人操女人的逼免费视频| 91在线免费观看成人| 二区中出在线观看老师| ka0ri在线视频| 日本真人性生活视频免费看| 国产在线一区二区三区麻酥酥| 韩国黄色一级二级三级| 国产剧情演绎系列丝袜高跟| 9l人妻人人爽人人爽| 天天操天天污天天射| 少妇人妻100系列| yellow在线播放av啊啊啊| 日韩激情文学在线视频| 新婚人妻聚会被中出| 国产又粗又黄又硬又爽| 国产精品女邻居小骚货| 国产麻豆剧传媒精品国产av蜜桃| 秋霞午夜av福利经典影视| 大陆胖女人与丈夫操b国语高清| 日韩欧美一级精品在线观看| 欧亚乱色一区二区三区| 欧美日韩情色在线观看| jiujiure精品视频在线| 日韩欧美制服诱惑一区在线| 东游记中文字幕版哪里可以看到| 蜜臀av久久久久蜜臀av麻豆| 女同久久精品秋霞网| 精品日产卡一卡二卡国色天香| 天天日天天玩天天摸| 免费成人av中文字幕| av久久精品北条麻妃av观看| 国产免费av一区二区凹凸四季| 3D动漫精品啪啪一区二区下载| 成人亚洲精品国产精品| 大陆胖女人与丈夫操b国语高清| av中文字幕网址在线| 亚洲一级av大片免费观看| 欧美精品国产综合久久| 成人国产影院在线观看| 97超碰免费在线视频| 日本人妻少妇18—xx| 国产日本精品久久久久久久| 在线观看的黄色免费网站| 巨乳人妻日下部加奈被邻居中出| 国产黑丝高跟鞋视频在线播放| 国产精品伦理片一区二区| 国产 在线 免费 精品| 国产麻豆国语对白露脸剧情 | 偷拍美女一区二区三区| 国产av一区2区3区| 亚洲午夜电影之麻豆| 鸡巴操逼一级黄色气| 久草免费人妻视频在线| 2022国产综合在线干| 人妻激情图片视频小说| 亚洲 图片 欧美 图片| 91国内精品自线在拍白富美| 亚洲国产最大av综合| 一二三区在线观看视频| 日本在线不卡免费视频| 国产成人精品久久二区91| 在线观看视频 你懂的| 男生舔女生逼逼的视频| 夜色撩人久久7777| 久久精品视频一区二区三区四区| 亚洲第一伊人天堂网| 黑人巨大的吊bdsm| 首之国产AV医生和护士小芳| 日本在线不卡免费视频| 亚洲免费va在线播放| 青草亚洲视频在线观看| 国产精品3p和黑人大战| 中文字幕 人妻精品| 国产九色91在线视频| 午夜精品福利一区二区三区p | 女同久久精品秋霞网| 2020久久躁狠狠躁夜夜躁| 久久久久久99国产精品| 日韩午夜福利精品试看| 国产性生活中老年人视频网站| 亚洲av香蕉一区区二区三区犇| 啪啪啪操人视频在线播放| 国产视频网站一区二区三区| 青青青视频自偷自拍38碰| 色av色婷婷人妻久久久精品高清| 免费费一级特黄真人片 | 日本午夜爽爽爽爽爽视频在线观看 | 国产成人自拍视频播放| 中文字幕人妻一区二区视频| 2018最新中文字幕在线观看| huangse网站在线观看| 午夜免费体验区在线观看| 国产精品伦理片一区二区| 人人妻人人爱人人草| 人妻丝袜诱惑我操她视频| 亚洲 欧美 精品 激情 偷拍| 亚洲伊人久久精品影院一美女洗澡 | 天天日天天爽天天爽| 在线视频国产欧美日韩| 亚洲精品午夜久久久久| 国产黄色a级三级三级三级 | 国产丰满熟女成人视频| 成人亚洲精品国产精品| 亚洲 中文字幕在线 日韩| 新97超碰在线观看| free性日本少妇| 国产va在线观看精品| 成人伊人精品色xxxx视频| 国产精品人妻一区二区三区网站| 日韩精品一区二区三区在线播放| 18禁美女黄网站色大片下载| av中文在线天堂精品| 国产日韩欧美视频在线导航| 久久亚洲天堂中文对白| 久草视频在线一区二区三区资源站 | 亚洲一区二区激情在线| 亚洲成人激情视频免费观看了| 超碰在线观看免费在线观看| 免费在线播放a级片| 人妻少妇性色欲欧美日韩| 亚洲人成精品久久久久久久| 精品少妇一二三视频在线| 亚洲一区二区三区av网站| 欧洲精品第一页欧洲精品亚洲| 抽查舔水白紧大视频| www骚国产精品视频| 水蜜桃一区二区三区在线观看视频| 视频一区二区三区高清在线| 国产亚洲精品欧洲在线观看| 最新黄色av网站在线观看| 巨乳人妻日下部加奈被邻居中出 | 精品久久久久久久久久久99| 特黄老太婆aa毛毛片| 岛国毛片视频免费在线观看| 手机看片福利盒子日韩在线播放| 91高清成人在线视频| av网站色偷偷婷婷网男人的天堂| 内射久久久久综合网| 97精品成人一区二区三区| 黑人进入丰满少妇视频| 无码精品一区二区三区人| 大白屁股精品视频国产| 色综合久久五月色婷婷综合| 绝色少妇高潮3在线观看| 午夜场射精嗯嗯啊啊视频| 姐姐的朋友2在线观看中文字幕| 亚洲另类伦春色综合小| 999久久久久999| av无限看熟女人妻另类av| 日韩写真福利视频在线观看| 天天干天天插天天谢| 亚洲精品在线资源站| 日韩成人性色生活片| 亚洲综合另类精品小说| 成人亚洲精品国产精品| 色噜噜噜噜18禁止观看| 大香蕉大香蕉在线看| 3337p日本欧洲大胆色噜噜| 极品粉嫩小泬白浆20p主播| 亚洲区欧美区另类最新章节| av网址国产在线观看| 97青青青手机在线视频| 一级黄片大鸡巴插入美女| 日本熟女50视频免费| 天堂av在线官网中文| 少妇ww搡性bbb91| 色婷婷综合激情五月免费观看| 久久精品国产999| 99人妻视频免费在线| 日韩中文字幕在线播放第二页| 成人国产影院在线观看| 男生舔女生逼逼的视频| 精品一区二区三四区| 成人性黑人一级av| 97精品成人一区二区三区| 免费男阳茎伸入女阳道视频| 国产一区二区火爆视频| 久久99久久99精品影院| 中国视频一区二区三区| 亚洲av日韩高清hd| 最新国产亚洲精品中文在线| 精品首页在线观看视频| 大陆av手机在线观看| 中英文字幕av一区| 亚洲一区二区三区在线高清| 亚洲成人熟妇一区二区三区| 美女吃鸡巴操逼高潮视频| 美女大bxxxx内射| 中文字幕人妻av在线观看| 一级黄片大鸡巴插入美女| 国产97视频在线精品| 97人妻人人澡爽人人精品| 国产精品亚洲在线观看| 视频一区 二区 三区 综合| 午夜精品福利91av| 日本av熟女在线视频| 欧美亚洲牲夜夜综合久久| 91国偷自产一区二区三区精品| 91精品国产91青青碰| 亚洲精品三级av在线免费观看| 女同互舔一区二区三区| av线天堂在线观看| 亚洲一区av中文字幕在线观看| 中文字幕一区二区三区人妻大片| 天堂av中文在线最新版| 老师让我插进去69AV| 亚洲av第国产精品| 国产精品日韩欧美一区二区| 在线免费91激情四射 | 国产成人精品一区在线观看| 成年午夜影片国产片| 国产在线免费观看成人| 亚洲成人黄色一区二区三区| 亚洲熟妇无码一区二区三区| 天天射,天天操,天天说| 日韩精品中文字幕福利| 97瑟瑟超碰在线香蕉| av老司机精品在线观看| 午夜激情久久不卡一区二区 | 日本免费午夜视频网站| 天堂中文字幕翔田av| 绝顶痉挛大潮喷高潮无码| 中国黄片视频一区91| 国产免费高清视频视频| 亚洲福利精品视频在线免费观看| 亚洲2021av天堂| 人妻av无码专区久久绿巨人| 在线视频自拍第三页| 91国内精品自线在拍白富美| 国产在线自在拍91国语自产精品 | 日本性感美女三级视频| jul—619中文字幕在线| 国产欧美精品免费观看视频| 最新黄色av网站在线观看| 91桃色成人网络在线观看| 骚货自慰被发现爆操| 亚洲图库另类图片区| 男生舔女生逼逼视频| 在线免费观看黄页视频| 91精品国产91青青碰| 日本黄色特一级视频| 成人高清在线观看视频| 欧美xxx成人在线| 青青擦在线视频国产在线| 国产品国产三级国产普通话三级| 国产精品国产三级麻豆| 97人妻人人澡爽人人精品| 成人H精品动漫在线无码播放| 在线观看的黄色免费网站| 亚洲少妇人妻无码精品| 不卡一区一区三区在线| 亚洲日本一区二区三区| 国产一区二区欧美三区| 一区二区三区麻豆福利视频| 喷水视频在线观看这里只有精品| 中文字幕日韩精品就在这里| 人妻少妇性色欲欧美日韩| 一区二区视频视频视频| 中国无遮挡白丝袜二区精品| 免费无码人妻日韩精品一区二区| 亚洲美女美妇久久字幕组| 亚洲欧美成人综合在线观看| 2021国产一区二区| 国产精品精品精品999| av在线免费中文字幕| 男生用鸡操女生视频动漫| 在线观看操大逼视频| 精品久久久久久久久久中文蒉 | 色花堂在线av中文字幕九九| 欧美在线精品一区二区三区视频| 国产一区成人在线观看视频| 做爰视频毛片下载蜜桃视频1| 噜噜色噜噜噜久色超碰| 中字幕人妻熟女人妻a62v网| 久久机热/这里只有| v888av在线观看视频| 超黄超污网站在线观看| 内射久久久久综合网| 夜夜骑夜夜操夜夜奸| 中文字幕奴隷色的舞台50| 国产亚洲四十路五十路| v888av在线观看视频| 丝袜肉丝一区二区三区四区在线看| 国产黑丝高跟鞋视频在线播放| 日韩欧美在线观看不卡一区二区| 91国产在线免费播放| 2012中文字幕在线高清| 国产久久久精品毛片| 青青热久免费精品视频在线观看| 国产精品女邻居小骚货| 亚洲最大黄 嗯色 操 啊| 天码人妻一区二区三区在线看| 成人国产激情自拍三区| 69精品视频一区二区在线观看| 天天色天天操天天透| av在线免费资源站| 黄网十四区丁香社区激情五月天 | 66久久久久久久久久久| 9色在线视频免费观看| 夏目彩春在线中文字幕| 中文字幕 亚洲av| 亚洲天堂精品久久久| 欧洲黄页网免费观看| 国语对白xxxx乱大交| 黄片三级三级三级在线观看| 亚洲Av无码国产综合色区| 人妻久久无码中文成人| 国产片免费观看在线观看| 亚洲伊人久久精品影院一美女洗澡 | 丝袜美腿视频诱惑亚洲无| 五十路人妻熟女av一区二区| 久久久91蜜桃精品ad| 91p0rny九色露脸熟女| av视屏免费在线播放| 九九视频在线精品播放| 边摸边做超爽毛片18禁色戒| 精品亚洲国产中文自在线| 大香蕉大香蕉在线看| 大学生A级毛片免费视频| 偷拍自拍视频图片免费| 亚洲 欧美 自拍 偷拍 在线| 性感美女诱惑福利视频| www天堂在线久久| 丝袜长腿第一页在线| 18禁美女羞羞免费网站| av天堂中文字幕最新| 日韩av熟妇在线观看| 日本男女操逼视频免费看| 黄片三级三级三级在线观看| 午夜dv内射一区区| 亚洲午夜电影在线观看| 99久久99久国产黄毛片| 在线视频这里只有精品自拍| 欧美亚洲一二三区蜜臀| 精品首页在线观看视频| 麻豆性色视频在线观看| 国产精品久久综合久久| 中文字幕高清免费在线人妻| 国产成人精品一区在线观看| 精品久久久久久久久久久99| 久久尻中国美女视频| 国产黑丝高跟鞋视频在线播放| 亚国产成人精品久久久| 三上悠亚和黑人665番号| 2022国产综合在线干| 伊人精品福利综合导航| 中文字幕+中文字幕| 天天日天天鲁天天操| 中文字幕在线观看极品视频| 日韩av免费观看一区| 亚洲综合色在线免费观看| 伊人综合aⅴ在线网| 午夜久久久久久久99| 一区二区三区四区视频在线播放| 91精品激情五月婷婷在线| 亚洲色偷偷综合亚洲AV伊人| 婷婷久久一区二区字幕网址你懂得 | 在线观看视频 你懂的| 亚洲在线观看中文字幕av| 粉嫩av蜜乳av蜜臀| 天天干狠狠干天天操| 日本在线一区二区不卡视频| 天天艹天天干天天操| 日韩欧美国产一区不卡| 91免费观看国产免费| 亚洲丝袜老师诱惑在线观看| 在线视频自拍第三页| 九色视频在线观看免费| 青青草在观免费国产精品| 免费费一级特黄真人片| 最新国产亚洲精品中文在线| 中文字幕无码一区二区免费| 欧美成人综合视频一区二区| 亚洲av男人天堂久久| 九色视频在线观看免费| 国产密臀av一区二区三| 伊拉克及约旦宣布关闭领空| 亚洲 清纯 国产com| 阴茎插到阴道里面的视频| 77久久久久国产精产品| 久碰精品少妇中文字幕av | 亚洲精品乱码久久久本| 亚洲国产第一页在线观看| 日本丰满熟妇BBXBBXHD| 欧美日韩精品永久免费网址| 亚洲最大免费在线观看| 家庭女教师中文字幕在线播放| 色噜噜噜噜18禁止观看| 成年女人免费播放视频| 欧美熟妇一区二区三区仙踪林| 精品久久久久久高潮| 日韩欧美一级黄片亚洲| 在线视频自拍第三页| 国产日韩欧美视频在线导航| 直接能看的国产av| 人人人妻人人澡人人| 福利午夜视频在线观看| 被大鸡吧操的好舒服视频免费| 亚洲一区二区三区久久午夜 | 可以免费看的www视频你懂的| 99精品免费观看视频| 久久农村老妇乱69系列| 很黄很污很色的午夜网站在线观看 | 人妻素人精油按摩中出| 年轻的人妻被夫上司侵犯| 精品成人午夜免费看| 日本人妻少妇18—xx| 欧美一级色视频美日韩| 中文字幕亚洲久久久| 免费在线观看污污视频网站| 91香蕉成人app下载| 国产精品久久久久久久久福交| 一区二区视频在线观看免费观看| 91精品国产高清自在线看香蕉网| 黑人借宿ntr人妻的沦陷2| 沈阳熟妇28厘米大战黑人| 欧美色呦呦最新网址| 在线观看黄色成年人网站| sw137 中文字幕 在线| 五月天久久激情视频| 视频 国产 精品 熟女 | 午夜91一区二区三区| 国产精品亚洲а∨天堂免| 啊啊好慢点插舔我逼啊啊啊视频| 2020中文字幕在线播放| 亚洲欧美综合另类13p| 午夜久久久久久久精品熟女| 午夜影院在线观看视频羞羞羞| 人人妻人人澡人人爽人人dvl| 啪啪啪啪啪啪啪免费视频| 欧美日韩v中文在线| 精品成人午夜免费看| 视频一区二区在线免费播放| 亚洲人妻国产精品综合| 亚洲成人精品女人久久久| 日韩黄色片在线观看网站| 国产97在线视频观看| 亚洲综合色在线免费观看| 五月天久久激情视频| 男女之间激情网午夜在线| 欧美成人猛片aaaaaaa| 中文字幕在线乱码一区二区| 国产中文字幕四区在线观看| 久久精品36亚洲精品束缚| 久草视频在线免播放| 在线免费观看99视频| 一个人免费在线观看ww视频| 国产精品久久久久久久女人18| 少妇高潮无套内谢麻豆| 888亚洲欧美国产va在线播放| 丝袜亚洲另类欧美变态| 在线观看国产免费麻豆| 最新国产精品拍在线观看| 自拍偷拍,中文字幕| 亚洲中文精品字幕在线观看| 免费费一级特黄真人片| 中文字幕日本人妻中出| 成人av免费不卡在线观看| 亚洲欧美一区二区三区爱爱动图| 77久久久久国产精产品| 动漫黑丝美女的鸡巴| 欧洲日韩亚洲一区二区三区| 日本一道二三区视频久久| av网站色偷偷婷婷网男人的天堂| 非洲黑人一级特黄片| 天天日天天舔天天射进去| 一区二区三区视频,福利一区二区 丰满的子国产在线观看 | 粉嫩欧美美人妻小视频| 91老师蜜桃臀大屁股| 亚洲视频在线视频看视频在线| 亚洲视频在线视频看视频在线| av完全免费在线观看av| www久久久久久久久久久| 99精品国产自在现线观看| 77久久久久国产精产品| 2012中文字幕在线高清| 国产亚洲视频在线观看| 亚洲成人免费看电影| 超级福利视频在线观看| 99av国产精品欲麻豆| 青青草原网站在线观看| 成熟熟女国产精品一区| 国产精品大陆在线2019不卡| 五月婷婷在线观看视频免费| av老司机亚洲一区二区| 一区二区三区日本伦理| 亚洲精品av在线观看| 91中文字幕最新合集| 精品一区二区三四区| 日韩在线视频观看有码在线| 国产一区二区视频观看| 久久久久久九九99精品| 不卡精品视频在线观看| 一区二区三区精品日本| 精品成人午夜免费看| 在线视频精品你懂的| 丝袜美腿视频诱惑亚洲无| 丝袜长腿第一页在线| 欧美成人综合色在线噜噜| 强行扒开双腿猛烈进入免费版| 亚洲一区二区三区久久午夜| 国产精品久久综合久久| 亚洲午夜电影在线观看| caoporn蜜桃视频| 色综合久久无码中文字幕波多| 美味人妻2在线播放| 99精品视频在线观看免费播放| 老司机深夜免费福利视频在线观看| 18禁精品网站久久| 婷婷久久一区二区字幕网址你懂得| 超级碰碰在线视频免费观看| 精品黑人巨大在线一区| 任我爽精品视频在线播放| 日韩在线中文字幕色| 久久久久只精品国产三级| 亚洲激情唯美亚洲激情图片| 黄色录像鸡巴插进去| 亚洲黄色av网站免费播放| 中文字日产幕乱六区蜜桃| 青青草国内在线视频精选| avjpm亚洲伊人久久| 51国产偷自视频在线播放| 93精品视频在线观看| 亚洲一区二区三区偷拍女厕91| 亚洲第一伊人天堂网| 成人性爱在线看四区| 免费无码人妻日韩精品一区二区| 插逼视频双插洞国产操逼插洞| 十八禁在线观看地址免费| 色综合久久久久久久久中文| 日韩精品二区一区久久| 久草视频在线一区二区三区资源站 | 少妇被强干到高潮视频在线观看| 粗大的内捧猛烈进出爽大牛汉子| 中国产一级黄片免费视频播放| 中国把吊插入阴蒂的视频| 黄色视频在线观看高清无码 | 亚洲熟女女同志女同| 国产黄色大片在线免费播放| 果冻传媒av一区二区三区| 日韩人妻xxxxx| 性欧美激情久久久久久久| 午夜在线精品偷拍一区二| 日日日日日日日日夜夜夜夜夜夜| 国产97视频在线精品| 91国语爽死我了不卡| 97精品综合久久在线| 视频久久久久久久人妻| 在线观看操大逼视频| 日本成人一区二区不卡免费在线| 国产九色91在线观看精品| 人妻少妇性色欲欧美日韩| tube69日本少妇| 人妻无码中文字幕专区| 色综合久久五月色婷婷综合| 午夜精品一区二区三区更新| 中出中文字幕在线观看| av男人天堂狠狠干| 中文字幕一区二区三区人妻大片| 亚洲国产精品美女在线观看| 亚洲超碰97人人做人人爱| 日本18禁久久久久久| 亚洲精品乱码久久久本| 边摸边做超爽毛片18禁色戒 | 好男人视频在线免费观看网站| 日韩国产乱码中文字幕| 美女小视频网站在线| 亚洲欧美一区二区三区电影| 99精品免费久久久久久久久a| 亚洲国产欧美一区二区三区久久 | 9l人妻人人爽人人爽| 久久久久久久精品成人热| 亚洲国产最大av综合| 成年人免费看在线视频| 亚洲美女自偷自拍11页| 99人妻视频免费在线| 91免费观看国产免费| 国产精品久久9999| 国产一区自拍黄视频免费观看| 日本高清撒尿pissing| 亚洲av自拍偷拍综合| 久草视频福利在线首页| 国产刺激激情美女网站| 久久久麻豆精亚洲av麻花| 专门看国产熟妇的网站| 日本少妇的秘密免费视频| 丰满的子国产在线观看| 日本美女成人在线视频| 91精品综合久久久久3d动漫| 最新的中文字幕 亚洲| 天天日天天干天天爱| 日韩av免费观看一区| 欧美国品一二三产区区别| 91亚洲精品干熟女蜜桃频道| 我想看操逼黄色大片| 视频二区在线视频观看| 91极品新人『兔兔』精品新作| 中文字幕高清在线免费播放 | 精品区一区二区三区四区人妻| 中文字幕av第1页中文字幕| 国产chinesehd精品麻豆| 啪啪啪啪啪啪啪免费视频| 久久香蕉国产免费天天| 久久久久久9999久久久久| 中文字幕日韩精品日本| 中文字幕 亚洲av| 天天日天天日天天射天天干| av视网站在线观看| 超碰中文字幕免费观看| 欧美视频综合第一页| 狠狠操操操操操操操操操| 少妇高潮一区二区三区| 传媒在线播放国产精品一区| 91精品高清一区二区三区| 91啪国自产中文字幕在线| 18禁免费av网站| 亚洲熟女久久久36d| 揄拍成人国产精品免费看视频| 人人妻人人爽人人添夜| 最新欧美一二三视频| 亚洲免费成人a v| 中文字幕+中文字幕| 亚洲1卡2卡三卡4卡在线观看| av在线免费中文字幕| 一级黄片久久久久久久久| 日本av熟女在线视频| 99精品免费久久久久久久久a| 黄色资源视频网站日韩| 天天日天天鲁天天操| 亚洲蜜臀av一区二区三区九色| 一区二区视频在线观看视频在线| 中文字幕一区二区三区人妻大片 | 大陆精品一区二区三区久久| 98精产国品一二三产区区别| 一区二区三区日韩久久| 5528327男人天堂| 四川乱子伦视频国产vip| av俺也去在线播放| 99一区二区在线观看| 天天干天天操天天爽天天摸| 天天日夜夜干天天操| 黄色资源视频网站日韩| 97精品人妻一区二区三区精品| av新中文天堂在线网址| 在线国产中文字幕视频| 青青色国产视频在线| 国产一线二线三线的区别在哪| 夜色福利视频在线观看| av在线资源中文字幕| 青娱乐极品视频青青草| 不卡一区一区三区在线| 国产自拍在线观看成人| 日本欧美视频在线观看三区| 99热这里只有国产精品6| 日本最新一二三区不卡在线| 亚洲av色香蕉一区二区三区 | sspd152中文字幕在线| 日韩欧美在线观看不卡一区二区| 少妇高潮一区二区三区| 亚洲va天堂va国产va久| 亚洲天堂成人在线观看视频网站| 狠狠的往里顶撞h百合| 中文字幕免费在线免费| 天天日天天天天天天天天天天 | 久久国产精品精品美女| 黄色片黄色片wyaa| 日韩精品中文字幕在线| okirakuhuhu在线观看| 国产视频精品资源网站| 九色porny九色9l自拍视频| 日韩美女搞黄视频免费| 瑟瑟视频在线观看免费视频| 午夜av一区二区三区| 天天干天天日天天谢综合156| 夜色撩人久久7777| 日噜噜噜夜夜噜噜噜天天噜噜噜| weyvv5国产成人精品的视频| 婷婷综合亚洲爱久久| rct470中文字幕在线| 午夜免费体验区在线观看| 久久精品久久精品亚洲人| 老熟妇凹凸淫老妇女av在线观看| 欧美视频不卡一区四区| 青青青青青手机视频| rct470中文字幕在线| 婷婷久久久久深爱网| 久久艹在线观看视频| 欧美日本在线观看一区二区| 人人爽亚洲av人人爽av| 国产福利小视频大全| 大鸡八强奸视频在线观看| 在线观看视频一区麻豆| 又黄又刺激的午夜小视频| 亚洲少妇人妻无码精品| 青青青国产免费视频| 97a片免费在线观看| 日本午夜爽爽爽爽爽视频在线观看 | 欧美亚洲少妇福利视频| 宅男噜噜噜666国产| 偷拍3456eee| 男生用鸡操女生视频动漫 | 青青青aaaa免费| 熟女人妻一区二区精品视频| 99精品视频之69精品视频| 天天日天天干天天干天天日| 中文字幕—97超碰网| 一区二区熟女人妻视频| 黑人3p华裔熟女普通话| 欧美少妇性一区二区三区| 国产一区二区在线欧美| 成人综合亚洲欧美一区| 午夜大尺度无码福利视频| 国产亚洲视频在线二区| 日日日日日日日日夜夜夜夜夜夜| 欧美日韩激情啪啪啪| 好太好爽好想要免费| 久草免费人妻视频在线| 老司机欧美视频在线看| 2020国产在线不卡视频| 欧美日本在线视频一区| 直接观看免费黄网站| 2021最新热播中文字幕| 日韩欧美高清免费在线| 午夜激情高清在线观看| av无限看熟女人妻另类av| 国产之丝袜脚在线一区二区三区| 久草视频 久草视频2| 亚洲综合图片20p| 欧美激情电影免费在线| 亚洲 清纯 国产com| 成人蜜桃美臀九一一区二区三区| 不卡一区一区三区在线| 中文字幕在线观看极品视频| 日韩特级黄片高清在线看| 久久永久免费精品人妻专区| 精品老妇女久久9g国产| 91麻豆精品91久久久久同性| 国产黑丝高跟鞋视频在线播放 | 成人av免费不卡在线观看| 一区二区三区日本伦理| 五十路息与子猛烈交尾视频| 蜜桃臀av蜜桃臀av| 国产精品日韩欧美一区二区| 看一级特黄a大片日本片黑人| 中文字幕人妻熟女在线电影| 夜夜嗨av一区二区三区中文字幕| 久久久麻豆精亚洲av麻花| 北条麻妃高跟丝袜啪啪| 韩国一级特黄大片做受| 国产乱子伦精品视频潮优女| 亚洲精品久久视频婷婷| 少妇人妻久久久久视频黄片| 国产视频一区在线观看| 操操网操操伊剧情片中文字幕网| 天天日天天爽天天干| 日韩美女精品视频在线观看网站| 视频一区 二区 三区 综合| 岛国毛片视频免费在线观看| 午夜成午夜成年片在线观看| 美味人妻2在线播放| 中文字幕—97超碰网| 成人性黑人一级av| 水蜜桃国产一区二区三区| 男女啪啪啪啪啪的网站| 影音先锋女人av噜噜色| 999久久久久999| 国产精品成久久久久三级蜜臀av | 亚洲av黄色在线网站| 国产精品手机在线看片| 一级A一级a爰片免费免会员| 国产精品黄色的av| 免费成人av中文字幕| 中文字幕午夜免费福利视频| 人妻3p真实偷拍一二区| 亚洲午夜电影在线观看| 天天日天天爽天天干| 国产三级精品三级在线不卡| 日韩欧美中文国产在线| 国产janese在线播放| 亚国产成人精品久久久| 久久久久久久久久一区二区三区 | 视频一区二区在线免费播放 | 亚洲熟女久久久36d| 午夜毛片不卡在线看| 自拍偷拍vs一区二区三区| 亚洲福利精品视频在线免费观看| 绯色av蜜臀vs少妇| 淫秽激情视频免费观看| 年轻的人妻被夫上司侵犯| 99热久久极品热亚洲| 亚洲av极品精品在线观看| 亚洲一区二区久久久人妻| 99精品久久久久久久91蜜桃| 美女操逼免费短视频下载链接| 亚洲偷自拍高清视频| 视频在线免费观看你懂得| 一级黄片久久久久久久久| 久久久久久久久久久免费女人| 亚洲中文字幕乱码区| 亚洲精品乱码久久久本| 日韩av中文在线免费观看| 激情内射在线免费观看| 午夜福利资源综合激情午夜福利资 | 日韩成人性色生活片| 国产亚洲欧美另类在线观看| 女同久久精品秋霞网| 天天操,天天干,天天射| 超pen在线观看视频公开97| 亚洲变态另类色图天堂网| av中文字幕在线观看第三页| 自拍偷拍日韩欧美亚洲| asmr福利视频在线观看| 91精品国产黑色丝袜| 伊人综合aⅴ在线网| 五十路老熟女码av| 中文字幕一区二区三区蜜月| 精品少妇一二三视频在线| 少妇与子乱在线观看| 日本一本午夜在线播放| 日韩欧美国产一区不卡| 亚洲福利精品视频在线免费观看 | 国产日韩av一区二区在线| 亚国产成人精品久久久| av一区二区三区人妻| 性感美女高潮视频久久久 | 欧美老鸡巴日小嫩逼| 欧美国产亚洲中英文字幕| 在线可以看的视频你懂的| lutube在线成人免费看| 天天日天天舔天天射进去| 大学生A级毛片免费视频| 91免费福利网91麻豆国产精品 | 激情五月婷婷综合色啪| 黑人进入丰满少妇视频| 欧美日韩高清午夜蜜桃大香蕉| 中文字幕日本人妻中出| 中国视频一区二区三区| 中文字幕最新久久久| 三上悠亚和黑人665番号| 日本少妇的秘密免费视频| 伊人综合免费在线视频| 中文字幕免费福利视频6| 一区二区三区av高清免费| 欧美亚洲少妇福利视频| 日韩av熟妇在线观看| 亚洲一区av中文字幕在线观看| 极品性荡少妇一区二区色欲| 天天干天天操天天爽天天摸| 欧美日本国产自视大全| 操人妻嗷嗷叫视频一区二区| 亚洲一区久久免费视频| 美女视频福利免费看| 在线国产精品一区二区三区| 欧美爆乳肉感大码在线观看| 又粗又硬又猛又黄免费30| ka0ri在线视频| 姐姐的朋友2在线观看中文字幕| 天天操夜夜骑日日摸| 亚洲av日韩精品久久久久久hd| 18禁美女羞羞免费网站| 天堂中文字幕翔田av| 91精品国产综合久久久蜜| 国产日韩欧美美利坚蜜臀懂色| 国产美女一区在线观看| 视频 国产 精品 熟女 | 风流唐伯虎电视剧在线观看| 国产性色生活片毛片春晓精品| 最新国产亚洲精品中文在线| 亚洲一区二区三区av网站| 亚洲中文字幕校园春色| 风流唐伯虎电视剧在线观看 | 超碰中文字幕免费观看| 欧美色婷婷综合在线| 日韩成人免费电影二区| 伊人综合免费在线视频| 99精品国产免费久久| 日曰摸日日碰夜夜爽歪歪| 国产免费av一区二区凹凸四季| 久久这里有免费精品| 综合精品久久久久97| 亚洲国产40页第21页| 亚洲少妇人妻无码精品| 久久精品在线观看一区二区| 熟女人妻一区二区精品视频| 午夜精品亚洲精品五月色| 中文字幕av第1页中文字幕| 精品国产在线手机在线| 亚洲变态另类色图天堂网| 一二三中文乱码亚洲乱码one| 国产日韩欧美美利坚蜜臀懂色| 国产性色生活片毛片春晓精品 | 一二三区在线观看视频| 小泽玛利亚视频在线观看| 青青草在观免费国产精品| 熟女少妇激情五十路| 亚洲伊人色一综合网| 欧美一区二区三区久久久aaa| 美女张开两腿让男人桶av| 亚洲va国产va欧美va在线| 日韩欧美高清免费在线| 小穴多水久久精品免费看| 午夜毛片不卡免费观看视频| 老司机99精品视频在线观看| 国产精品sm调教视频| 美女在线观看日本亚洲一区| 综合国产成人在线观看| 欧美激情精品在线观看| 九九热99视频在线观看97| 欧美熟妇一区二区三区仙踪林| 亚洲中文字幕国产日韩| 9色精品视频在线观看| 欧美中文字幕一区最新网址| 一区二区三区综合视频| 边摸边做超爽毛片18禁色戒| 亚洲成a人片777777| 国产精品sm调教视频| 欧洲日韩亚洲一区二区三区 | 日本少妇高清视频xxxxx| 久久久久久久精品老熟妇| av线天堂在线观看| 亚洲国产免费av一区二区三区| 国产av自拍偷拍盛宴| 成人国产小视频在线观看| 91精品激情五月婷婷在线| 久久久久久久久久久久久97| 亚洲欧美另类手机在线| 国产麻豆乱子伦午夜视频观看| 懂色av之国产精品| 亚洲女人的天堂av| 福利国产视频在线观看| 毛片av在线免费看| 日日日日日日日日夜夜夜夜夜夜| 人人妻人人澡欧美91精品| 热思思国产99re| 国产一区二区欧美三区| 操日韩美女视频在线免费看| 丝袜亚洲另类欧美变态| 丝袜亚洲另类欧美变态| 青娱乐在线免费视频盛宴| 天天插天天色天天日| 欧美黑人性暴力猛交喷水| 婷婷久久一区二区字幕网址你懂得| av天堂加勒比在线| 国产乱子伦精品视频潮优女| 熟女少妇激情五十路| 午夜精品一区二区三区福利视频| 国产久久久精品毛片| 国产熟妇人妻ⅹxxxx麻豆| 国产精品国产精品一区二区| 亚洲精品久久综合久| 丝袜国产专区在线观看| 亚洲日本一区二区三区 | 免费男阳茎伸入女阳道视频| 2021久久免费视频| 中国熟女一区二区性xx| 日本一区二区三区免费小视频| 曰本无码人妻丰满熟妇啪啪| 中国把吊插入阴蒂的视频| 天天干天天操天天玩天天射 | 欧美亚洲中文字幕一区二区三区| 宅男噜噜噜666国产| 国产之丝袜脚在线一区二区三区| 国产大学生援交正在播放| 老司机在线精品福利视频| av中文字幕网址在线| 国产精品久久久久久久久福交| 视频啪啪啪免费观看| 成人精品视频99第一页| 一本久久精品一区二区| 区一区二区三国产中文字幕| 日韩亚洲高清在线观看| 日辽宁老肥女在线观看视频| 成人动漫大肉棒插进去视频| 少妇人妻二三区视频| 日韩av中文在线免费观看| 天堂av在线官网中文| 天堂av狠狠操蜜桃| 成人国产小视频在线观看| 久久久久国产成人精品亚洲午夜| 动漫黑丝美女的鸡巴| 久久久久久97三级| 久草视频 久草视频2| 亚洲免费福利一区二区三区| 99精品免费久久久久久久久a| 女同互舔一区二区三区| 成年美女黄网站18禁久久| 中文字幕日韩精品日本| 阴茎插到阴道里面的视频| 午夜在线精品偷拍一区二| 一级a看免费观看网站| 天天干天天啪天天舔| 这里只有精品双飞在线播放| 国产精品系列在线观看一区二区| 一区二区三区美女毛片| 三级等保密码要求条款| 人妻熟女中文字幕aⅴ在线| 久久综合老鸭窝色综合久久 | 日本性感美女写真视频| 777奇米久久精品一区| 中国无遮挡白丝袜二区精品| 日视频免费在线观看| 国产亚洲视频在线观看| 成人免费毛片aaaa| 国产在线拍揄自揄视频网站| 天天色天天操天天透| gav成人免费播放| 大白屁股精品视频国产| 精品久久久久久久久久久a√国产| 成人网18免费视频版国产| 亚洲人一区二区中文字幕| 爱有来生高清在线中文字幕| 播放日本一区二区三区电影| 黑人变态深video特大巨大| 欧美在线精品一区二区三区视频| 免费费一级特黄真人片| 制服丝袜在线人妻中文字幕| 午夜福利资源综合激情午夜福利资| 亚洲精品乱码久久久久久密桃明 | 粗大的内捧猛烈进出爽大牛汉子 | 狠狠操操操操操操操操操| 自拍偷拍,中文字幕| 人妻凌辱欧美丰满熟妇| 国产精品系列在线观看一区二区| 亚洲 欧美 精品 激情 偷拍| 免费黄页网站4188| 中文字幕第三十八页久久| 激情综合治理六月婷婷| 日本av在线一区二区三区| 亚洲人妻30pwc| 天天色天天操天天透| 色吉吉影音天天干天天操| 欧美日韩高清午夜蜜桃大香蕉| 在线播放 日韩 av| 一区二区三区av高清免费| 国产视频精品资源网站| 青青青青青操视频在线观看| 美女骚逼日出水来了| 欧美性受xx黑人性猛交| 国产福利在线视频一区| 一区二区三区日韩久久| 97色视频在线观看| 免费观看国产综合视频| 全国亚洲男人的天堂| 在线制服丝袜中文字幕| 91国产在线免费播放| 国产乱子伦精品视频潮优女| 亚洲成av人无码不卡影片一| 国产福利小视频大全| 97青青青手机在线视频| 国产老熟女伦老熟妇ⅹ| 香蕉av影视在线观看| 超级av免费观看一区二区三区| 成人国产激情自拍三区| 天天操夜夜骑日日摸| 国产V亚洲V天堂无码欠欠| 天天操天天弄天天射| 天天干天天啪天天舔| 成人精品视频99第一页| 黄色的网站在线免费看| 首之国产AV医生和护士小芳| 在线免费观看视频一二区| 久久久精品精品视频视频| 一区二区三区欧美日韩高清播放| 免费av岛国天堂网站| 大陆胖女人与丈夫操b国语高清 | 亚洲av日韩av网站| 11久久久久久久久久久| 美女小视频网站在线| 日本熟妇色熟妇在线观看| 欧美激情精品在线观看| 大胸性感美女羞爽操逼毛片| 91人妻精品久久久久久久网站| 黄片色呦呦视频免费看| av在线免费观看亚洲天堂| 精品黑人巨大在线一区| 亚洲欧美综合在线探花| 国产91嫩草久久成人在线视频| 大鸡吧插逼逼视频免费看 | 97a片免费在线观看| 久久精品36亚洲精品束缚| 日韩少妇人妻精品无码专区| 黄片色呦呦视频免费看| 日视频免费在线观看| 亚洲一区二区三区久久受| 中文字幕人妻av在线观看| 40道精品招牌菜特色| 青草久久视频在线观看| 日本一二三中文字幕| 大陆av手机在线观看| 青青青青爽手机在线| av中文字幕福利网| 人妻另类专区欧美制服| 精品美女在线观看视频在线观看| 久久久麻豆精亚洲av麻花| 久草福利电影在线观看| 亚洲午夜电影之麻豆| 国产熟妇一区二区三区av | 国产91久久精品一区二区字幕| 美味人妻2在线播放| 亚洲精品午夜aaa久久| 强行扒开双腿猛烈进入免费版| 天堂v男人视频在线观看| 少妇高潮一区二区三区| 在线免费观看视频一二区| 97人妻色免费视频| 97黄网站在线观看| 国产福利小视频二区| 涩爱综合久久五月蜜臀| 热久久只有这里有精品| 伊人综合aⅴ在线网| 亚洲最大黄 嗯色 操 啊| 成人影片高清在线观看| 欧美黑人性暴力猛交喷水| 91国内精品久久久久精品一| 人妻3p真实偷拍一二区| 97小视频人妻一区二区| 国产又色又刺激在线视频| 免费黄色成人午夜在线网站| 亚洲欧美清纯唯美另类| 午夜精品一区二区三区4| 欧美一区二区中文字幕电影 | 高清成人av一区三区| 亚洲国产精品久久久久久6| 亚洲国产精品黑丝美女| 亚洲 欧美 精品 激情 偷拍| 91九色porny国产在线| 亚洲一区二区激情在线| 国产精品免费不卡av| 久久丁香婷婷六月天| 国产日韩欧美视频在线导航| 天天艹天天干天天操| 午夜在线精品偷拍一区二| 天天色天天操天天舔| 91九色porny蝌蚪国产成人| 亚洲日产av一区二区在线| 东京热男人的av天堂| 三级av中文字幕在线观看| 深夜男人福利在线观看| 亚洲女人的天堂av| 国产麻豆精品人妻av| 欧美色婷婷综合在线| 97精品人妻一区二区三区精品| 超碰97人人做人人爱| 亚洲欧美激情国产综合久久久 | asmr福利视频在线观看| 偷拍美女一区二区三区| 好男人视频在线免费观看网站| 一区二区三区另类在线| 大鸡吧插逼逼视频免费看| 亚洲av自拍天堂网| 国产va精品免费观看| 亚洲精品乱码久久久本| 女警官打开双腿沦为性奴| 欧美成人一二三在线网| 男女第一次视频在线观看| 精品国产在线手机在线| 一区二区麻豆传媒黄片| 色花堂在线av中文字幕九九 | 亚洲一区二区三区久久午夜| 黑人3p华裔熟女普通话| 亚洲精品 欧美日韩| 亚洲精品成人网久久久久久小说| 欧美精品亚洲精品日韩在线| 最近中文2019年在线看| 丝袜肉丝一区二区三区四区在线看| 亚洲专区激情在线观看视频| 中文字幕一区二区人妻电影冢本 | 韩国AV无码不卡在线播放| 九色porny九色9l自拍视频| 国产精选一区在线播放| 精品日产卡一卡二卡国色天香 | 中文字幕国产专区欧美激情| 熟女91pooyn熟女| 爱有来生高清在线中文字幕| 亚洲国际青青操综合网站| 人妻少妇中文有码精品| 亚洲综合在线观看免费| 大鸡吧插入女阴道黄色片| 日本一区二区三区免费小视频| 91精品国产黑色丝袜| 2022国产综合在线干| 成人网18免费视频版国产| 中文字幕之无码色多多| 92福利视频午夜1000看| 男人天堂色男人av| 亚洲粉嫩av一区二区三区| 天天日夜夜操天天摸| 57pao国产一区二区| 色婷婷精品大在线观看| 天天操天天操天天碰| 日本人竟这样玩学生妹| 在线免费视频 自拍| 一区二区三区久久久91| 国产熟妇人妻ⅹxxxx麻豆| 天天摸天天亲天天舔天天操天天爽| 亚洲av男人的天堂你懂的| 国产精品自拍偷拍a| 中文字幕在线第一页成人| 91精品视频在线观看免费| 特黄老太婆aa毛毛片| 黄页网视频在线免费观看| 国产高清精品一区二区三区| 另类av十亚洲av| 亚洲午夜高清在线观看| av黄色成人在线观看| 美女日逼视频免费观看| 青草久久视频在线观看| 欲乱人妻少妇在线视频裸| 国产精品午夜国产小视频| 99婷婷在线观看视频| AV无码一区二区三区不卡| 青青擦在线视频国产在线| 欧美一区二区三区四区性视频| 国产麻豆乱子伦午夜视频观看| 成人精品视频99第一页| 成熟丰满熟妇高潮xx×xx| 2018在线福利视频| 四川乱子伦视频国产vip| 久久久久五月天丁香社区| 老司机福利精品免费视频一区二区 | 国产视频网站一区二区三区| 日本午夜福利免费视频| 北条麻妃肉色丝袜视频| 午夜蜜桃一区二区三区| 男人天堂最新地址av| 午夜91一区二区三区| 激情啪啪啪啪一区二区三区| 成人24小时免费视频| 男人操女人的逼免费视频| 亚洲午夜精品小视频| 自拍偷拍 国产资源| 午夜大尺度无码福利视频| 中文字幕人妻熟女在线电影| 黄片三级三级三级在线观看| 日韩欧美国产精品91| 日本少妇人妻xxxxxhd| 果冻传媒av一区二区三区 | 亚洲一级av大片免费观看| 免费无码人妻日韩精品一区二区| 国产janese在线播放| 夜色撩人久久7777| 日本少妇人妻xxxxx18| 日本脱亚入欧是指什么| 激情图片日韩欧美人妻| 久久精品国产999| 大香蕉日本伊人中文在线| 青青草在观免费国产精品| 亚洲精品无码久久久久不卡 | 99热色原网这里只有精品| 中文字幕第一页国产在线| 国产视频网站国产视频| 天天艹天天干天天操| 国产老熟女伦老熟妇ⅹ| 91p0rny九色露脸熟女| 天天色天天操天天透| 看一级特黄a大片日本片黑人| okirakuhuhu在线观看| 天天日天天干天天要| 亚洲欧美福利在线观看| 在线免费观看亚洲精品电影| 久久久久国产成人精品亚洲午夜| 精品国产在线手机在线| 亚洲欧美综合在线探花| 亚洲成人三级在线播放| 亚洲精品久久视频婷婷| 亚洲av香蕉一区区二区三区犇| 天天日天天干天天要| 日韩北条麻妃一区在线| 黄工厂精品视频在线观看| 天堂av在线播放免费| 在线观看欧美黄片一区二区三区 | 欧美日韩情色在线观看| 欧美久久久久久三级网| 国产乱子伦一二三区| 亚洲成人熟妇一区二区三区| 在线视频精品你懂的| 天天操天天污天天射| 18禁美女黄网站色大片下载| 91极品大一女神正在播放| rct470中文字幕在线| 成人国产激情自拍三区| 国产乱子伦一二三区| av在线免费中文字幕| 国产1区,2区,3区| www天堂在线久久| 蜜桃视频17c在线一区二区| 又色又爽又黄的美女裸体| 国产视频网站国产视频| 久草视频首页在线观看| 亚洲av第国产精品| av亚洲中文天堂字幕网| 在线网站你懂得老司机| 四虎永久在线精品免费区二区| 美女小视频网站在线| 午夜精品久久久久久99热| 老熟妇xxxhd老熟女| 男生舔女生逼逼视频| 日韩一个色综合导航| 亚洲 中文 自拍 另类 欧美| 在线免费91激情四射 | 噜噜色噜噜噜久色超碰| 国产又色又刺激在线视频| 亚洲视频在线视频看视频在线| 人妻激情图片视频小说| 蜜桃视频17c在线一区二区| 国产精品系列在线观看一区二区 | 国产成人精品久久二区91| 污污小视频91在线观看| 老司机免费福利视频网| 天天日天天日天天擦| 无码日韩人妻精品久久| 国产夫妻视频在线观看免费| 午夜精彩视频免费一区| 成人国产影院在线观看| 99精品一区二区三区的区| av天堂中文免费在线| 中文字幕国产专区欧美激情| 国产欧美日韩第三页| 欧美性感尤物人妻在线免费看| 骚逼被大屌狂草视频免费看| 18禁精品网站久久| 男生用鸡操女生视频动漫 | 40道精品招牌菜特色| 2018最新中文字幕在线观看| 91she九色精品国产| 天天干天天操天天爽天天摸| 国产91久久精品一区二区字幕| 国内精品在线播放第一页| 婷婷久久久久深爱网| 亚洲欧美成人综合视频| 亚洲精品国产在线电影| 91欧美在线免费观看| 毛片av在线免费看| eeuss鲁片一区二区三区| 99热色原网这里只有精品| 天天摸天天干天天操科普 | 经典国语激情内射视频| 国产黑丝高跟鞋视频在线播放| 硬鸡巴动态操女人逼视频| 精品国产高潮中文字幕| 91人妻精品一区二区在线看| 欧美性受xx黑人性猛交| 视频 国产 精品 熟女 | 日韩一区二区电国产精品| 中国黄色av一级片| jiujiure精品视频在线| 亚洲午夜电影之麻豆| 久草电影免费在线观看| 福利在线视频网址导航| av日韩在线观看大全| av老司机精品在线观看| 9l人妻人人爽人人爽| 丝袜长腿第一页在线| 欧美日韩国产一区二区三区三州| 韩国三级aaaaa高清视频| 91亚洲手机在线视频播放| 国产成人午夜精品福利| 2012中文字幕在线高清| 9l人妻人人爽人人爽| 中文字幕 亚洲av| 精品av国产一区二区三区四区| 久久亚洲天堂中文对白| 欧洲精品第一页欧洲精品亚洲| av天堂加勒比在线| 日本熟妇一区二区x x| 天天日天天天天天天天天天天| 亚洲国产精品免费在线观看| 蜜桃臀av蜜桃臀av| 国产av自拍偷拍盛宴| 欧美老鸡巴日小嫩逼| 国产成人精品一区在线观看| 中文人妻AV久久人妻水| 女同性ⅹxx女同h偷拍| 欧美性感尤物人妻在线免费看| 91精品国产黑色丝袜| 国产女人叫床高潮大片视频| 国产精品成人xxxx| 欧美色婷婷综合在线| 国产一区二区在线欧美| 伊人综合aⅴ在线网| 操人妻嗷嗷叫视频一区二区| 亚洲av无女神免非久久| 成人区人妻精品一区二视频| 熟妇一区二区三区高清版| 大尺度激情四射网站| 亚洲精品亚洲人成在线导航| 亚洲va国产va欧美精品88| 精品久久久久久久久久久99| 成人av免费不卡在线观看| 色爱av一区二区三区| 福利视频广场一区二区| 亚洲在线免费h观看网站| 一区二区视频在线观看免费观看 | av中文字幕在线导航| 综合色区亚洲熟妇shxstz| 亚洲成人精品女人久久久| 东京热男人的av天堂| 一色桃子久久精品亚洲| 青青草在观免费国产精品| 亚洲视频在线视频看视频在线| 午夜精品久久久久麻豆影视| 美洲精品一二三产区区别| 欧亚乱色一区二区三区| 精品视频中文字幕在线播放 | 人妻少妇av在线观看| 91桃色成人网络在线观看| 最新激情中文字幕视频| 成人蜜臀午夜久久一区| 亚洲图片偷拍自拍区| 亚洲男人的天堂a在线| 11久久久久久久久久久| 在线免费观看黄页视频| 久久久极品久久蜜桃| 9久在线视频只有精品| 初美沙希中文字幕在线 | 最新欧美一二三视频| 男生用鸡操女生视频动漫| 天天躁日日躁狠狠躁av麻豆| 日日夜夜大香蕉伊人| 国产又粗又硬又猛的毛片视频 | 日本一区精品视频在线观看| 亚洲狠狠婷婷综合久久app| 久久丁香婷婷六月天| 成年美女黄网站18禁久久| 亚洲粉嫩av一区二区三区| 欧美一区二区三区在线资源 | 成人av中文字幕一区| 亚洲第17页国产精品| 日本美女性生活一级片| 亚洲综合另类精品小说| 不戴胸罩引我诱的隔壁的人妻| 欧美精产国品一二三产品区别大吗| 大香蕉玖玖一区2区| 亚洲男人让女人爽的视频| 日日夜夜精品一二三| 亚洲午夜伦理视频在线| 国产熟妇一区二区三区av| 黄色片一级美女黄色片| 亚洲 国产 成人 在线| 一区二区三区另类在线| 骚逼被大屌狂草视频免费看| 欧美日本国产自视大全| 揄拍成人国产精品免费看视频| 欧美一级色视频美日韩| 美女av色播在线播放| 午夜精品久久久久久99热| 国产精品一区二区av国| 日本丰满熟妇BBXBBXHD| 绝色少妇高潮3在线观看| 小穴多水久久精品免费看| 日韩精品中文字幕播放| 99国内小视频在现欢看| 亚洲av可乐操首页| 色综合天天综合网国产成人| 国产成人精品福利短视频| 精品av久久久久久久| 亚洲天堂精品福利成人av| 欧洲精品第一页欧洲精品亚洲| 蜜桃精品久久久一区二区| 成人高清在线观看视频| 91在线视频在线精品3| 亚洲激情唯美亚洲激情图片| 国产精品熟女久久久久浪潮| 韩国爱爱视频中文字幕| 欧美亚洲牲夜夜综合久久| 在线可以看的视频你懂的| 欧洲国产成人精品91铁牛tv| 日韩特级黄片高清在线看| av日韩在线免费播放| 亚洲国产最大av综合| 精品乱子伦一区二区三区免费播| 国产精品自拍偷拍a| 美女在线观看日本亚洲一区| 亚洲美女高潮喷浆视频| 青青社区2国产视频| 2020中文字幕在线播放| 男人和女人激情视频| 9l人妻人人爽人人爽| 国产黄色高清资源在线免费观看| 日日夜夜大香蕉伊人| 综合激情网激情五月五月婷婷| 亚洲精品在线资源站| 玖玖一区二区在线观看| 免费手机黄页网址大全| 日韩伦理短片在线观看| 欧洲精品第一页欧洲精品亚洲 | 成人亚洲精品国产精品| 久碰精品少妇中文字幕av| 麻豆精品成人免费视频| 伊人综合aⅴ在线网| 国产一级精品综合av| 2018最新中文字幕在线观看| 日本少妇精品免费视频| 久久艹在线观看视频| 国产妇女自拍区在线观看| 亚洲精品福利网站图片| 大香蕉日本伊人中文在线| gogo国模私拍视频| 青青青青青青青青青青草青青| 被大鸡吧操的好舒服视频免费| 亚洲少妇高潮免费观看| 亚洲国产成人最新资源| 第一福利视频在线观看| 天天干天天日天天谢综合156| 黄片大全在线观看观看| 99人妻视频免费在线| 午夜福利人人妻人人澡人人爽| 动漫精品视频在线观看| 五十路在线观看完整版| 红桃av成人在线观看| 男人的网址你懂的亚洲欧洲av| 亚洲高清国产拍青青草原| 伊人综合aⅴ在线网| 亚洲区欧美区另类最新章节| 日韩北条麻妃一区在线| 91极品新人『兔兔』精品新作 | 日韩熟女系列一区二区三区| 欧美成人精品在线观看| 国产普通话插插视频| 久久久噜噜噜久久熟女av| 精品亚洲中文字幕av| 好太好爽好想要免费| 午夜在线一区二区免费| 99久久久无码国产精品性出奶水 | 亚洲变态另类色图天堂网| 岛国毛片视频免费在线观看| 人妻少妇中文有码精品| 激情啪啪啪啪一区二区三区| 国产内射中出在线观看| 熟女人妻在线中出观看完整版| 精品欧美一区二区vr在线观看| 一区二区免费高清黄色视频| 亚洲熟色妇av日韩熟色妇在线| 97人妻无码AV碰碰视频| 天天艹天天干天天操| 亚洲精品精品国产综合| 天天操天天操天天碰| 国产黄色a级三级三级三级| 人人妻人人爽人人澡人人精品| 日本裸体熟妇区二区欧美| 欧美xxx成人在线| 熟女91pooyn熟女| 一级A一级a爰片免费免会员| 少妇人妻100系列| 久久这里只有精彩视频免费| 久久丁香花五月天色婷婷| 国产实拍勾搭女技师av在线| 天天日天天干天天要| 狠狠操操操操操操操操操| 大陆av手机在线观看| 十八禁在线观看地址免费| 3344免费偷拍视频| 日本裸体熟妇区二区欧美| 亚洲激情偷拍一区二区| 欧美专区日韩专区国产专区| 51国产偷自视频在线播放 | 亚洲福利精品视频在线免费观看| 亚洲成a人片777777| 孕妇奶水仑乱A级毛片免费看| 日韩欧美在线观看不卡一区二区| 黄色片黄色片wyaa| 日本一道二三区视频久久| av黄色成人在线观看| 久草视频在线一区二区三区资源站| 亚洲福利午夜久久久精品电影网| avjpm亚洲伊人久久| 久久精品久久精品亚洲人| 五十路息与子猛烈交尾视频| 国内资源最丰富的网站| 亚洲av可乐操首页| 国产视频网站国产视频| 青娱乐极品视频青青草| 黄色中文字幕在线播放| 在线视频免费观看网| 美女小视频网站在线| 婷婷午夜国产精品久久久| 亚洲免费在线视频网站| 欧美区一区二区三视频| 黑人3p华裔熟女普通话| 天天摸天天日天天操| 91大屁股国产一区二区| 亚洲成a人片777777| 天天色天天操天天透| 日本免费视频午夜福利视频| 人妻无码中文字幕专区| 亚洲人妻av毛片在线| 日本熟妇喷水xxx| 精彩视频99免费在线| 18禁精品网站久久| 性生活第二下硬不起来| 可以免费看的www视频你懂的 | 适合午夜一个人看的视频| 天天操天天弄天天射| 日本精品一区二区三区在线视频。| 欧美美女人体视频一区| 国产va精品免费观看| 日本成人不卡一区二区| heyzo蜜桃熟女人妻| 一区二区三区四区中文| 成人福利视频免费在线| 欧美地区一二三专区| 亚洲女人的天堂av| 亚洲自拍偷拍综合色| 91在线免费观看成人| 早川濑里奈av黑人番号| 青青青青青青青在线播放视频| 中文字幕在线永久免费播放| 欧美日韩在线精品一区二区三| 亚洲精品无码色午夜福利理论片| 亚洲免费在线视频网站| 欧美成人猛片aaaaaaa| 天天躁夜夜躁日日躁a麻豆| 久久久久久97三级| 日日夜夜精品一二三| 久久久久五月天丁香社区 | 亚洲精品麻豆免费在线观看| 美女福利视频导航网站| 在线免费观看99视频| 国产精品视频一区在线播放| 日本中文字幕一二区视频| 91精品视频在线观看免费| 日本免费一级黄色录像| 亚洲高清国产拍青青草原| 亚洲av色图18p| 精品一线二线三线日本| 天天射,天天操,天天说| 天天日天天干天天插舔舔| 亚洲国产成人无码麻豆艾秋| 一区二区三区四区视频| 亚洲 欧美 精品 激情 偷拍 | 日韩美女福利视频网| 啪啪啪啪啪啪啪免费视频| 中国无遮挡白丝袜二区精品| 自拍偷拍一区二区三区图片| 中国熟女@视频91| 色综合久久五月色婷婷综合| 视频一区二区三区高清在线| 又粗又长 明星操逼小视频| 国产a级毛久久久久精品| 国产在线免费观看成人| 国产免费高清视频视频| 硬鸡巴动态操女人逼视频| 日韩欧美亚洲熟女人妻| 中文字幕一区二区三区人妻大片| 亚洲综合另类欧美久久| 大香蕉大香蕉大香蕉大香蕉大香蕉| 亚洲欧美日韩视频免费观看| 免费av岛国天堂网站| 青青青青青操视频在线观看| 岛国青草视频在线观看| 青草亚洲视频在线观看| 在线视频免费观看网| 精品久久久久久久久久久99| 91成人精品亚洲国产| av在线免费观看亚洲天堂| 亚洲福利精品视频在线免费观看| 国产成人精品福利短视频| 亚洲av无硬久久精品蜜桃| 久久精品国产23696| 欧美日韩在线精品一区二区三| 熟女少妇激情五十路| 国产亚洲天堂天天一区| 亚洲免费成人a v| 国产精品入口麻豆啊啊啊| 五月色婷婷综合开心网4438| 国产三级片久久久久久久| 日比视频老公慢点好舒服啊| 亚洲国产在线精品国偷产拍| 在线免费观看99视频| 国产高清在线在线视频| 亚洲午夜精品小视频| 日本一区精品视频在线观看| 岛国免费大片在线观看| 男人和女人激情视频| 天天日天天敢天天干| 亚洲日产av一区二区在线| 大香蕉福利在线观看| 100%美女蜜桃视频| 婷婷五月亚洲综合在线| 亚洲精品 日韩电影|