久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tomcat 架构原理到架构设计,写得非常好!

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomcat 架构原理到架构设计,写得非常好! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tomcat 架構原理解析到架構設計借鑒

Tomcat 發展這么多年,已經比較成熟穩定。在如今『追新求快』的時代,Tomcat 作為 Java Web 開發必備的工具似乎變成了『熟悉的陌生人』,難道說如今就沒有必要深入學習它了么?學習它我們又有什么收獲呢?

靜下心來,細細品味經典的開源作品?。提升我們的「內功」,具體來說就是學習大牛們如何設計、架構一個中間件系統,并且讓這些經驗為我所用。

美好的事物往往是整潔而優雅的。但這并不等于簡單,而是要將復雜的系統分解成一個個小模塊,并且各個模塊的職責劃分也要清晰合理。

與此相反的是凌亂無序,比如你看到城中村一堆互相糾纏在一起的電線,可能會感到不適。維護的代碼一個類幾千行、一個方法好幾百行。方法之間相互耦合糅雜在一起,你可能會說 what the f*k!

學習目的

掌握 Tomcat 架構設計與原理提高內功

宏觀上看

Tomcat 作為一個 「Http?服務器 +?Servlet?容器」,對我們屏蔽了應用層協議和網絡通信細節,給我們的是標準的?Request?和?Response?對象;對于具體的業務邏輯則作為變化點,交給我們來實現。我們使用了SpringMVC?之類的框架,可是卻從來不需要考慮?TCP?連接、?Http?協議的數據處理與響應。就是因為 Tomcat 已經為我們做好了這些,我們只需要關注每個請求的具體業務邏輯。

微觀上看

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

當今流行的微服務也是這個思路,按照功能將單體應用拆成「微服務」,拆分過程要將共性提取出來,而這些共性就會成為核心的基礎服務或者通用庫。「中臺」思想亦是如此。

設計模式往往就是封裝變化的一把利器,合理的運用設計模式能讓我們的代碼與系統設計變得優雅且整潔。

這就是學習優秀開源軟件能獲得的「內功」,從不會過時,其中的設計思想與哲學才是根本之道。從中借鑒設計經驗,合理運用設計模式封裝變與不變,更能從它們的源碼中汲取經驗,提升自己的系統設計能力。

宏觀理解一個請求如何與 Spring 聯系起來

在工作過程中,我們對 Java 語法已經很熟悉了,甚至「背」過一些設計模式,用過很多 Web 框架,但是很少有機會將他們用到實際項目中,讓自己獨立設計一個系統似乎也是根據需求一個個 Service 實現而已。腦子里似乎沒有一張 Java Web 開發全景圖,比如我并不知道瀏覽器的請求是怎么跟 Spring 中的代碼聯系起來的。

為了突破這個瓶頸,為何不站在巨人的肩膀上學習優秀的開源系統,看大牛們是如何思考這些問題。

學習 Tomcat 的原理,我發現?Servlet?技術是 Web 開發的原點,幾乎所有的 Java Web 框架(比如 Spring)都是基于?Servlet?的封裝,Spring 應用本身就是一個?Servlet(DispatchSevlet),而 Tomcat 和 Jetty 這樣的 Web 容器,負責加載和運行?Servlet。如圖所示:

提升自己的系統設計能力

學習 Tomcat ,我還發現用到不少 Java 高級技術,比如 Java 多線程并發編程、Socket 網絡編程以及反射等。之前也只是了解這些技術,為了面試也背過一些題。但是總感覺「知道」與會用之間存在一道溝壑,通過對 Tomcat 源碼學習,我學會了什么場景去使用這些技術。

還有就是系統設計能力,比如面向接口編程、組件化組合模式、骨架抽象類、一鍵式啟停、對象池技術以及各種設計模式,比如模板方法、觀察者模式、責任鏈模式等,之后我也開始模仿它們并把這些設計思想運用到實際的工作中。

整體架構設計

今天咱們就來一步一步分析 Tomcat 的設計思路,一方面我們可以學到 Tomcat 的總體架構,學會從宏觀上怎么去設計一個復雜系統,怎么設計頂層模塊,以及模塊之間的關系;另一方面也為我們深入學習 Tomcat 的工作原理打下基礎。

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

Tomcat 實現的 2 個核心功能:

  • 處理?Socket?連接,負責網絡字節流與?Request?和?Response?對象的轉化。

  • 加載并管理?Servlet?,以及處理具體的?Request?請求。

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

Tomcat為了實現支持多種?I/O?模型和應用層協議,一個容器可能對接多個連接器,就好比一個房間有多個門。

Tomcat整體架構

?

  • Server 對應的就是一個 Tomcat 實例。

  • Service 默認只有一個,也就是一個 Tomcat 實例默認一個 Service。

  • Connector:一個 Service 可能多個 連接器,接受不同連接協議。

  • Container: 多個連接器對應一個容器,頂層容器其實就是 Engine。

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

連接器

在開始講連接器前,我先鋪墊一下?Tomcat支持的多種?I/O?模型和應用層協議。

Tomcat支持的?I/O?模型有:

  • NIO:非阻塞?I/O,采用?Java NIO?類庫實現。

  • NIO2:異步I/O,采用?JDK 7?最新的?NIO2?類庫實現。

  • APR:采用?Apache可移植運行庫實現,是?C/C++?編寫的本地庫。

Tomcat 支持的應用層協議有:

  • HTTP/1.1:這是大部分 Web 應用采用的訪問協議。

  • AJP:用于和 Web 服務器集成(如 Apache)。

  • HTTP/2:HTTP 2.0 大幅度的提升了 Web 性能。

所以一個容器可能對接多個連接器。連接器對?Servlet?容器屏蔽了網絡協議與?I/O?模型的區別,無論是?Http?還是?AJP,在容器中獲取到的都是一個標準的?ServletRequest?對象。

細化連接器的功能需求就是:

  • 監聽網絡端口。

  • 接受網絡連接請求。

  • 讀取請求網絡字節流。

  • 根據具體應用層協議(HTTP/AJP)解析字節流,生成統一的?Tomcat Request?對象。

  • 將?Tomcat Request?對象轉成標準的?ServletRequest。

  • 調用?Servlet容器,得到?ServletResponse。

  • 將?ServletResponse轉成?Tomcat Response?對象。

  • 將?Tomcat Response?轉成網絡字節流。

  • 將響應字節流寫回給瀏覽器。

需求列清楚后,我們要考慮的下一個問題是,連接器應該有哪些子模塊?優秀的模塊化設計應該考慮高內聚、低耦合

  • 高內聚是指相關度比較高的功能要盡可能集中,不要分散。

  • 低耦合是指兩個相關的模塊要盡可能減少依賴的部分和降低依賴的程度,不要讓兩個模塊產生強依賴。

我們發現連接器需要完成 3 個高內聚的功能:

  • 網絡通信。

  • 應用層協議解析。

  • Tomcat Request/Response?與?ServletRequest/ServletResponse?的轉化。

因此 Tomcat 的設計者設計了 3 個組件來實現這 3 個功能,分別是?EndPoint、Processor 和 Adapter。

網絡通信的 I/O 模型是變化的, 應用層協議也是變化的,但是整體的處理邏輯是不變的,EndPoint?負責提供字節流給?Processor,Processor負責提供?Tomcat Request?對象給?Adapter,Adapter負責提供?ServletRequest對象給容器。

封裝變與不變

因此 Tomcat 設計了一系列抽象基類來封裝這些穩定的部分,抽象基類?AbstractProtocol實現了?ProtocolHandler接口。每一種應用層協議有自己的抽象基類,比如?AbstractAjpProtocol和?AbstractHttp11Protocol,具體協議的實現類擴展了協議層抽象基類。

這就是模板方法設計模式的運用。

應用層協議抽象

總結下來,連接器的三個核心組件?Endpoint、Processor和?Adapter來分別做三件事情,其中?Endpoint和?Processor放在一起抽象成了?ProtocolHandler組件,它們的關系如下圖所示。

連接器

ProtocolHandler 組件

主要處理?網絡連接?和?應用層協議?,包含了兩個重要部件 EndPoint 和 Processor,兩個組件組合形成 ProtocoHandler,下面我來詳細介紹它們的工作原理。

EndPoint

EndPoint是通信端點,即通信監聽的接口,是具體的 Socket 接收和發送處理器,是對傳輸層的抽象,因此?EndPoint是用來實現?TCP/IP?協議數據讀寫的,本質調用操作系統的 socket 接口。

EndPoint是一個接口,對應的抽象實現類是?AbstractEndpoint,而?AbstractEndpoint的具體子類,比如在?NioEndpoint和?Nio2Endpoint中,有兩個重要的子組件:Acceptor和?SocketProcessor。

其中 Acceptor 用于監聽 Socket 連接請求。SocketProcessor用于處理?Acceptor?接收到的?Socket請求,它實現?Runnable接口,在?Run方法里調用應用層協議處理組件?Processor?進行處理。為了提高處理能力,SocketProcessor被提交到線程池來執行。

我們知道,對于 Java 的多路復用器的使用,無非是兩步:

  • 創建一個 Seletor,在它身上注冊各種感興趣的事件,然后調用 select 方法,等待感興趣的事情發生。

  • 感興趣的事情發生了,比如可以讀了,這時便創建一個新的線程從 Channel 中讀數據。

  • 在 Tomcat 中?NioEndpoint?則是?AbstractEndpoint?的具體實現,里面組件雖然很多,但是處理邏輯還是前面兩步。它一共包含?LimitLatch、Acceptor、Poller、SocketProcessor和?Executor?共 5 個組件,分別分工合作實現整個 TCP/IP 協議的處理。

    • LimitLatch 是連接控制器,它負責控制最大連接數,NIO 模式下默認是 10000,達到這個閾值后,連接請求被拒絕。

    • Acceptor跑在一個單獨的線程里,它在一個死循環里調用?accept方法來接收新連接,一旦有新的連接請求到來,accept方法返回一個?Channel?對象,接著把?Channel對象交給 Poller 去處理。

    • Poller?的本質是一個?Selector,也跑在單獨線程里。Poller在內部維護一個?Channel數組,它在一個死循環里不斷檢測?Channel的數據就緒狀態,一旦有?Channel可讀,就生成一個?SocketProcessor任務對象扔給?Executor去處理。

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

    • Executor就是線程池,負責運行?SocketProcessor任務類,SocketProcessor?的?run方法會調用?Http11Processor?來讀取和解析請求數據。我們知道,Http11Processor是應用層協議的封裝,它會調用容器獲得響應,再把響應通過?Channel寫出。

    工作流程如下所示:

    NioEndPoint

    Processor

    Processor 用來實現 HTTP 協議,Processor 接收來自 EndPoint 的 Socket,讀取字節流解析成 Tomcat Request 和 Response 對象,并通過 Adapter 將其提交到容器處理,Processor 是對應用層協議的抽象。

    從圖中我們看到,EndPoint 接收到 Socket 連接后,生成一個 SocketProcessor 任務提交到線程池去處理,SocketProcessor 的 Run 方法會調用 HttpProcessor 組件去解析應用層協議,Processor 通過解析生成 Request 對象后,會調用 Adapter 的 Service 方法,方法內部通過 以下代碼將請求傳遞到容器中。

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

    Adapter 組件

    由于協議的不同,Tomcat 定義了自己的?Request?類來存放請求信息,這里其實體現了面向對象的思維。但是這個 Request 不是標準的?ServletRequest?,所以不能直接使用 Tomcat 定義 Request 作為參數直接容器。

    Tomcat 設計者的解決方案是引入?CoyoteAdapter,這是適配器模式的經典運用,連接器調用?CoyoteAdapter?的?Sevice?方法,傳入的是?Tomcat Request?對象,CoyoteAdapter負責將?Tomcat Request?轉成?ServletRequest,再調用容器的?Service方法。

    容器

    連接器負責外部交流,容器負責內部處理。具體來說就是,連接器處理 Socket 通信和應用層協議的解析,得到?Servlet請求;而容器則負責處理?Servlet請求。

    容器:顧名思義就是拿來裝東西的, 所以 Tomcat 容器就是拿來裝載?Servlet。

    Tomcat 設計了 4 種容器,分別是?Engine、Host、Context和?Wrapper。Server?代表 Tomcat 實例。

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

    容器

    你可能會問,為啥要設計這么多層次的容器,這不是增加復雜度么?其實這背后的考慮是,Tomcat 通過一種分層的架構,使得 Servlet 容器具有很好的靈活性。因為這里正好符合一個 Host 多個 Context, 一個 Context 也包含多個 Servlet,而每個組件都需要統一生命周期管理,所以組合模式設計這些容器

    Wrapper?表示一個?Servlet?,Context?表示一個 Web 應用程序,而一個 Web 程序可能有多個?Servlet?;Host?表示一個虛擬主機,或者說一個站點,一個 Tomcat 可以配置多個站點(Host);一個站點( Host) 可以部署多個 Web 應用;Engine?代表 引擎,用于管理多個站點(Host),一個 Service 只能有 一個?Engine。

    可通過 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應用的所有客戶端請求<Context></Context></Host></Engine></Service> </Server>

    如何管理這些容器?我們發現容器之間具有父子關系,形成一個樹形結構,是不是想到了設計模式中的?組合模式?。

    Tomcat 就是用組合模式來管理這些容器的。具體實現方法是,所有容器組件都實現了?Container接口,因此組合模式可以使得用戶對單容器對象和組合容器對象的使用具有一致性。這里單容器對象指的是最底層的?Wrapper,組合容器對象指的是上面的?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、addChild和?removeChild等方法,這里正好驗證了我們說的組合模式。我們還看到?Container接口拓展了?Lifecycle?,Tomcat 就是通過?Lifecycle?統一管理所有容器的組件的生命周期。通過組合模式管理所有容器,拓展?Lifecycle?實現對每個組件的生命周期管理 ,Lifecycle?主要包含的方法init()、start()、stop() 和 destroy()。

    請求定位 Servlet 的過程

    一個請求是如何定位到讓哪個?Wrapper?的?Servlet?處理的?答案是,Tomcat 是用 Mapper 組件來完成這個任務的。

    Mapper?組件的功能就是將用戶請求的?URL?定位到一個?Servlet,它的工作原理是:Mapper組件里保存了 Web 應用的配置信息,其實就是容器組件與訪問路徑的映射關系,比如?Host容器里配置的域名、Context容器里的?Web應用路徑,以及?Wrapper容器里?Servlet?映射的路徑,你可以想象這些配置信息就是一個多層次的?Map。

    當一個請求到來時,Mapper?組件通過解析請求 URL 里的域名和路徑,再到自己保存的 Map 里去查找,就能定位到一個?Servlet。請你注意,一個請求 URL 最后只會定位到一個?Wrapper容器,也就是一個?Servlet。

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

  • 首先根據協議和端口號確定 Service 和 Engine。Tomcat 默認的 HTTP 連接器監聽 8080 端口、默認的 AJP 連接器監聽 8009 端口。上面例子中的 URL 訪問的是 8080 端口,因此這個請求會被 HTTP 連接器接收,而一個連接器是屬于一個 Service 組件的,這樣 Service 組件就確定了。我們還知道一個 Service 組件里除了有多個連接器,還有一個容器組件,具體來說就是一個 Engine 容器,因此 Service 確定了也就意味著 Engine 也確定了。

  • 根據域名選定 Host。?Service 和 Engine 確定后,Mapper 組件通過 URL 中的域名去查找相應的 Host 容器,比如例子中的 URL 訪問的域名是user.shopping.com,因此 Mapper 會找到 Host2 這個容器。

  • 根據 URL 路徑找到 Context 組件。?Host 確定以后,Mapper 根據 URL 的路徑來匹配相應的 Web 應用的路徑,比如例子中訪問的是 /order,因此找到了 Context4 這個 Context 容器。

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

  • 連接器中的 Adapter 會調用容器的 Service 方法來執行 Servlet,最先拿到請求的是 Engine 容器,Engine 容器對請求做一些處理后,會把請求傳給自己子容器 Host 繼續處理,依次類推,最后這個請求會傳給 Wrapper 容器,Wrapper 會調用最終的 Servlet 來處理。那么這個調用過程具體是怎么實現的呢?答案是使用 Pipeline-Valve 管道。

    Pipeline-Valve?是責任鏈模式,責任鏈模式是指在一個請求處理的過程中有很多處理者依次對請求進行處理,每個處理者負責做自己相應的處理,處理完之后將再調用下一個處理者繼續處理,Valve 表示一個處理點(也就是一個處理閥門),因此?invoke方法就是來處理請求的。

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

    繼續看 Pipeline 接口

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

    Pipeline中有?addValve方法。Pipeline 中維護了?Valve鏈表,Valve可以插入到?Pipeline中,對請求做某些處理。我們還發現 Pipeline 中沒有 invoke 方法,因為整個調用鏈的觸發是 Valve 來完成的,Valve完成自己的處理后,調用?getNext.invoke()?來觸發下一個 Valve 調用。

    其實每個容器都有一個 Pipeline 對象,只要觸發了這個 Pipeline 的第一個 Valve,這個容器里?Pipeline中的 Valve 就都會被調用到。但是,不同容器的 Pipeline 是怎么鏈式觸發的呢,比如 Engine 中 Pipeline 需要調用下層容器 Host 中的 Pipeline。

    這是因為?Pipeline中還有個?getBasic方法。這個?BasicValve處于?Valve鏈表的末端,它是?Pipeline中必不可少的一個?Valve,負責調用下層容器的 Pipeline 里的第一個 Valve。

    整個過程分是通過連接器中的?CoyoteAdapter?觸發,它會調用 Engine 的第一個 Valve:

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

    Wrapper 容器的最后一個 Valve 會創建一個 Filter 鏈,并調用?doFilter()?方法,最終會調到?Servlet的?service方法。

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

    • Valve是?Tomcat的私有機制,與 Tomcat 的基礎架構?API是緊耦合的。Servlet API是公有的標準,所有的 Web 容器包括 Jetty 都支持 Filter 機制。

    • 另一個重要的區別是?Valve工作在 Web 容器級別,攔截所有應用的請求;而?Servlet Filter?工作在應用級別,只能攔截某個?Web?應用的所有請求。如果想做整個?Web容器的攔截器,必須通過?Valve來實現。

    Lifecycle 生命周期

    前面我們看到?Container容器 繼承了?Lifecycle?生命周期。如果想讓一個系統能夠對外提供服務,我們需要創建、組裝并啟動這些組件;在服務停止的時候,我們還需要釋放資源,銷毀這些組件,因此這是一個動態的過程。也就是說,Tomcat 需要動態地管理這些組件的生命周期。

    如何統一管理組件的創建、初始化、啟動、停止和銷毀?如何做到代碼邏輯清晰?如何方便地添加或者刪除組件?如何做到組件啟動和停止不遺漏、不重復?

    一鍵式啟停:LifeCycle 接口

    設計就是要找到系統的變化點和不變點。這里的不變點就是每個組件都要經歷創建、初始化、啟動這幾個過程,這些狀態以及狀態的轉化是不變的。而變化點是每個具體組件的初始化方法,也就是啟動方法是不一樣的。

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

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

    可擴展性:LifeCycle 事件

    我們再來考慮另一個問題,那就是系統的可擴展性。因為各個組件init()?和?start()?方法的具體實現是復雜多變的,比如在 Host 容器的啟動方法里需要掃描 webapps 目錄下的 Web 應用,創建相應的 Context 容器,如果將來需要增加新的邏輯,直接修改start()?方法?這樣會違反開閉原則,那如何解決這個問題呢?開閉原則說的是為了擴展系統的功能,你不能直接修改系統中已有的類,但是你可以定義新的類。

    組件的?init()?和?start()?調用是由它的父組件的狀態變化觸發的,上層組件的初始化會觸發子組件的初始化,上層組件的啟動會觸發子組件的啟動,因此我們把組件的生命周期定義成一個個狀態,把狀態的轉變看作是一個事件。而事件是有監聽器的,在監聽器里可以實現一些邏輯,并且監聽器也可以方便的添加和刪除,這就是典型的觀察者模式

    以下就是?Lyfecycle?接口的定義:

    Lyfecycle

    重用性:LifeCycleBase 抽象基類

    再次看到抽象模板設計模式。

    有了接口,我們就要用類去實現接口。一般來說實現類不止一個,不同的類在實現接口時往往會有一些相同的邏輯,如果讓各個子類都去實現一遍,就會有重復代碼。那子類如何重用這部分邏輯呢?其實就是定義一個基類來實現共同的邏輯,然后讓各個子類去繼承它,就達到了重用的目的。

    Tomcat 定義一個基類 LifeCycleBase 來實現 LifeCycle 接口,把一些公共的邏輯放到基類中去,比如生命狀態的轉變與維護、生命事件的觸發以及監聽器的添加和刪除等,而子類就負責實現自己的初始化、啟動和停止等方法。

    public?abstract?class?LifecycleBase?implements?Lifecycle{//?持有所有的觀察者private?final?List<LifecycleListener>?lifecycleListeners?=?new?CopyOnWriteArrayList<>();/***?發布事件**?@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);}}//?模板方法定義整個啟動流程,啟動所有容器@Overridepublic?final?synchronized?void?init()?throws?LifecycleException?{//1.?狀態檢查if?(!state.equals(LifecycleState.NEW))?{invalidTransition(Lifecycle.BEFORE_INIT_EVENT);}try?{//2.?觸發?INITIALIZING?事件的監聽器setStateInternal(LifecycleState.INITIALIZING,?null,?false);//?3.?調用具體子類的初始化方法initInternal();//?4.?觸發?INITIALIZED?事件的監聽器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 為了實現一鍵式啟停以及優雅的生命周期管理,并考慮到了可擴展性和可重用性,將面向對象思想和設計模式發揮到了極致,Containaer接口維護了容器的父子關系,Lifecycle?組合模式實現組件的生命周期維護,生命周期每個組件有變與不變的點,運用模板方法模式。分別運用了組合模式、觀察者模式、骨架抽象類和模板方法

    如果你需要維護一堆具有父子關系的實體,可以考慮使用組合模式。

    觀察者模式聽起來 “高大上”,其實就是當一個事件發生后,需要執行一連串更新操作。實現了低耦合、非侵入式的通知與更新機制。

    Container?繼承了 LifeCycle,StandardEngine、StandardHost、StandardContext 和 StandardWrapper 是相應容器組件的具體實現類,因為它們都是容器,所以繼承了 ContainerBase 抽象基類,而 ContainerBase 實現了 Container 接口,也繼承了 LifeCycleBase 類,它們的生命周期管理接口和功能接口是分開的,這也符合設計中接口分離的原則

    Tomcat 為何打破雙親委派機制

    雙親委派

    我們知道?JVM的類加載器加載 Class 的時候基于雙親委派機制,也就是會將加載交給自己的父加載器加載,如果 父加載器為空則查找Bootstrap?是否加載過,當無法加載的時候才讓自己加載。JDK 提供一個抽象類?ClassLoader,這個抽象類中定義了三個關鍵方法。對外使用loadClass(String name) 用于子類重寫打破雙親委派: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?是否已經被加載過Class<?>?c?=?findLoadedClass(name);//?如果沒有加載過if?(c?==?null)?{//?委托給父加載器去加載,遞歸調用if?(parent?!=?null)?{c?=?parent.loadClass(name,?false);}?else?{//?如果父加載器為空,查找?Bootstrap?是否加載過c?=?findBootstrapClassOrNull(name);}//?若果依然加載不到,則調用自己的?findClass?去加載if?(c?==?null)?{c?=?findClass(name);}}if?(resolve)?{resolveClass(c);}return?c;} } protected?Class<?>?findClass(String?name){//1.?根據傳入的類名?name,到在特定目錄下去尋找類文件,把.class?文件讀入內存...//2.?調用?defineClass?將字節數組轉成?Class?對象return?defineClass(buf, off, len); }//?將字節碼數組解析成一個?Class?對象,用?native?方法實現 protected?final?Class<?>?defineClass(byte[]?b,?int?off,?int?len){... }

    JDK 中有 3 個類加載器,另外你也可以自定義類加載器,它們的關系如下圖所示。

    類加載器

    ?

    • BootstrapClassLoader是啟動類加載器,由 C 語言實現,用來加載?JVM啟動時所需要的核心類,比如rt.jar、resources.jar等。

    • ExtClassLoader是擴展類加載器,用來加載\jre\lib\ext目錄下 JAR 包。

    • AppClassLoader是系統類加載器,用來加載?classpath下的類,應用程序默認用它來加載類。

    • 自定義類加載器,用來加載自定義路徑下的類。

    這些類加載器的工作原理是一樣的,區別是它們的加載路徑不同,也就是說?findClass這個方法查找的路徑不同。雙親委托機制是為了保證一個 Java 類在 JVM 中是唯一的,假如你不小心寫了一個與 JRE 核心類同名的類,比如?Object類,雙親委托機制能保證加載的是?JRE里的那個?Object類,而不是你寫的?Object類。這是因為?AppClassLoader在加載你的 Object 類時,會委托給?ExtClassLoader去加載,而?ExtClassLoader又會委托給?BootstrapClassLoader,BootstrapClassLoader發現自己已經加載過了?Object類,會直接返回,不會去加載你寫的?Object類。我們最多只能 獲取到?ExtClassLoader這里注意下。

    Tomcat 熱加載

    Tomcat 本質是通過一個后臺線程做周期性的任務,定期檢測類文件的變化,如果有變化就重新加載類。我們來看?ContainerBackgroundProcessor具體是如何實現的。

    protected?class?ContainerBackgroundProcessor?implements?Runnable?{@Overridepublic?void?run()?{//?請注意這里傳入的參數是?"?宿主類?"?的實例processChildren(ContainerBase.this);}protected?void?processChildren(Container?container)?{try?{//1. 調用當前容器的 backgroundProcess 方法。container.backgroundProcess();//2.?遍歷所有的子容器,遞歸調用?processChildren,//?這樣當前容器的子孫都會被處理Container[]?children?=?container.findChildren();for?(int?i?=?0;?i?<?children.length;?i++)?{//?這里請你注意,容器基類有個變量叫做 backgroundProcessorDelay,如果大于?0,表明子容器有自己的后臺線程,無需父容器來調用它的 processChildren 方法。if?(children[i].getBackgroundProcessorDelay()?<=?0)?{processChildren(children[i]);}}}?catch?(Throwable?t)?{?...?}

    Tomcat 的熱加載就是在 Context 容器實現,主要是調用了 Context 容器的 reload 方法。拋開細節從宏觀上看主要完成以下任務:

  • 停止和銷毀 Context 容器及其所有子容器,子容器其實就是 Wrapper,也就是說 Wrapper 里面 Servlet 實例也被銷毀了。

  • 停止和銷毀 Context 容器關聯的 Listener 和 Filter。

  • 停止和銷毀 Context 下的 Pipeline 和各種 Valve。

  • 停止和銷毀 Context 的類加載器,以及類加載器加載的類文件資源。

  • 啟動 Context 容器,在這個過程中會重新創建前面四步被銷毀的資源。

  • 在這個過程中,類加載器發揮著關鍵作用。一個 Context 容器對應一個類加載器,類加載器在銷毀的過程中會把它加載的所有類也全部銷毀。Context 容器在啟動過程中,會創建一個新的類加載器來加載新的類文件。

    Tomcat 的類加載器

    Tomcat 的自定義類加載器?WebAppClassLoader打破了雙親委托機制,它首先自己嘗試去加載某個類,如果找不到再代理給父類加載器,其目的是優先加載 Web 應用自己定義的類。具體實現就是重寫?ClassLoader的兩個方法:findClass和?loadClass。

    findClass 方法

    org.apache.catalina.loader.WebappClassLoaderBase#findClass;為了方便理解和閱讀,我去掉了一些細節:

    public?Class<?>?findClass(String?name)?throws?ClassNotFoundException?{...Class<?>?clazz?=?null;try?{//1.?先在?Web?應用目錄下查找類clazz?=?findClassInternal(name);}??catch?(RuntimeException?e)?{throw?e;}if?(clazz?==?null)?{try?{//2.?如果在本地目錄沒有找到,交給父加載器去查找clazz?=?super.findClass(name);}??catch?(RuntimeException?e)?{throw?e;}//3.?如果父類也沒找到,拋出?ClassNotFoundExceptionif?(clazz?==?null)?{throw?new?ClassNotFoundException(name);}return?clazz; }
  • 先在 Web 應用本地目錄下查找要加載的類。

  • 如果沒有找到,交給父加載器去查找,它的父加載器就是上面提到的系統類加載器?AppClassLoader。

  • 如何父加載器也沒找到這個類,拋出?ClassNotFound異常。

  • loadClass 方法

    再來看 Tomcat 類加載器的?loadClass方法的實現,同樣我也去掉了一些細節:

    public?Class<?>?loadClass(String?name,?boolean?resolve)?throws?ClassNotFoundException?{synchronized?(getClassLoadingLock(name))?{Class<?>?clazz?=?null;//1.?先在本地?cache?查找該類是否已經加載過clazz?=?findLoadedClass0(name);if?(clazz?!=?null)?{if?(resolve)resolveClass(clazz);return?clazz;}//2.?從系統類加載器的?cache?中查找是否加載過clazz?=?findLoadedClass(name);if?(clazz?!=?null)?{if?(resolve)resolveClass(clazz);return?clazz;}// 3. 嘗試用 ExtClassLoader 類加載器類加載,為什么?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.?嘗試用系統類加載器?(也就是?AppClassLoader)?來加載try?{clazz?=?Class.forName(name,?false,?parent);if?(clazz?!=?null)?{if?(resolve)resolveClass(clazz);return?clazz;}}?catch?(ClassNotFoundException?e)?{//?Ignore}}//6.?上述過程都加載失敗,拋出異常throw?new?ClassNotFoundException(name); }

    主要有六個步驟:

  • 先在本地 Cache 查找該類是否已經加載過,也就是說 Tomcat 的類加載器是否已經加載過這個類。

  • 如果 Tomcat 類加載器沒有加載過這個類,再看看系統類加載器是否加載過。

  • 如果都沒有,就讓ExtClassLoader去加載,這一步比較關鍵,目的?防止 Web 應用自己的類覆蓋 JRE 的核心類。因為 Tomcat 需要打破雙親委托機制,假如 Web 應用里自定義了一個叫 Object 的類,如果先加載這個 Object 類,就會覆蓋 JRE 里面的那個 Object 類,這就是為什么 Tomcat 的類加載器會優先嘗試用?ExtClassLoader去加載,因為?ExtClassLoader會委托給?BootstrapClassLoader去加載,BootstrapClassLoader發現自己已經加載了 Object 類,直接返回給 Tomcat 的類加載器,這樣 Tomcat 的類加載器就不會去加載 Web 應用下的 Object 類了,也就避免了覆蓋 JRE 核心類的問題。

  • 如果?ExtClassLoader加載器加載失敗,也就是說?JRE核心類中沒有這類,那么就在本地 Web 應用目錄下查找并加載。

  • 如果本地目錄下沒有這個類,說明不是 Web 應用自己定義的類,那么由系統類加載器去加載。這里請你注意,Web 應用是通過Class.forName調用交給系統類加載器的,因為Class.forName的默認加載器就是系統類加載器。

  • 如果上述加載過程全部失敗,拋出?ClassNotFound異常。

  • Tomcat 類加載器層次

    Tomcat 作為?Servlet容器,它負責加載我們的?Servlet類,此外它還負責加載?Servlet所依賴的 JAR 包。并且?Tomcat本身也是也是一個 Java 程序,因此它需要加載自己的類和依賴的 JAR 包。首先讓我們思考這一下這幾個問題:

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

  • 假如兩個 Web 應用都依賴同一個第三方的 JAR 包,比如?Spring,那?Spring的 JAR 包被加載到內存后,Tomcat要保證這兩個 Web 應用能夠共享,也就是說?Spring的 JAR 包只被加載一次,否則隨著依賴的第三方 JAR 包增多,JVM的內存會膨脹。

  • 跟 JVM 一樣,我們需要隔離 Tomcat 本身的類和 Web 應用的類。

  • 1. WebAppClassLoader

    Tomcat 的解決方案是自定義一個類加載器?WebAppClassLoader, 并且給每個 Web 應用創建一個類加載器實例。我們知道,Context 容器組件對應一個 Web 應用,因此,每個?Context容器負責創建和維護一個?WebAppClassLoader加載器實例。這背后的原理是,不同的加載器實例加載的類被認為是不同的類,即使它們的類名相同。這就相當于在 Java 虛擬機內部創建了一個個相互隔離的 Java 類空間,每一個 Web 應用都有自己的類空間,Web 應用之間通過各自的類加載器互相隔離。

    2.SharedClassLoader

    本質需求是兩個 Web 應用之間怎么共享庫類,并且不能重復加載相同的類。在雙親委托機制里,各個子加載器都可以通過父加載器去加載類,那么把需要共享的類放到父加載器的加載路徑下不就行了嗎。

    因此 Tomcat 的設計者又加了一個類加載器?SharedClassLoader,作為?WebAppClassLoader的父加載器,專門來加載 Web 應用之間共享的類。如果?WebAppClassLoader自己沒有加載到某個類,就會委托父加載器?SharedClassLoader去加載這個類,SharedClassLoader會在指定目錄下加載共享類,之后返回給?WebAppClassLoader,這樣共享的問題就解決了。

    3. CatalinaClassloader

    如何隔離 Tomcat 本身的類和 Web 應用的類?

    要共享可以通過父子關系,要隔離那就需要兄弟關系了。兄弟關系就是指兩個類加載器是平行的,它們可能擁有同一個父加載器,基于此 Tomcat 又設計一個類加載器?CatalinaClassloader,專門來加載 Tomcat 自身的類。

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

    老辦法,還是再增加一個?CommonClassLoader,作為?CatalinaClassloader和?SharedClassLoader的父加載器。CommonClassLoader能加載的類都可以被?CatalinaClassLoader和?SharedClassLoader使用

    整體架構設計解析收獲總結

    通過前面對 Tomcat 整體架構的學習,知道了 Tomcat 有哪些核心組件,組件之間的關系。以及 Tomcat 是怎么處理一個 HTTP 請求的。下面我們通過一張簡化的類圖來回顧一下,從圖上你可以看到各種組件的層次關系,圖中的虛線表示一個請求在 Tomcat 中流轉的過程。

    Tomcat 整體組件關系

    連接器

    Tomcat 的整體架構包含了兩個核心組件連接器和容器。連接器負責對外交流,容器負責內部處理。連接器用?ProtocolHandler接口來封裝通信協議和?I/O模型的差異,ProtocolHandler內部又分為?EndPoint和?Processor模塊,EndPoint負責底層?Socket通信,Proccesor負責應用層協議解析。連接器通過適配器?Adapter調用容器。

    對 Tomcat 整體架構的學習,我們可以得到一些設計復雜系統的基本思路。首先要分析需求,根據高內聚低耦合的原則確定子模塊,然后找出子模塊中的變化點和不變點,用接口和抽象基類去封裝不變點,在抽象基類中定義模板方法,讓子類自行實現抽象方法,也就是具體子類去實現變化點。

    容器

    運用了組合模式 管理容器、通過 觀察者模式 發布啟動事件達到解耦、開閉原則。骨架抽象類和模板方法抽象變與不變,變化的交給子類實現,從而實現代碼復用,以及靈活的拓展。使用責任鏈的方式處理請求,比如記錄日志等。

    類加載器

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

    如何閱讀源碼持續學習

    學習是一個反人類的過程,是比較痛苦的。尤其學習我們常用的優秀技術框架本身比較龐大,設計比較復雜,在學習初期很容易遇到 “挫折感”,debug 跳來跳去陷入恐怖細節之中無法自拔,往往就會放棄。

    找到適合自己的學習方法非常重要,同樣關鍵的是要保持學習的興趣和動力,并且得到學習反饋效果

    學習優秀源碼,我們收獲的就是架構設計能力,遇到復雜需求我們學習到可以利用合理模式與組件抽象設計了可拓展性強的代碼能力。

    如何閱讀

    比如我最初在學習 Spring 框架的時候,一開始就鉆進某個模塊啃起來。然而由于 Spring 太龐大,模塊之間也有聯系,根本不明白為啥要這么寫,只覺得為啥設計這么 “繞”。

    錯誤方式

    • 陷入細節,不看全局:我還沒弄清楚森林長啥樣,就盯著葉子看?,看不到全貌和整體設計思路。所以閱讀源碼學習的時候不要一開始就進入細節,而是宏觀看待整體架構設計思想,模塊之間的關系。

    • 還沒學會用就研究如何設計:首先基本上框架都運用了設計模式,我們最起碼也要了解常用的設計模式,即使是“背”,也得了然于胸。在學習一門技術,我推薦先看官方文檔,看看有哪些模塊、整體設計思想。然后下載示例跑一遍,最后才是看源碼。

    • 看源碼深究細節:到了看具體某個模塊源碼的時候也要下意識的不要去深入細節,重要的是學習設計思路,而不是具體一個方法實現邏輯。除非自己要基于源碼做二次開發。

    正確方式

    • 定焦原則:抓主線(抓住一個核心流程去分析,不要漫無目的的到處閱讀)。

    • 宏觀思維:從全局的視角去看待,上帝視角理出主要核心架構設計,先森林后樹葉。切勿不要試圖去搞明白每一行代碼。

    • 斷點:合理運用調用棧(觀察調用過程上下文)。

    帶著目標去學

    比如某些知識點是面試的熱點,那學習目標就是徹底理解和掌握它,當被問到相關問題時,你的回答能夠使得面試官對你刮目相看,有時候往往憑著某一個亮點就能影響最后的錄用結果。

    又或者接到一個稍微復雜的需求,學習從優秀源碼中借鑒設計思路與優化技巧。

    最后就是動手實踐,將所學運用在工作項目中。只有動手實踐才會讓我們對技術有最直觀的感受。有時候我們聽別人講經驗和理論,感覺似乎懂了,但是過一段時間便又忘記了。

    實際場景運用

    簡單的分析了 Tomcat 整體架構設計,從 【連接器】 到 【容器】,并且分別細說了一些組件的設計思想以及設計模式。接下來就是如何學以致用,借鑒優雅的設計運用到實際工作開發中。學習,從模仿開始。

    責任鏈模式

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

    這里就像一個請求,會被多個模塊去處理。所以每個查詢模塊我們可以抽象為?處理閥門,使用一個 List 將這些 閥門保存起來,這樣新增模塊我們只需要新增一個閥門即可,實現了開閉原則同時將一堆查驗的代碼解耦到不同的具體閥門中,使用抽象類提取 “不變的”功能。

    具體示例代碼如下所示:

    首先抽象我們的處理閥門,?NetCheckDTO是請求信息

    /***?責任鏈模式:處理每個模塊閥門*/ public?interface?Valve?{/***?調用*?@param?netCheckDTO*/void?invoke(NetCheckDTO?netCheckDTO); }

    定義抽象基類,復用代碼。

    public?abstract?class?AbstractCheckValve?implements?Valve?{public?final?AnalysisReportLogDO?getLatestHistoryData(NetCheckDTO?netCheckDTO,?NetCheckDataTypeEnum?checkDataTypeEnum){//?獲取歷史記錄,省略代碼邏輯}//?獲取查驗數據源配置public?final?String?getModuleSource(String?querySource,?ModuleEnum?moduleEnum){//?省略代碼邏輯} }

    定義具體每個模塊處理的業務邏輯,比如 【百度負面新聞】對應的處理

    @Slf4j @Service public?class?BaiduNegativeValve?extends?AbstractCheckValve?{@Overridepublic?void?invoke(NetCheckDTO?netCheckDTO)?{} }

    最后就是管理用戶選擇要查驗的模塊,我們通過 List 保存。用于觸發所需要的查驗模塊

    @Slf4j @Service public?class?NetCheckService?{//?注入所有的閥門@Autowiredprivate?Map<String,?Valve>?valveMap;/***?發送查驗請求**?@param?netCheckDTO*/@Async("asyncExecutor")public?void?sendCheckRequest(NetCheckDTO?netCheckDTO)?{//?用于保存客戶選擇處理的模塊閥門List<Valve>?valves?=?new?ArrayList<>();CheckModuleConfigDTO?checkModuleConfig?=?netCheckDTO.getCheckModuleConfig();//?將用戶選擇查驗的模塊添加到?閥門鏈條中if?(checkModuleConfig.getBaiduNegative())?{valves.add(valveMap.get("baiduNegativeValve"));}//?省略部分代碼.......if?(CollectionUtils.isEmpty(valves))?{log.info("網查查驗模塊為空,沒有需要查驗的任務");return;}//?觸發處理valves.forEach(valve?->?valve.invoke(netCheckDTO));} }

    模板方法模式

    需求是這樣的,可根據客戶錄入的財報 excel 數據或者企業名稱執行財報分析。

    對于非上市的則解析 excel -> 校驗數據是否合法->執行計算。

    上市企業:判斷名稱是否存在 ,不存在則發送郵件并中止計算-> 從數據庫拉取財報數據,初始化查驗日志、生成一條報告記錄,觸發計算-> 根據失敗與成功修改任務狀態 。

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

    • 不變的是整個流程是初始化查驗日志、初始化一條報告前期校驗數據(若是上市公司校驗不通過還需要構建郵件數據并發送)、從不同來源拉取財報數據并且適配通用數據、然后觸發計算,任務異常與成功都需要修改狀態。

    • 變化的是上市與非上市校驗規則不一樣,獲取財報數據方式不一樣,兩種方式的財報數據需要適配

    整個算法流程是固定的模板,但是需要將算法內部變化的部分具體實現延遲到不同子類實現,這正是模板方法模式的最佳場景。

    public?abstract?class?AbstractAnalysisTemplate?{/***?提交財報分析模板方法,定義骨架流程*?@param?reportAnalysisRequest*?@return*/public?final?FinancialAnalysisResultDTO?doProcess(FinancialReportAnalysisRequest?reportAnalysisRequest)?{FinancialAnalysisResultDTO?analysisDTO?=?new?FinancialAnalysisResultDTO();//?抽象方法:提交查驗的合法校驗boolean?prepareValidate?=?prepareValidate(reportAnalysisRequest,?analysisDTO);log.info("prepareValidate?校驗結果?=?{}?",?prepareValidate);if?(!prepareValidate)?{//?抽象方法:構建通知郵件所需要的數據buildEmailData(analysisDTO);log.info("構建郵件信息,data?=?{}",?JSON.toJSONString(analysisDTO));return?analysisDTO;}String?reportNo?=?FINANCIAL_REPORT_NO_PREFIX?+?reportAnalysisRequest.getUserId()?+?SerialNumGenerator.getFixLenthSerialNumber();//?生成分析日志initFinancialAnalysisLog(reportAnalysisRequest,?reportNo);//?生成分析記錄initAnalysisReport(reportAnalysisRequest,?reportNo);try?{//?抽象方法:拉取財報數據,不同子類實現FinancialDataDTO?financialData?=?pullFinancialData(reportAnalysisRequest);log.info("拉取財報數據完成, 準備執行計算");//?測算指標financialCalcContext.calc(reportAnalysisRequest,?financialData,?reportNo);//?設置分析日志為成功successCalc(reportNo);}?catch?(Exception?e)?{log.error("財報計算子任務出現異常",?e);//?設置分析日志失敗failCalc(reportNo);throw?e;}return?analysisDTO;} }

    最后新建兩個子類繼承該模板,并實現抽象方法。這樣就將上市與非上市兩種類型的處理邏輯解耦,同時又復用了代碼。

    策略模式

    需求是這樣,要做一個萬能識別銀行流水的 excel 接口,假設標準流水包含【交易時間、收入、支出、交易余額、付款人賬號、付款人名字、收款人名稱、收款人賬號】等字段。現在我們解析出來每個必要字段所在 excel 表頭的下標。但是流水有多種情況:

  • 一種就是包含所有標準字段。

  • 收入、支出下標是同一列,通過正負來區分收入與支出。

  • 收入與支出是同一列,有一個交易類型的字段來區分。

  • 特殊銀行的特殊處理。

  • 也就是我們要根據解析對應的下標找到對應的處理邏輯算法,我們可能在一個方法里面寫超多?if else?的代碼,整個流水處理都偶合在一起,假如未來再來一種新的流水類型,還要繼續改老代碼。最后可能出現 “又臭又長,難以維護” 的代碼復雜度。

    這個時候我們可以用到策略模式將不同模板的流水使用不同的處理器處理,根據模板找到對應的策略算法去處理。即使未來再加一種類型,我們只要新加一種處理器即可,高內聚低耦合,且可拓展。

    定義處理器接口,不同處理器去實現處理邏輯。將所有的處理器注入到?BankFlowDataHandler?的data_processor_map中,根據不同的場景取出對已經的處理器處理流水。

    public?interface?DataProcessor?{/***?處理流水數據*?@param?bankFlowTemplateDO?流水下標數據*?@param?row*?@return*/BankTransactionFlowDO?doProcess(BankFlowTemplateDO?bankFlowTemplateDO,?List<String>?row);/***?是否支持處理該模板,不同類型的流水策略根據模板數據判斷是否支持解析*?@return*/boolean?isSupport(BankFlowTemplateDO?bankFlowTemplateDO); }//?處理器的上下文 @Service @Slf4j public?class?BankFlowDataContext?{//?將所有處理器注入到?map?中@Autowiredprivate?List<DataProcessor>?processors;//?找對對應的處理器處理流水public?void?process()?{DataProcessor?processor?=?getProcessor(bankFlowTemplateDO);for(DataProcessor processor :processors)?{if?(processor.isSupport(bankFlowTemplateDO))?{//?row?就是一行流水數據processor.doProcess(bankFlowTemplateDO,?row);break;}}}}

    定義默認處理器,處理正常模板,新增模板只要新增處理器實現?DataProcessor即可。

    /***?默認處理器:正對規范流水模板**/ @Component("defaultDataProcessor") @Slf4j public?class?DefaultDataProcessor?implements?DataProcessor?{@Overridepublic?BankTransactionFlowDO?doProcess(BankFlowTemplateDO?bankFlowTemplateDO)?{//?省略處理邏輯細節return?bankTransactionFlowDO;}@Overridepublic?String?strategy(BankFlowTemplateDO?bankFlowTemplateDO)?{//?省略判斷是否支持解析該流水boolean?isDefault?=?true;return?isDefault;} }

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

    總結

    以上是生活随笔為你收集整理的Tomcat 架构原理到架构设计,写得非常好!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲爆乳精品无码一区二区三区 | 中文字幕 人妻熟女 | 久青草影院在线观看国产 | 久久婷婷五月综合色国产香蕉 | 亚洲精品一区二区三区在线观看 | 欧美日本免费一区二区三区 | 成人无码精品1区2区3区免费看 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲熟熟妇xxxx | 人人妻人人澡人人爽欧美一区 | 日本xxxx色视频在线观看免费 | 国产成人无码区免费内射一片色欲 | 任你躁国产自任一区二区三区 | 大地资源中文第3页 | 亚洲国产欧美日韩精品一区二区三区 | 国产av久久久久精东av | 久久天天躁狠狠躁夜夜免费观看 | 久久精品一区二区三区四区 | 国产成人一区二区三区在线观看 | 国产肉丝袜在线观看 | 国产无遮挡吃胸膜奶免费看 | 国产午夜精品一区二区三区嫩草 | 精品乱子伦一区二区三区 | 一本色道久久综合亚洲精品不卡 | 国产乱人伦av在线无码 | 在线亚洲高清揄拍自拍一品区 | 亚洲一区二区三区香蕉 | 台湾无码一区二区 | 国产午夜视频在线观看 | 蜜臀av在线播放 久久综合激激的五月天 | 奇米影视888欧美在线观看 | 永久免费观看国产裸体美女 | 少妇被黑人到高潮喷出白浆 | 99久久精品国产一区二区蜜芽 | 无码中文字幕色专区 | 国产熟女一区二区三区四区五区 | 九月婷婷人人澡人人添人人爽 | 男人扒开女人内裤强吻桶进去 | 狠狠躁日日躁夜夜躁2020 | 欧美自拍另类欧美综合图片区 | 1000部夫妻午夜免费 | 久久久久久久女国产乱让韩 | 国内少妇偷人精品视频免费 | 麻豆精品国产精华精华液好用吗 | 色综合久久久久综合一本到桃花网 | 国产精品人人妻人人爽 | 丰满诱人的人妻3 | 亚洲成a人一区二区三区 | 国产精品人妻一区二区三区四 | 无码人妻av免费一区二区三区 | 欧美zoozzooz性欧美 | 无码一区二区三区在线 | 玩弄少妇高潮ⅹxxxyw | 伊人久久大香线焦av综合影院 | 日韩亚洲欧美精品综合 | 鲁一鲁av2019在线 | 欧美人与动性行为视频 | 国产亲子乱弄免费视频 | 内射后入在线观看一区 | 一本色道久久综合狠狠躁 | 久热国产vs视频在线观看 | 成人影院yy111111在线观看 | 中文字幕无码热在线视频 | 国产人妻人伦精品1国产丝袜 | 中文字幕精品av一区二区五区 | 亚洲中文字幕无码中文字在线 | 成人精品一区二区三区中文字幕 | 国产口爆吞精在线视频 | 国产色精品久久人妻 | 中文无码成人免费视频在线观看 | 国产真实夫妇视频 | 国内精品一区二区三区不卡 | 欧美激情综合亚洲一二区 | 国产成人无码午夜视频在线观看 | 波多野结衣高清一区二区三区 | 亚洲の无码国产の无码步美 | 欧美丰满老熟妇xxxxx性 | 2020最新国产自产精品 | 天天躁夜夜躁狠狠是什么心态 | 亚洲s色大片在线观看 | 国产人妻久久精品二区三区老狼 | 无码一区二区三区在线观看 | 国产猛烈高潮尖叫视频免费 | 国产午夜亚洲精品不卡 | 亚洲国产日韩a在线播放 | 国内揄拍国内精品少妇国语 | 牲欲强的熟妇农村老妇女 | 真人与拘做受免费视频 | 精品人妻人人做人人爽夜夜爽 | 国产香蕉尹人视频在线 | 色噜噜亚洲男人的天堂 | 无码一区二区三区在线观看 | 国产精品99久久精品爆乳 | 色老头在线一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 性色欲网站人妻丰满中文久久不卡 | 久久午夜无码鲁丝片午夜精品 | 欧美 日韩 亚洲 在线 | 国产热a欧美热a在线视频 | 无码精品人妻一区二区三区av | 秋霞成人午夜鲁丝一区二区三区 | 人妻夜夜爽天天爽三区 | 2019午夜福利不卡片在线 | 国产欧美精品一区二区三区 | 又色又爽又黄的美女裸体网站 | 久久久久成人精品免费播放动漫 | 亚洲精品中文字幕 | 男女下面进入的视频免费午夜 | 中文字幕乱码中文乱码51精品 | 亲嘴扒胸摸屁股激烈网站 | 熟妇女人妻丰满少妇中文字幕 | 日韩少妇白浆无码系列 | 一本久道高清无码视频 | 国产九九九九九九九a片 | 久久久中文字幕日本无吗 | 欧美第一黄网免费网站 | 亚洲色偷偷偷综合网 | 2020久久香蕉国产线看观看 | 国产人妻久久精品二区三区老狼 | 未满小14洗澡无码视频网站 | 熟妇激情内射com | 国产在线aaa片一区二区99 | www国产精品内射老师 | 亚洲a无码综合a国产av中文 | 久久这里只有精品视频9 | 久久久久国色av免费观看性色 | 亚洲精品国产精品乱码不卡 | 国产97在线 | 亚洲 | 天堂а√在线中文在线 | 色综合久久中文娱乐网 | 人妻aⅴ无码一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 在线观看国产一区二区三区 | 国产精品理论片在线观看 | 成人三级无码视频在线观看 | 免费视频欧美无人区码 | 疯狂三人交性欧美 | 福利一区二区三区视频在线观看 | 人妻有码中文字幕在线 | 女人和拘做爰正片视频 | 色妞www精品免费视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产午夜亚洲精品不卡下载 | 久久久精品国产sm最大网站 | 国产亚洲精品久久久闺蜜 | 玩弄少妇高潮ⅹxxxyw | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲熟妇色xxxxx欧美老妇y | 国产精品美女久久久网av | 成人精品视频一区二区三区尤物 | www一区二区www免费 | 丰满少妇弄高潮了www | 亚洲成色www久久网站 | 亚洲色在线无码国产精品不卡 | 国产在线精品一区二区高清不卡 | 亚洲午夜久久久影院 | 国产乱码精品一品二品 | 欧美日韩精品 | 99国产精品白浆在线观看免费 | 成人无码精品一区二区三区 | 青青青手机频在线观看 | 免费观看黄网站 | 无码一区二区三区在线 | 亚洲精品国产精品乱码视色 | 噜噜噜亚洲色成人网站 | 亚洲男女内射在线播放 | 性色欲情网站iwww九文堂 | 夜夜躁日日躁狠狠久久av | 国产精品高潮呻吟av久久 | 67194成是人免费无码 | 国产精品理论片在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 精品水蜜桃久久久久久久 | 久久无码专区国产精品s | 国产黄在线观看免费观看不卡 | 国产香蕉尹人视频在线 | 国产香蕉97碰碰久久人人 | 鲁鲁鲁爽爽爽在线视频观看 | 免费无码的av片在线观看 | 成人av无码一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 狠狠色丁香久久婷婷综合五月 | 国产女主播喷水视频在线观看 | 亚洲精品综合五月久久小说 | 性色av无码免费一区二区三区 | 蜜桃无码一区二区三区 | 98国产精品综合一区二区三区 | av人摸人人人澡人人超碰下载 | 欧美35页视频在线观看 | 日韩精品成人一区二区三区 | 久久精品成人欧美大片 | 精品国产青草久久久久福利 | 久久天天躁夜夜躁狠狠 | 成人无码精品1区2区3区免费看 | 亚洲 a v无 码免 费 成 人 a v | 人人澡人人妻人人爽人人蜜桃 | 乌克兰少妇性做爰 | 国产三级精品三级男人的天堂 | 色欲综合久久中文字幕网 | 麻豆精品国产精华精华液好用吗 | 亚洲 另类 在线 欧美 制服 | 成 人 网 站国产免费观看 | 欧美黑人巨大xxxxx | 麻豆md0077饥渴少妇 | 人人爽人人澡人人高潮 | 中文字幕精品av一区二区五区 | 在线观看国产一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 日本大香伊一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 无码人妻丰满熟妇区五十路百度 | 99久久精品国产一区二区蜜芽 | 55夜色66夜色国产精品视频 | 97久久国产亚洲精品超碰热 | 成年美女黄网站色大免费视频 | 国内精品久久久久久中文字幕 | 久久人妻内射无码一区三区 | 麻豆蜜桃av蜜臀av色欲av | 成人片黄网站色大片免费观看 | 激情内射亚州一区二区三区爱妻 | 无码午夜成人1000部免费视频 | 久久综合香蕉国产蜜臀av | 欧美大屁股xxxxhd黑色 | 99精品无人区乱码1区2区3区 | 成人av无码一区二区三区 | 久久久久成人精品免费播放动漫 | 麻豆国产97在线 | 欧洲 | 国产高清不卡无码视频 | 婷婷五月综合缴情在线视频 | 欧美丰满熟妇xxxx性ppx人交 | 欧美日韩人成综合在线播放 | 动漫av一区二区在线观看 | 夜夜躁日日躁狠狠久久av | 少女韩国电视剧在线观看完整 | 亚洲日韩av一区二区三区中文 | 免费网站看v片在线18禁无码 | 妺妺窝人体色www在线小说 | 国产午夜手机精彩视频 | 色综合视频一区二区三区 | 久久精品中文字幕大胸 | 日本xxxx色视频在线观看免费 | 西西人体www44rt大胆高清 | 国产午夜福利亚洲第一 | 国产精品18久久久久久麻辣 | 内射爽无广熟女亚洲 | 亚洲色偷偷男人的天堂 | 亚洲无人区午夜福利码高清完整版 | 东京热一精品无码av | 精品国产一区二区三区四区在线看 | 麻豆国产人妻欲求不满谁演的 | av人摸人人人澡人人超碰下载 | 无码国产乱人伦偷精品视频 | 国内老熟妇对白xxxxhd | 国产av人人夜夜澡人人爽麻豆 | 国产av人人夜夜澡人人爽麻豆 | 日本丰满护士爆乳xxxx | 国产精品久久久 | 午夜时刻免费入口 | 少妇邻居内射在线 | 亚洲の无码国产の无码步美 | 成熟女人特级毛片www免费 | 荫蒂被男人添的好舒服爽免费视频 | 中文无码成人免费视频在线观看 | 日日夜夜撸啊撸 | 高清国产亚洲精品自在久久 | 久久 国产 尿 小便 嘘嘘 | 国产后入清纯学生妹 | 又色又爽又黄的美女裸体网站 | 自拍偷自拍亚洲精品10p | 好屌草这里只有精品 | 动漫av网站免费观看 | 亚洲日韩一区二区 | 亚洲区小说区激情区图片区 | 天堂久久天堂av色综合 | 老太婆性杂交欧美肥老太 | 久久精品国产亚洲精品 | 国产亚洲人成a在线v网站 | 7777奇米四色成人眼影 | 中文字幕无码热在线视频 | 久久久无码中文字幕久... | 亚洲乱码日产精品bd | 大地资源中文第3页 | 无码人妻久久一区二区三区不卡 | 草草网站影院白丝内射 | 亚洲 日韩 欧美 成人 在线观看 | 在线播放免费人成毛片乱码 | 4hu四虎永久在线观看 | 国产av久久久久精东av | 欧洲熟妇精品视频 | 精品无码av一区二区三区 | 亚洲综合精品香蕉久久网 | 青青草原综合久久大伊人精品 | 久久天天躁夜夜躁狠狠 | 无码av岛国片在线播放 | 日本一本二本三区免费 | 国产香蕉尹人综合在线观看 | 国产精品a成v人在线播放 | 亚洲综合久久一区二区 | 久久精品国产精品国产精品污 | 亚洲狠狠色丁香婷婷综合 | 蜜桃视频插满18在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲精品午夜国产va久久成人 | 久久久成人毛片无码 | 久久国产自偷自偷免费一区调 | 国内精品一区二区三区不卡 | 最新国产乱人伦偷精品免费网站 | 亚洲精品一区二区三区四区五区 | 久久熟妇人妻午夜寂寞影院 | 台湾无码一区二区 | 国产后入清纯学生妹 | 亚洲国产av精品一区二区蜜芽 | 人人爽人人澡人人人妻 | 亚洲伊人久久精品影院 | 无码人妻出轨黑人中文字幕 | 国产亲子乱弄免费视频 | 国产精品久久国产精品99 | 国产极品美女高潮无套在线观看 | 国产精品久免费的黄网站 | 中文字幕乱码亚洲无线三区 | 国产成人无码区免费内射一片色欲 | 无码人妻黑人中文字幕 | 中文字幕久久久久人妻 | 欧美人与物videos另类 | 亚洲爆乳精品无码一区二区三区 | 中文字幕久久久久人妻 | 久久久国产一区二区三区 | 久久精品中文闷骚内射 | 欧美激情内射喷水高潮 | 亚洲乱亚洲乱妇50p | 无码av最新清无码专区吞精 | 学生妹亚洲一区二区 | 欧美zoozzooz性欧美 | 亚洲成a人片在线观看无码 | 精品久久久中文字幕人妻 | 日韩欧美群交p片內射中文 | 人妻与老人中文字幕 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品18久久久久久麻辣 | 国产69精品久久久久app下载 | 东京一本一道一二三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 成熟女人特级毛片www免费 | 少妇人妻偷人精品无码视频 | 国内老熟妇对白xxxxhd | 欧美阿v高清资源不卡在线播放 | www国产亚洲精品久久久日本 | 国产精品无码久久av | 国产精品久久久久久亚洲影视内衣 | 天天拍夜夜添久久精品大 | 国内精品一区二区三区不卡 | 秋霞成人午夜鲁丝一区二区三区 | 国产内射爽爽大片视频社区在线 | 国产精品美女久久久 | 国产精品对白交换视频 | 久久精品国产99久久6动漫 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲一区二区三区偷拍女厕 | 无码国产色欲xxxxx视频 | 国产精品视频免费播放 | 久久人人爽人人人人片 | 又粗又大又硬又长又爽 | 天干天干啦夜天干天2017 | 久久视频在线观看精品 | 国产亚洲日韩欧美另类第八页 | 久久国产36精品色熟妇 | 亚洲欧美综合区丁香五月小说 | 狠狠色欧美亚洲狠狠色www | 欧美 日韩 人妻 高清 中文 | 荫蒂被男人添的好舒服爽免费视频 | 欧美猛少妇色xxxxx | 久久久中文字幕日本无吗 | 亚洲国产精品美女久久久久 | 图片区 小说区 区 亚洲五月 | 性色欲网站人妻丰满中文久久不卡 | 97久久超碰中文字幕 | 久久久久亚洲精品中文字幕 | 福利一区二区三区视频在线观看 | 亚洲国产精品久久人人爱 | 欧美激情综合亚洲一二区 | 精品偷自拍另类在线观看 | 巨爆乳无码视频在线观看 | 日本爽爽爽爽爽爽在线观看免 | 色窝窝无码一区二区三区色欲 | 久久精品国产一区二区三区 | 精品乱子伦一区二区三区 | 国産精品久久久久久久 | 午夜精品一区二区三区在线观看 | 成 人影片 免费观看 | 亚洲一区av无码专区在线观看 | 国产人妻人伦精品1国产丝袜 | 国产一区二区三区精品视频 | 国产乱子伦视频在线播放 | 国产亚洲人成a在线v网站 | 国产午夜视频在线观看 | 超碰97人人做人人爱少妇 | 亚洲无人区一区二区三区 | 一区二区传媒有限公司 | 国产精品福利视频导航 | 一二三四在线观看免费视频 | 亚洲精品久久久久中文第一幕 | 97人妻精品一区二区三区 | 99久久久无码国产aaa精品 | 国产免费久久精品国产传媒 | 人人澡人人透人人爽 | 国产午夜福利100集发布 | 欧美人与禽zoz0性伦交 | 久久久精品人妻久久影视 | 无码一区二区三区在线 | 老太婆性杂交欧美肥老太 | 欧美 丝袜 自拍 制服 另类 | 无码吃奶揉捏奶头高潮视频 | 亚洲区欧美区综合区自拍区 | 国产精品久久久午夜夜伦鲁鲁 | 蜜桃av抽搐高潮一区二区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 日本爽爽爽爽爽爽在线观看免 | 亚洲啪av永久无码精品放毛片 | 好爽又高潮了毛片免费下载 | 欧美激情综合亚洲一二区 | 国产女主播喷水视频在线观看 | 国产亚洲欧美在线专区 | 亚洲国产精品无码久久久久高潮 | 国产无遮挡又黄又爽免费视频 | 亚洲国产精品无码一区二区三区 | 久久国产36精品色熟妇 | 国产精品久久精品三级 | 丰满人妻精品国产99aⅴ | 日本va欧美va欧美va精品 | 国产欧美亚洲精品a | 激情国产av做激情国产爱 | 在线播放亚洲第一字幕 | 国产特级毛片aaaaaaa高清 | yw尤物av无码国产在线观看 | 国产农村妇女高潮大叫 | 小sao货水好多真紧h无码视频 | 欧美性生交xxxxx久久久 | www国产亚洲精品久久久日本 | 日本欧美一区二区三区乱码 | 精品国产国产综合精品 | 97久久精品无码一区二区 | 少妇人妻偷人精品无码视频 | 国产一区二区三区四区五区加勒比 | 欧美一区二区三区视频在线观看 | 国产肉丝袜在线观看 | 小sao货水好多真紧h无码视频 | 激情内射日本一区二区三区 | 免费看男女做好爽好硬视频 | 国产人妖乱国产精品人妖 | 成人欧美一区二区三区 | 在线a亚洲视频播放在线观看 | 色婷婷香蕉在线一区二区 | 欧美精品无码一区二区三区 | 永久免费精品精品永久-夜色 | 人妻与老人中文字幕 | 强辱丰满人妻hd中文字幕 | 呦交小u女精品视频 | 中文字幕无码免费久久9一区9 | 色综合久久88色综合天天 | 在线看片无码永久免费视频 | 精品久久综合1区2区3区激情 | 中文字幕乱码亚洲无线三区 | 精品水蜜桃久久久久久久 | 国产综合久久久久鬼色 | 国产成人无码一二三区视频 | 日本一卡二卡不卡视频查询 | 中文字幕日产无线码一区 | 乱中年女人伦av三区 | 久久精品国产大片免费观看 | 国产一区二区不卡老阿姨 | 无码国产激情在线观看 | 性啪啪chinese东北女人 | 国产精品视频免费播放 | 久久久精品456亚洲影院 | 国产激情精品一区二区三区 | 色一情一乱一伦 | 无套内谢的新婚少妇国语播放 | 久热国产vs视频在线观看 | 蜜桃臀无码内射一区二区三区 | 中文精品久久久久人妻不卡 | 伊人久久大香线焦av综合影院 | 大肉大捧一进一出好爽视频 | 动漫av一区二区在线观看 | 久久久中文久久久无码 | 亚洲精品成人av在线 | 中国女人内谢69xxxx | 国产欧美熟妇另类久久久 | 久久国产精品二国产精品 | 日韩欧美中文字幕在线三区 | 久久综合九色综合97网 | 亚洲国产精品一区二区美利坚 | 乌克兰少妇xxxx做受 | 中文字幕av无码一区二区三区电影 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲狠狠婷婷综合久久 | 午夜理论片yy44880影院 | 亚洲精品综合一区二区三区在线 | 午夜成人1000部免费视频 | 人妻少妇精品无码专区二区 | 亚洲国产成人a精品不卡在线 | 日本护士xxxxhd少妇 | 18禁黄网站男男禁片免费观看 | 亚洲成熟女人毛毛耸耸多 | av在线亚洲欧洲日产一区二区 | 中文字幕精品av一区二区五区 | 99久久精品午夜一区二区 | 精品久久久久久人妻无码中文字幕 | 日日碰狠狠躁久久躁蜜桃 | 久久国产精品二国产精品 | 久久国产精品精品国产色婷婷 | 撕开奶罩揉吮奶头视频 | 欧美大屁股xxxxhd黑色 | 西西人体www44rt大胆高清 | 日本精品久久久久中文字幕 | 99久久久国产精品无码免费 | 中文字幕无线码免费人妻 | 人人妻人人澡人人爽人人精品浪潮 | 无码国内精品人妻少妇 | 亚洲精品一区二区三区四区五区 | 欧美成人家庭影院 | 欧美xxxxx精品 | 国产成人无码一二三区视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲色欲色欲欲www在线 | 在线а√天堂中文官网 | 大地资源中文第3页 | 亚洲一区二区三区无码久久 | 国内揄拍国内精品人妻 | 日韩人妻无码一区二区三区久久99 | 国产免费久久久久久无码 | 久久久久久久久蜜桃 | 国产av无码专区亚洲a∨毛片 | 亚洲の无码国产の无码步美 | 国产超级va在线观看视频 | 97夜夜澡人人爽人人喊中国片 | 国产精品怡红院永久免费 | 国产av一区二区三区最新精品 | 无码成人精品区在线观看 | 无码国模国产在线观看 | 大屁股大乳丰满人妻 | 午夜福利电影 | 少妇性l交大片欧洲热妇乱xxx | 色婷婷av一区二区三区之红樱桃 | 三级4级全黄60分钟 | 少妇的肉体aa片免费 | 国产偷抇久久精品a片69 | 成人欧美一区二区三区黑人 | 草草网站影院白丝内射 | 国内精品久久久久久中文字幕 | 午夜精品久久久久久久久 | 一本久道久久综合狠狠爱 | 99精品久久毛片a片 | 成人欧美一区二区三区黑人 | 福利一区二区三区视频在线观看 | 国产在线精品一区二区高清不卡 | 精品偷拍一区二区三区在线看 | 1000部啪啪未满十八勿入下载 | 十八禁视频网站在线观看 | 精品国产av色一区二区深夜久久 | 久在线观看福利视频 | 亚洲欧美精品aaaaaa片 | 亚洲一区二区观看播放 | 久久无码中文字幕免费影院蜜桃 | 强奷人妻日本中文字幕 | 国色天香社区在线视频 | 永久免费观看国产裸体美女 | 99视频精品全部免费免费观看 | 2019午夜福利不卡片在线 | 人人妻人人澡人人爽欧美精品 | 国产午夜福利100集发布 | 国内精品一区二区三区不卡 | 中文字幕av无码一区二区三区电影 | 亚洲精品成人av在线 | 精品水蜜桃久久久久久久 | 偷窥村妇洗澡毛毛多 | 久久综合久久自在自线精品自 | 国产乱子伦视频在线播放 | 久久99国产综合精品 | 国产成人无码av在线影院 | 东京热男人av天堂 | 久久99精品久久久久久 | 久久国内精品自在自线 | 国产激情艳情在线看视频 | 无人区乱码一区二区三区 | 妺妺窝人体色www婷婷 | 国精品人妻无码一区二区三区蜜柚 | 人妻插b视频一区二区三区 | 日日摸日日碰夜夜爽av | 99riav国产精品视频 | 成人欧美一区二区三区黑人免费 | 欧美刺激性大交 | 欧美日韩视频无码一区二区三 | 亚洲精品国产a久久久久久 | 国产亚洲视频中文字幕97精品 | 水蜜桃色314在线观看 | 欧美一区二区三区视频在线观看 | 国产精品久久久一区二区三区 | 狠狠噜狠狠狠狠丁香五月 | 兔费看少妇性l交大片免费 | 色综合久久88色综合天天 | 国产午夜亚洲精品不卡下载 | 日本xxxx色视频在线观看免费 | 天天拍夜夜添久久精品 | 少妇久久久久久人妻无码 | 四虎影视成人永久免费观看视频 | 亚洲成av人影院在线观看 | 日日夜夜撸啊撸 | 亚洲日韩乱码中文无码蜜桃臀网站 | 三级4级全黄60分钟 | 国产真实伦对白全集 | 午夜肉伦伦影院 | 无码一区二区三区在线 | 理论片87福利理论电影 | 婷婷丁香五月天综合东京热 | 漂亮人妻洗澡被公强 日日躁 | 成年美女黄网站色大免费视频 | 亚洲国产精品一区二区第一页 | 精品乱子伦一区二区三区 | 女人被爽到呻吟gif动态图视看 | 精品久久久无码中文字幕 | 狠狠躁日日躁夜夜躁2020 | 欧美野外疯狂做受xxxx高潮 | 女人被男人爽到呻吟的视频 | 国产国语老龄妇女a片 | 给我免费的视频在线观看 | 水蜜桃av无码 | 久久99热只有频精品8 | 偷窥日本少妇撒尿chinese | 久久久久亚洲精品中文字幕 | 国产精品-区区久久久狼 | 在线看片无码永久免费视频 | 日本一区二区更新不卡 | 一个人免费观看的www视频 | 亚洲小说春色综合另类 | 久久99久久99精品中文字幕 | 特黄特色大片免费播放器图片 | 欧美变态另类xxxx | 亚洲日韩一区二区 | 亚洲成av人在线观看网址 | 九九热爱视频精品 | 国产午夜福利亚洲第一 | 国产精品99久久精品爆乳 | 免费国产黄网站在线观看 | 久久精品成人欧美大片 | 色综合天天综合狠狠爱 | 日韩精品一区二区av在线 | 丰满少妇女裸体bbw | 国产特级毛片aaaaaaa高清 | 99久久人妻精品免费二区 | 一本一道久久综合久久 | www国产亚洲精品久久网站 | 亚洲国产精品一区二区第一页 | 亚洲欧美综合区丁香五月小说 | 国产成人综合在线女婷五月99播放 | 国产偷抇久久精品a片69 | 波多野42部无码喷潮在线 | 精品成在人线av无码免费看 | 国产香蕉97碰碰久久人人 | 国产高清av在线播放 | 久久久久久久人妻无码中文字幕爆 | 亚洲精品一区三区三区在线观看 | 国产成人午夜福利在线播放 | 亚洲第一网站男人都懂 | 樱花草在线社区www | 一个人看的视频www在线 | 性做久久久久久久免费看 | 国产亚洲人成在线播放 | 永久免费观看国产裸体美女 | 欧洲欧美人成视频在线 | 亚洲国产精品成人久久蜜臀 | 日本成熟视频免费视频 | 久久国产36精品色熟妇 | 少妇高潮喷潮久久久影院 | 亚洲中文字幕va福利 | 久久人人爽人人爽人人片av高清 | 久久久精品国产sm最大网站 | 欧美性生交xxxxx久久久 | 国内少妇偷人精品视频免费 | 97色伦图片97综合影院 | 国产精品igao视频网 | 久久国产自偷自偷免费一区调 | 久久久精品欧美一区二区免费 | 内射爽无广熟女亚洲 | 人妻有码中文字幕在线 | 中文字幕久久久久人妻 | 免费男性肉肉影院 | 午夜福利不卡在线视频 | 亚洲国产欧美日韩精品一区二区三区 | 国产口爆吞精在线视频 | 性做久久久久久久久 | 国产成人精品优优av | 国产三级精品三级男人的天堂 | 亚洲精品午夜无码电影网 | 内射后入在线观看一区 | 清纯唯美经典一区二区 | 久久综合九色综合97网 | 色狠狠av一区二区三区 | 国产精品人妻一区二区三区四 | 国产成人综合在线女婷五月99播放 | 最近中文2019字幕第二页 | 亚洲午夜福利在线观看 | 精品偷拍一区二区三区在线看 | 一本一道久久综合久久 | 午夜福利试看120秒体验区 | 国产香蕉尹人综合在线观看 | 99国产欧美久久久精品 | 无码人妻少妇伦在线电影 | 人妻人人添人妻人人爱 | 国产无遮挡又黄又爽免费视频 | а√资源新版在线天堂 | 97久久国产亚洲精品超碰热 | 毛片内射-百度 | 国精产品一品二品国精品69xx | 亚洲午夜久久久影院 | 日韩少妇白浆无码系列 | 天堂а√在线地址中文在线 | 天堂а√在线中文在线 | 欧美黑人性暴力猛交喷水 | 蜜臀av无码人妻精品 | 亚洲国产日韩a在线播放 | 巨爆乳无码视频在线观看 | 日本乱偷人妻中文字幕 | 欧美成人免费全部网站 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美人与善在线com | 日韩少妇白浆无码系列 | 国产精品永久免费视频 | 强开小婷嫩苞又嫩又紧视频 | 亚洲小说图区综合在线 | 婷婷五月综合缴情在线视频 | 中文字幕无码av波多野吉衣 | 日日碰狠狠躁久久躁蜜桃 | 日本护士xxxxhd少妇 | 国产特级毛片aaaaaa高潮流水 | 久久久久人妻一区精品色欧美 | 国产精品99爱免费视频 | 伊人久久大香线蕉亚洲 | 我要看www免费看插插视频 | 两性色午夜免费视频 | 久久久久久久女国产乱让韩 | 欧美日韩视频无码一区二区三 | 国产成人精品无码播放 | 亚洲日韩一区二区三区 | 国产亚洲精品久久久久久久 | 国产偷抇久久精品a片69 | 亚洲一区二区三区国产精华液 | 国产又爽又黄又刺激的视频 | 男女超爽视频免费播放 | 成人无码影片精品久久久 | 亚洲人亚洲人成电影网站色 | 樱花草在线社区www | 97精品人妻一区二区三区香蕉 | 国产内射爽爽大片视频社区在线 | 国产三级久久久精品麻豆三级 | 久久99热只有频精品8 | 国产亚洲精品久久久久久大师 | 日本欧美一区二区三区乱码 | 精品成人av一区二区三区 | 老子影院午夜伦不卡 | 成熟人妻av无码专区 | 中文字幕无码av激情不卡 | 色老头在线一区二区三区 | 激情爆乳一区二区三区 | 日韩人妻少妇一区二区三区 | 欧美兽交xxxx×视频 | 一本久久a久久精品亚洲 | 成人毛片一区二区 | 国产精品久久久午夜夜伦鲁鲁 | 免费观看又污又黄的网站 | 亚洲精品国偷拍自产在线麻豆 | 国产精品99久久精品爆乳 | 东京热一精品无码av | 久久久精品欧美一区二区免费 | 国产婷婷色一区二区三区在线 | 亚洲精品国产精品乱码不卡 | а√天堂www在线天堂小说 | 高潮毛片无遮挡高清免费 | 国产成人无码a区在线观看视频app | 欧美阿v高清资源不卡在线播放 | 精品亚洲成av人在线观看 | 四虎永久在线精品免费网址 | 免费乱码人妻系列无码专区 | 成年女人永久免费看片 | 免费看男女做好爽好硬视频 | 天堂无码人妻精品一区二区三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 激情爆乳一区二区三区 | 欧洲美熟女乱又伦 | 久久精品国产99久久6动漫 | 1000部啪啪未满十八勿入下载 | 永久黄网站色视频免费直播 | 日韩精品久久久肉伦网站 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 日韩av无码一区二区三区不卡 | 无码帝国www无码专区色综合 | 中文字幕无线码免费人妻 | 午夜理论片yy44880影院 | 一本无码人妻在中文字幕免费 | 东北女人啪啪对白 | 精品国精品国产自在久国产87 | 无码人妻精品一区二区三区下载 | 精品国产乱码久久久久乱码 | 久久久久久久人妻无码中文字幕爆 | 亚洲精品无码人妻无码 | 乌克兰少妇性做爰 | 丰满少妇高潮惨叫视频 | 久久久久久久久888 | 久久午夜无码鲁丝片秋霞 | 久久99精品久久久久久 | 国产另类ts人妖一区二区 | 特黄特色大片免费播放器图片 | 精品一二三区久久aaa片 | 亚洲爆乳精品无码一区二区三区 | 欧美日本日韩 | 无码人妻精品一区二区三区下载 | 国产免费无码一区二区视频 | 国产情侣作爱视频免费观看 | 成人一在线视频日韩国产 | 大肉大捧一进一出视频出来呀 | 日韩精品一区二区av在线 | 精品无码一区二区三区爱欲 | 日韩av无码中文无码电影 | 国产综合在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 伊人久久大香线蕉午夜 | 清纯唯美经典一区二区 | 亚洲一区av无码专区在线观看 | 夜夜高潮次次欢爽av女 | 男女作爱免费网站 | 无遮无挡爽爽免费视频 | 久久久久久国产精品无码下载 | 亚洲欧美日韩成人高清在线一区 | 亚洲爆乳精品无码一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 99精品无人区乱码1区2区3区 | 国产精品无码一区二区桃花视频 | 色 综合 欧美 亚洲 国产 | 国产av剧情md精品麻豆 | 亚洲a无码综合a国产av中文 | 国产精品igao视频网 | 国产午夜福利100集发布 | 人妻少妇被猛烈进入中文字幕 | 亚洲日本在线电影 | 疯狂三人交性欧美 | 亚洲国产av美女网站 | 中文无码伦av中文字幕 | 白嫩日本少妇做爰 | 久久天天躁狠狠躁夜夜免费观看 | 国产真实夫妇视频 | 日韩av无码中文无码电影 | 99久久精品国产一区二区蜜芽 | 麻花豆传媒剧国产免费mv在线 | 麻豆成人精品国产免费 | 色婷婷香蕉在线一区二区 | 午夜无码人妻av大片色欲 | 免费播放一区二区三区 | 日韩精品a片一区二区三区妖精 | 一本久久伊人热热精品中文字幕 | 国内精品一区二区三区不卡 | 欧美国产日韩久久mv | 国产又粗又硬又大爽黄老大爷视 | 国产一区二区三区四区五区加勒比 | 国产亚洲视频中文字幕97精品 | 一二三四在线观看免费视频 | 思思久久99热只有频精品66 | 性色欲网站人妻丰满中文久久不卡 | 国产精品怡红院永久免费 | 国产麻豆精品一区二区三区v视界 | 欧美丰满少妇xxxx性 | 性色欲情网站iwww九文堂 | 男人的天堂av网站 | 亚洲日韩av一区二区三区四区 | 理论片87福利理论电影 | 国产精品成人av在线观看 | 成人aaa片一区国产精品 | 秋霞成人午夜鲁丝一区二区三区 | 377p欧洲日本亚洲大胆 | 亚洲人成网站在线播放942 | 精品成人av一区二区三区 | 午夜免费福利小电影 | 在线а√天堂中文官网 | 亚洲日韩中文字幕在线播放 | 波多野结衣av一区二区全免费观看 | 国产精品久久久久无码av色戒 | 国产内射爽爽大片视频社区在线 | 人妻少妇精品无码专区动漫 | 一本久道久久综合婷婷五月 | 成 人 网 站国产免费观看 | 丰满护士巨好爽好大乳 | 狠狠色丁香久久婷婷综合五月 | 亚洲一区二区三区在线观看网站 | 亚洲午夜无码久久 | 老司机亚洲精品影院 | 亚洲欧洲无卡二区视頻 | 日本高清一区免费中文视频 | 狠狠色欧美亚洲狠狠色www | 国产麻豆精品一区二区三区v视界 | 中文字幕无码免费久久9一区9 | 亚洲精品无码国产 | 2019午夜福利不卡片在线 | 久久久久久久人妻无码中文字幕爆 | 一个人看的www免费视频在线观看 | 国产精品亚洲а∨无码播放麻豆 | 一本色道久久综合亚洲精品不卡 | 国产婷婷色一区二区三区在线 | 午夜理论片yy44880影院 | 无码国产乱人伦偷精品视频 | 荫蒂添的好舒服视频囗交 | 亚洲精品www久久久 | 岛国片人妻三上悠亚 | 久久zyz资源站无码中文动漫 | 精品国产成人一区二区三区 | 国产69精品久久久久app下载 | 日本www一道久久久免费榴莲 | 日日噜噜噜噜夜夜爽亚洲精品 | 一本一道久久综合久久 | 在线亚洲高清揄拍自拍一品区 | 亚洲自偷自偷在线制服 | 久久精品国产亚洲精品 | 永久免费精品精品永久-夜色 | 精品熟女少妇av免费观看 | 婷婷六月久久综合丁香 | 精品亚洲成av人在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 少妇的肉体aa片免费 | 午夜理论片yy44880影院 | 久久久婷婷五月亚洲97号色 | 亚洲中文字幕在线无码一区二区 | 夜精品a片一区二区三区无码白浆 | 少妇久久久久久人妻无码 | 人妻少妇被猛烈进入中文字幕 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 欧洲美熟女乱又伦 | 亚洲中文字幕在线观看 | 天天躁夜夜躁狠狠是什么心态 | 99久久久无码国产精品免费 | 午夜精品久久久久久久 | 亚洲国产精品无码久久久久高潮 | 欧美成人免费全部网站 | 精品成人av一区二区三区 | 美女黄网站人色视频免费国产 | 国产手机在线αⅴ片无码观看 | 青青久在线视频免费观看 | 国产超级va在线观看视频 | 欧美成人午夜精品久久久 | 色欲人妻aaaaaaa无码 | 久久久久成人精品免费播放动漫 | 国产精品美女久久久网av | 国内精品一区二区三区不卡 | 午夜无码人妻av大片色欲 | 国产免费无码一区二区视频 | 亚洲一区二区三区偷拍女厕 | 色婷婷香蕉在线一区二区 | 97久久超碰中文字幕 | 亚洲精品一区二区三区四区五区 | 日本www一道久久久免费榴莲 | 精品久久久无码人妻字幂 | 国产成人无码av一区二区 | 一本久道久久综合婷婷五月 | 西西人体www44rt大胆高清 | 台湾无码一区二区 | 中文无码成人免费视频在线观看 | 熟妇女人妻丰满少妇中文字幕 | 成人免费视频在线观看 | 日本爽爽爽爽爽爽在线观看免 | 久久精品国产精品国产精品污 | 国产色视频一区二区三区 | aⅴ在线视频男人的天堂 | 四虎永久在线精品免费网址 | 久久综合狠狠综合久久综合88 | 在线天堂新版最新版在线8 | 又粗又大又硬毛片免费看 | av无码久久久久不卡免费网站 | 国产精品视频免费播放 | 天堂久久天堂av色综合 | 1000部啪啪未满十八勿入下载 | 色综合久久中文娱乐网 | 亚洲人成网站免费播放 | 国产精品久久久久影院嫩草 | 亚洲国产精品毛片av不卡在线 | 色婷婷久久一区二区三区麻豆 | 精品国产精品久久一区免费式 | 色一情一乱一伦一视频免费看 | 久久视频在线观看精品 | 伊人久久大香线蕉av一区二区 | 色欲人妻aaaaaaa无码 | 国产口爆吞精在线视频 | 国产极品视觉盛宴 | 亚洲精品久久久久久久久久久 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕人成乱码熟女app | 国内丰满熟女出轨videos | 麻豆md0077饥渴少妇 | 99精品国产综合久久久久五月天 | 99riav国产精品视频 | 欧洲vodafone精品性 | 欧美第一黄网免费网站 | 人人澡人人妻人人爽人人蜜桃 | 国产卡一卡二卡三 | 欧美日韩一区二区综合 | 亚洲色www成人永久网址 | 激情爆乳一区二区三区 | 久久久久国色av免费观看性色 | 一本久久a久久精品亚洲 | 天天摸天天透天天添 | 少妇性l交大片 | 亚洲乱码国产乱码精品精 | 亚洲精品欧美二区三区中文字幕 | 久久五月精品中文字幕 | 日本熟妇人妻xxxxx人hd | 天堂在线观看www | 国产成人综合美国十次 | 狠狠色噜噜狠狠狠狠7777米奇 | 成年美女黄网站色大免费视频 | 国产成人午夜福利在线播放 | 丰腴饱满的极品熟妇 | 日韩视频 中文字幕 视频一区 | 精品国产精品久久一区免费式 | 熟女少妇人妻中文字幕 | 国产极品视觉盛宴 | 亚洲国产av精品一区二区蜜芽 | 亚洲精品欧美二区三区中文字幕 | 欧美35页视频在线观看 | 亚洲国产午夜精品理论片 | 麻豆国产人妻欲求不满谁演的 | av人摸人人人澡人人超碰下载 | 东京热无码av男人的天堂 | 国产精品欧美成人 | 中文字幕精品av一区二区五区 | 亚洲毛片av日韩av无码 | 水蜜桃色314在线观看 | 国产精品亚洲一区二区三区喷水 | 97精品人妻一区二区三区香蕉 | a片在线免费观看 | 亚洲国产成人av在线观看 | 亚洲精品一区二区三区婷婷月 | 欧美黑人性暴力猛交喷水 | 精品成在人线av无码免费看 | 久久天天躁狠狠躁夜夜免费观看 | 日韩精品成人一区二区三区 | 乱码av麻豆丝袜熟女系列 | 成人片黄网站色大片免费观看 | 97精品人妻一区二区三区香蕉 | 国产熟妇另类久久久久 | 国产午夜视频在线观看 | 欧美性黑人极品hd | 日日干夜夜干 | 久久精品人妻少妇一区二区三区 | 成年女人永久免费看片 | 永久免费观看国产裸体美女 | 亚洲va中文字幕无码久久不卡 | 大肉大捧一进一出视频出来呀 | 成人免费视频一区二区 | 自拍偷自拍亚洲精品10p | 精品成在人线av无码免费看 | 国产成人无码区免费内射一片色欲 | 久久久精品国产sm最大网站 | 奇米影视7777久久精品人人爽 | 天天摸天天碰天天添 | 成 人 网 站国产免费观看 | 啦啦啦www在线观看免费视频 | 成人av无码一区二区三区 | 少妇性l交大片 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产成人精品一区二区在线小狼 | 国产香蕉尹人视频在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 无码人妻丰满熟妇区五十路百度 | 国产黄在线观看免费观看不卡 | 亚洲国产精品成人久久蜜臀 | 国产精品久久福利网站 | 亚洲欧美色中文字幕在线 | 女人和拘做爰正片视频 | 最近中文2019字幕第二页 | 成人一在线视频日韩国产 | 18无码粉嫩小泬无套在线观看 | 国产精品欧美成人 | 欧洲vodafone精品性 | 东京热无码av男人的天堂 | 婷婷色婷婷开心五月四房播播 | 国产精品久久精品三级 | 欧美激情内射喷水高潮 | 97久久精品无码一区二区 | 国产精品亚洲专区无码不卡 | 成年女人永久免费看片 | 中文字幕无码av激情不卡 | 久久久国产一区二区三区 | 中文字幕无码日韩欧毛 | a片免费视频在线观看 | 欧美日韩色另类综合 | 老熟妇仑乱视频一区二区 | 天堂а√在线中文在线 | 日本一卡二卡不卡视频查询 | 亚洲毛片av日韩av无码 | 清纯唯美经典一区二区 | 好屌草这里只有精品 | 久9re热视频这里只有精品 | 免费无码一区二区三区蜜桃大 | 中文字幕乱妇无码av在线 | 亚洲欧美精品aaaaaa片 | 男女下面进入的视频免费午夜 | 一本色道久久综合狠狠躁 | 国产成人无码午夜视频在线观看 | 欧美黑人性暴力猛交喷水 | 老司机亚洲精品影院无码 | 又色又爽又黄的美女裸体网站 | 无码乱肉视频免费大全合集 | 人妻少妇精品视频专区 | 香港三级日本三级妇三级 | 久久久精品456亚洲影院 | 成人精品视频一区二区三区尤物 | 亚洲а∨天堂久久精品2021 | 在线播放免费人成毛片乱码 | 青春草在线视频免费观看 | 亚洲熟悉妇女xxx妇女av | 大地资源网第二页免费观看 | 18黄暴禁片在线观看 | 亚洲国产成人av在线观看 | 亲嘴扒胸摸屁股激烈网站 | 色噜噜亚洲男人的天堂 | 欧美日韩色另类综合 | 国产精品无码永久免费888 | 狠狠躁日日躁夜夜躁2020 | 国产熟妇另类久久久久 | 少妇的肉体aa片免费 | 四虎国产精品一区二区 | 国产九九九九九九九a片 | 亚洲精品欧美二区三区中文字幕 | 中文字幕无码免费久久9一区9 | 亚洲欧美综合区丁香五月小说 | 成在人线av无码免费 | 激情内射亚州一区二区三区爱妻 | 亚洲自偷精品视频自拍 | 国产免费观看黄av片 | 在线播放亚洲第一字幕 | 欧美35页视频在线观看 | 国产片av国语在线观看 | 亚洲综合色区中文字幕 | 四十如虎的丰满熟妇啪啪 | 大胆欧美熟妇xx | 国产精品18久久久久久麻辣 | 亚洲gv猛男gv无码男同 | 夜夜高潮次次欢爽av女 | 国产成人精品三级麻豆 | 97精品国产97久久久久久免费 | 精品国产一区二区三区四区 | 小sao货水好多真紧h无码视频 | 亚洲の无码国产の无码影院 | av无码不卡在线观看免费 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲综合精品香蕉久久网 | 好男人www社区 | 亚洲国产日韩a在线播放 | 东京热无码av男人的天堂 | 熟女少妇在线视频播放 | 激情五月综合色婷婷一区二区 | 欧美日韩久久久精品a片 | 精品厕所偷拍各类美女tp嘘嘘 | 男女超爽视频免费播放 | 国产乱人伦av在线无码 | 在线观看国产一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品第一国产精品 | 澳门永久av免费网站 | 欧洲熟妇色 欧美 | 妺妺窝人体色www婷婷 | 国内精品久久毛片一区二区 | 丰腴饱满的极品熟妇 | 国产精品免费大片 | 天天摸天天透天天添 | 久久亚洲中文字幕精品一区 | 亚洲日韩av一区二区三区中文 | 色综合久久久无码中文字幕 | 欧美xxxx黑人又粗又长 | 亚洲s色大片在线观看 | 国产精品久久国产精品99 | 激情内射亚州一区二区三区爱妻 | 国产女主播喷水视频在线观看 | 熟女俱乐部五十路六十路av | 亚洲成av人综合在线观看 | 人妻插b视频一区二区三区 | 中文字幕无码av波多野吉衣 | 成人欧美一区二区三区黑人免费 | 亚洲精品鲁一鲁一区二区三区 | 国产熟女一区二区三区四区五区 | 丰满人妻精品国产99aⅴ | www一区二区www免费 | 99久久99久久免费精品蜜桃 | 无码人妻少妇伦在线电影 | 久久久久se色偷偷亚洲精品av | 国产亚洲人成在线播放 | 1000部啪啪未满十八勿入下载 | 亚洲精品国产品国语在线观看 | 欧美喷潮久久久xxxxx | 久久久婷婷五月亚洲97号色 | 亚洲精品午夜国产va久久成人 | 中文字幕无码免费久久9一区9 | 欧美性猛交内射兽交老熟妇 | 成人欧美一区二区三区黑人免费 | 久久久国产一区二区三区 | 国产在线一区二区三区四区五区 | 亚洲成av人在线观看网址 | 欧美日韩视频无码一区二区三 | 国产人妻人伦精品 | 亚洲人亚洲人成电影网站色 | 亚洲中文字幕在线无码一区二区 | 黑人巨大精品欧美黑寡妇 | 麻花豆传媒剧国产免费mv在线 | 精品久久久中文字幕人妻 | 国产97色在线 | 免 | 国产精品久久福利网站 | 久久综合九色综合97网 | 久久伊人色av天堂九九小黄鸭 | 亚洲日韩中文字幕在线播放 | 日韩精品无码一本二本三本色 | 国产成人精品三级麻豆 | 人妻互换免费中文字幕 | 奇米影视7777久久精品人人爽 | 男女爱爱好爽视频免费看 | 男女猛烈xx00免费视频试看 | 亚洲成av人综合在线观看 | 日韩精品无码免费一区二区三区 | 亚洲精品中文字幕久久久久 | 久久精品国产99精品亚洲 | 大肉大捧一进一出好爽视频 | 小sao货水好多真紧h无码视频 | 久久久中文字幕日本无吗 | 免费乱码人妻系列无码专区 | 一本精品99久久精品77 | 国产精品a成v人在线播放 | 久久久久亚洲精品中文字幕 | 中文字幕亚洲情99在线 | 久久久久久久女国产乱让韩 | 午夜丰满少妇性开放视频 | 沈阳熟女露脸对白视频 | 亚洲精品一区二区三区在线 | 六十路熟妇乱子伦 | 久久综合色之久久综合 | 99久久亚洲精品无码毛片 | 亚拍精品一区二区三区探花 | 一本无码人妻在中文字幕免费 | 国产三级精品三级男人的天堂 | 国产欧美亚洲精品a | 日韩精品一区二区av在线 | 麻花豆传媒剧国产免费mv在线 | 人人妻人人澡人人爽人人精品浪潮 | 色综合久久久无码中文字幕 | 午夜精品久久久久久久久 | 久久国产劲爆∧v内射 | 国产sm调教视频在线观看 | 一本色道久久综合狠狠躁 | 少妇被粗大的猛进出69影院 | 正在播放东北夫妻内射 | 荫蒂被男人添的好舒服爽免费视频 | 日日天日日夜日日摸 | 激情综合激情五月俺也去 | 精品熟女少妇av免费观看 | 亚洲高清偷拍一区二区三区 | 少女韩国电视剧在线观看完整 | 老太婆性杂交欧美肥老太 | 国产精品亚洲专区无码不卡 | 55夜色66夜色国产精品视频 | 亚洲精品成人福利网站 | 人妻少妇精品无码专区二区 | 精品国产aⅴ无码一区二区 | 两性色午夜视频免费播放 | 中文字幕色婷婷在线视频 | 久久午夜无码鲁丝片 | 亚洲欧美日韩国产精品一区二区 | 天干天干啦夜天干天2017 | 人人妻人人澡人人爽精品欧美 | 亚洲一区二区三区无码久久 | 丁香啪啪综合成人亚洲 | 亚洲欧洲无卡二区视頻 | 亚洲综合久久一区二区 | 无码国内精品人妻少妇 | 久久精品中文字幕大胸 | 午夜肉伦伦影院 | 无码人妻丰满熟妇区五十路百度 | 久久久久人妻一区精品色欧美 | 欧美人与牲动交xxxx | 久久久精品国产sm最大网站 | 人人爽人人爽人人片av亚洲 | 亚洲自偷自偷在线制服 | 无遮挡国产高潮视频免费观看 | 精品国产一区二区三区四区在线看 | 人人澡人人妻人人爽人人蜜桃 | 久久久久99精品国产片 | 亚洲色在线无码国产精品不卡 | 日本护士xxxxhd少妇 | 999久久久国产精品消防器材 | 精品国产av色一区二区深夜久久 | 色婷婷av一区二区三区之红樱桃 | 激情国产av做激情国产爱 | 国产片av国语在线观看 | 亚洲男人av香蕉爽爽爽爽 | 狠狠色噜噜狠狠狠狠7777米奇 | 欧美 亚洲 国产 另类 | 亚洲 a v无 码免 费 成 人 a v | 国产精品无码永久免费888 | 亚洲成色在线综合网站 | 婷婷五月综合缴情在线视频 | 色综合久久中文娱乐网 | 久久国产精品精品国产色婷婷 | 亚洲综合精品香蕉久久网 | 国产精品久久久久7777 | 国产精品永久免费视频 | 天天躁夜夜躁狠狠是什么心态 | 国产真实夫妇视频 | 亚无码乱人伦一区二区 | 国产乱码精品一品二品 | 99er热精品视频 | 两性色午夜免费视频 | 国产无遮挡吃胸膜奶免费看 | 久久精品人妻少妇一区二区三区 | 色综合视频一区二区三区 | 国产精品亚洲专区无码不卡 | 欧美一区二区三区视频在线观看 | 久久久久久九九精品久 | 国产精品99爱免费视频 | 骚片av蜜桃精品一区 | 东京无码熟妇人妻av在线网址 | 小泽玛莉亚一区二区视频在线 | 一本久久a久久精品亚洲 | 久久国产精品二国产精品 | 亚洲成av人综合在线观看 | 国产高清av在线播放 | 国产亚洲精品久久久久久大师 | 午夜时刻免费入口 | 最新版天堂资源中文官网 | 兔费看少妇性l交大片免费 | 极品嫩模高潮叫床 | 亚洲欧美中文字幕5发布 | 久久久久se色偷偷亚洲精品av | 麻豆国产人妻欲求不满谁演的 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲乱码日产精品bd | 色综合久久中文娱乐网 | 成人aaa片一区国产精品 | 丰满少妇女裸体bbw | 2020最新国产自产精品 | 亚洲啪av永久无码精品放毛片 | 免费人成在线视频无码 | 国产精品香蕉在线观看 | 亚洲欧美综合区丁香五月小说 | 好男人www社区 | 未满小14洗澡无码视频网站 | 内射欧美老妇wbb | 麻豆蜜桃av蜜臀av色欲av | 亚洲成av人综合在线观看 | 国产做国产爱免费视频 | 欧美色就是色 | 乌克兰少妇xxxx做受 | 亚洲精品国产精品乱码不卡 | 成人精品视频一区二区 | 97精品人妻一区二区三区香蕉 | 亚洲精品中文字幕乱码 | 国产偷抇久久精品a片69 | 亚洲人成网站色7799 | 亚洲欧美日韩综合久久久 | 国产精品欧美成人 | а天堂中文在线官网 | 欧美精品免费观看二区 | 国产在线aaa片一区二区99 | 午夜不卡av免费 一本久久a久久精品vr综合 | 欧美国产日产一区二区 | 国产国产精品人在线视 | 国产精品亚洲一区二区三区喷水 | 欧美人与禽zoz0性伦交 | 国产高清不卡无码视频 | 永久免费精品精品永久-夜色 | 国产亚洲精品精品国产亚洲综合 | 亚洲欧美日韩成人高清在线一区 | 中文精品无码中文字幕无码专区 | 88国产精品欧美一区二区三区 | 久久www免费人成人片 | 久久精品丝袜高跟鞋 | 综合网日日天干夜夜久久 | 成人免费视频在线观看 | 俺去俺来也在线www色官网 | 好屌草这里只有精品 | 久久综合久久自在自线精品自 | 久久精品国产日本波多野结衣 | 国产午夜福利亚洲第一 | 国产综合久久久久鬼色 | 中文字幕无码日韩专区 | 激情内射日本一区二区三区 | 夫妻免费无码v看片 | 国产成人人人97超碰超爽8 | 伊在人天堂亚洲香蕉精品区 | 久久精品国产一区二区三区肥胖 | 国产suv精品一区二区五 | 国产av无码专区亚洲a∨毛片 | 日本精品高清一区二区 | 曰韩无码二三区中文字幕 | 天堂久久天堂av色综合 | 国内揄拍国内精品少妇国语 | 亚洲码国产精品高潮在线 | 成年女人永久免费看片 | 男人扒开女人内裤强吻桶进去 | 久久久久久久久蜜桃 | 久久久久人妻一区精品色欧美 | 国产婷婷色一区二区三区在线 | 久久国产精品_国产精品 | 久久精品中文字幕大胸 | 女人被男人躁得好爽免费视频 | 成熟妇人a片免费看网站 | 乱人伦中文视频在线观看 | 久久综合香蕉国产蜜臀av | 国产乱码精品一品二品 | 日日摸天天摸爽爽狠狠97 | 强辱丰满人妻hd中文字幕 | 久久国产精品_国产精品 | 一本一道久久综合久久 | 宝宝好涨水快流出来免费视频 | 国产高清av在线播放 | 小泽玛莉亚一区二区视频在线 | 18禁黄网站男男禁片免费观看 | 在线看片无码永久免费视频 | 男人扒开女人内裤强吻桶进去 | 日日碰狠狠丁香久燥 | 少妇无码av无码专区在线观看 | 亚洲精品鲁一鲁一区二区三区 | 亚洲人交乣女bbw | v一区无码内射国产 | 日日碰狠狠躁久久躁蜜桃 | 精品国精品国产自在久国产87 | 少妇被粗大的猛进出69影院 | 精品欧美一区二区三区久久久 | 亚洲成av人影院在线观看 | 精品一区二区三区波多野结衣 | 亚洲色成人中文字幕网站 | 亚洲熟妇自偷自拍另类 | 97夜夜澡人人双人人人喊 | 蜜桃av抽搐高潮一区二区 | 亚洲综合伊人久久大杳蕉 | 日韩精品无码一区二区中文字幕 | 国产乱人偷精品人妻a片 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲娇小与黑人巨大交 | 精品国产av色一区二区深夜久久 | 日韩欧美中文字幕在线三区 | 亚洲色欲色欲欲www在线 | 久久久久成人片免费观看蜜芽 | 国产色视频一区二区三区 | 久久精品国产99久久6动漫 | 性欧美熟妇videofreesex | 久久国产精品偷任你爽任你 | 国产热a欧美热a在线视频 | 久久久久久a亚洲欧洲av冫 | 最新国产麻豆aⅴ精品无码 | 久久久久久九九精品久 | 兔费看少妇性l交大片免费 | 国产人成高清在线视频99最全资源 | 久久久婷婷五月亚洲97号色 | 中文亚洲成a人片在线观看 | 奇米影视7777久久精品人人爽 | 国产av无码专区亚洲awww | 亚洲国产精品一区二区美利坚 | 精品人妻中文字幕有码在线 | 牛和人交xxxx欧美 | 国产一区二区不卡老阿姨 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产午夜精品一区二区三区嫩草 | 久久天天躁夜夜躁狠狠 | 天海翼激烈高潮到腰振不止 | 国产成人午夜福利在线播放 | 亚洲 a v无 码免 费 成 人 a v | 久久亚洲中文字幕精品一区 | 日本饥渴人妻欲求不满 | 无码纯肉视频在线观看 | 久久久久亚洲精品男人的天堂 | 久久99精品久久久久久 | 亚洲综合久久一区二区 | 国产一区二区三区日韩精品 | 亚洲男人av香蕉爽爽爽爽 | 日日麻批免费40分钟无码 | 欧美亚洲国产一区二区三区 | 人人妻人人澡人人爽精品欧美 | 欧美 日韩 人妻 高清 中文 | 亚洲熟熟妇xxxx | 夜精品a片一区二区三区无码白浆 | 男女下面进入的视频免费午夜 | 东北女人啪啪对白 | 美女毛片一区二区三区四区 | 亚洲国产精品无码久久久久高潮 | 狠狠色丁香久久婷婷综合五月 | 伊人久久婷婷五月综合97色 | 国内老熟妇对白xxxxhd | 国产成人综合色在线观看网站 | 国产精品鲁鲁鲁 | 免费观看黄网站 | 国产激情艳情在线看视频 | 日本精品人妻无码77777 天堂一区人妻无码 | 在线亚洲高清揄拍自拍一品区 | 国产精品怡红院永久免费 | 成在人线av无码免观看麻豆 | 国产精品怡红院永久免费 | 欧洲美熟女乱又伦 | 鲁鲁鲁爽爽爽在线视频观看 | 搡女人真爽免费视频大全 | 国产97在线 | 亚洲 | 一区二区三区乱码在线 | 欧洲 | 亚洲午夜久久久影院 | 人妻无码αv中文字幕久久琪琪布 | 亚洲熟悉妇女xxx妇女av | 国产成人精品久久亚洲高清不卡 | 精品国产乱码久久久久乱码 | 2020久久超碰国产精品最新 | 九九在线中文字幕无码 | 中文毛片无遮挡高清免费 | 久久久精品456亚洲影院 | 成熟人妻av无码专区 | 波多野结衣一区二区三区av免费 | 丁香啪啪综合成人亚洲 | 76少妇精品导航 | 51国偷自产一区二区三区 | 国产精品久久久久9999小说 | 亚洲熟女一区二区三区 | 美女扒开屁股让男人桶 | 日本丰满护士爆乳xxxx | 少妇无码av无码专区在线观看 | 国产成人亚洲综合无码 | 久久精品人人做人人综合试看 | 乱人伦中文视频在线观看 | 国产情侣作爱视频免费观看 | 亚洲大尺度无码无码专区 | 久久99精品久久久久婷婷 | 亚洲精品鲁一鲁一区二区三区 | 日韩 欧美 动漫 国产 制服 | 国产精品内射视频免费 | 国产精品久久国产三级国 | 又大又硬又爽免费视频 | 亚洲 另类 在线 欧美 制服 | 在线欧美精品一区二区三区 | 国产精品99爱免费视频 | 在线精品亚洲一区二区 | 日本护士毛茸茸高潮 | 无码人妻精品一区二区三区不卡 | 国产成人精品一区二区在线小狼 | 老子影院午夜精品无码 | 青青青爽视频在线观看 | 精品人妻中文字幕有码在线 | 精品久久综合1区2区3区激情 | 国产成人av免费观看 | 久久人妻内射无码一区三区 | 老熟妇仑乱视频一区二区 | 久热国产vs视频在线观看 | 国产精品多人p群无码 | 久久久中文字幕日本无吗 | 帮老师解开蕾丝奶罩吸乳网站 | 国产成人午夜福利在线播放 | 高潮毛片无遮挡高清免费视频 | 亚洲国产高清在线观看视频 | 最近的中文字幕在线看视频 | 亚洲欧美国产精品久久 | 一本色道婷婷久久欧美 | 377p欧洲日本亚洲大胆 | 兔费看少妇性l交大片免费 | 亚洲熟妇色xxxxx欧美老妇y | 极品嫩模高潮叫床 | 久久亚洲中文字幕无码 | 午夜性刺激在线视频免费 | 成人无码精品1区2区3区免费看 | 中文字幕日韩精品一区二区三区 | 蜜桃视频插满18在线观看 | 波多野42部无码喷潮在线 | 搡女人真爽免费视频大全 | 无套内谢的新婚少妇国语播放 | 99久久精品日本一区二区免费 | 性欧美videos高清精品 | 青草视频在线播放 | 漂亮人妻洗澡被公强 日日躁 | a片在线免费观看 | 成在人线av无码免费 | 无码人妻黑人中文字幕 | 国产精品久久久久久亚洲影视内衣 | 福利一区二区三区视频在线观看 | 国语精品一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 亚洲熟悉妇女xxx妇女av | 成人无码视频在线观看网站 | 国产香蕉尹人视频在线 | 婷婷综合久久中文字幕蜜桃三电影 | 日韩人妻无码一区二区三区久久99 | 久久99精品国产麻豆 | 黄网在线观看免费网站 | 国产成人精品视频ⅴa片软件竹菊 | 欧美国产日韩亚洲中文 | 日产精品高潮呻吟av久久 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲色欲色欲天天天www | 97无码免费人妻超级碰碰夜夜 | 国产亚洲欧美在线专区 | 久久无码中文字幕免费影院蜜桃 | 国产麻豆精品一区二区三区v视界 | 大肉大捧一进一出好爽视频 | 又湿又紧又大又爽a视频国产 | 成人试看120秒体验区 | 国产精品嫩草久久久久 | 久久国内精品自在自线 | 亚洲狠狠色丁香婷婷综合 | 天下第一社区视频www日本 | 成人精品视频一区二区三区尤物 | 少妇的肉体aa片免费 | 午夜熟女插插xx免费视频 | 无码人中文字幕 | 亚洲欧美国产精品久久 | 领导边摸边吃奶边做爽在线观看 | 亚洲成在人网站无码天堂 | 乌克兰少妇性做爰 | 国产绳艺sm调教室论坛 | 无码国产激情在线观看 | 成人aaa片一区国产精品 | 亚洲精品中文字幕乱码 | 午夜免费福利小电影 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲色大成网站www国产 | 久久99久久99精品中文字幕 | 性欧美大战久久久久久久 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 无码午夜成人1000部免费视频 | 未满小14洗澡无码视频网站 | 亚洲欧洲中文日韩av乱码 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲综合无码一区二区三区 | 荫蒂被男人添的好舒服爽免费视频 | 久久人妻内射无码一区三区 | 亚洲日本va中文字幕 | 免费看少妇作爱视频 | 波多野结衣 黑人 | 日韩精品无码一区二区中文字幕 | 俺去俺来也www色官网 | 日本精品久久久久中文字幕 | 国内精品久久久久久中文字幕 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美成人免费全部网站 | 国产午夜视频在线观看 | 麻豆蜜桃av蜜臀av色欲av | 午夜理论片yy44880影院 | 天干天干啦夜天干天2017 | 曰韩无码二三区中文字幕 | 国产精品亚洲综合色区韩国 | 女人和拘做爰正片视频 | 亚洲精品鲁一鲁一区二区三区 | 18禁黄网站男男禁片免费观看 | 99国产欧美久久久精品 | 无码人妻少妇伦在线电影 | 国产免费久久精品国产传媒 | www国产亚洲精品久久网站 | 午夜嘿嘿嘿影院 | 久久久久久久女国产乱让韩 | 精品国产一区二区三区av 性色 | 成年美女黄网站色大免费视频 | 成人一区二区免费视频 | 中文字幕人妻无码一区二区三区 | 波多野结衣av在线观看 | av无码久久久久不卡免费网站 | 久久久精品人妻久久影视 | 国产成人av免费观看 | 成人免费视频在线观看 | 久久精品中文字幕一区 | www国产精品内射老师 | 撕开奶罩揉吮奶头视频 | 特级做a爰片毛片免费69 | 熟妇人妻激情偷爽文 | 日韩精品无码一本二本三本色 | 亚洲乱码国产乱码精品精 | 欧美三级不卡在线观看 | 一个人看的视频www在线 | 欧美精品免费观看二区 | 亚洲精品欧美二区三区中文字幕 | 亚洲综合色区中文字幕 | 黑人粗大猛烈进出高潮视频 | 激情内射日本一区二区三区 | 亚洲中文字幕无码一久久区 |