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

我們一起學學嵌入式Web容器

開發 架構
Spring Boot 支持的兩大 Web 容器體系,一個是 Servlet Web ,另一個是 Reactive Web ,它們都有其具體的容器實現,相信大多數開發者使用的都是前者,且最常用的容器實現也是 Tomcat,所以這篇文章主要討論的也是 Spring Boot 啟動 Tomcat 嵌入式容器的流程。

前言

開始之前呢,我們帶著幾個問題去學習:

1、Spring Boot 嵌入式Web容器是什么?

2、整體流程或結構是怎樣的?

3、核心部分是什么?

4、怎么實現的?

1、起源

在當今的互聯網場景中,與終端用戶交互的應用大多數是 Web 應用,其中 Java Web 應用尤為突出,其對應的 Java Web 容器發展至今也分為 Servlet Web 容器和 Reactive Web 容器,前者的使用率大概占比是百分之九十左右,其具體的實現有 Tomcat、Jetty 和 Undertow;而后者出現較晚,且技術棧體系并未完全成熟,還有待時間驗證可行性,它的默認實現為 Netty Web Server。其中的 Servlet 規范與三種 Servlet 容器的版本關系如下:

Servlet 規范

Tomcat

Jetty

Undertow

4

9.X

9.X

2.X

3.1

8.X

8.X

1.X

3

7.X

8.X

N/A

2.5

6.X

8.X

N/A

以上 Web 容器均被 Spring Boot 嵌入至其中作為其核心特性,來簡化 Spring Boot 應用啟動流程。Spring Boot 通過 Maven 依賴來切換應用的嵌入式容器類型,其對應的 Maven jar 分別是:

<!-- Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

<!-- undertow -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

<!-- jetty -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

<!-- netty Web Server -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-reactor-netty</artifactId>
</dependency>

前三者是 Servlet Web 實現,最后則是 Reactive Web 的實現。值得注意的是,當我們引用的是 Servlet Web 功能模塊時,它會自動集成 Tomcat ,里面包含了 Tomcat 的 Maven 依賴包,也就是說 Tomcat 是默認的 Servlet Web 容器。Servlet Web 模塊的 Maven 依賴如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

而如果引用的是 Reactive Web 功能模塊時,則會默認集成 netty Web Server 。Reactive Web 模塊的依賴如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

不過,上面的三種 Servlet Web 容器也能作為 Reactive Web 容器 ,并允許替換默認實現 Netty Web Server,因為 Servlet 3.1+容器同樣滿足 Reactive 異步非阻塞特性。

接下來,我們重點討論嵌入式 Web 容器的啟動流程。

注:本篇文章所用到的 Spring Boot版本是 2.3.3.RELEASE

2、容器啟動流程解析

Spring Boot 嵌入式容器啟動時會先判斷當前的應用類型,是 Servlet Web 還是 Reactive Web ,之后會創建相應類型的 ApplicationContext 上下文,在該上下文中先獲取容器的工廠類,然后利用該工廠類創建具體的容器。接下來,我們進行詳細討論。

從 Spring Boot 啟動類開始:

@SpringBootApplication
public class DiveInSpringBootApplication {
public static void main(String[] args){
SpringApplication.run(DiveInSpringBootApplication.class, args);
}
}

2.1獲取應用類型

先來看看,獲取應用類型的過程,進入 run 的重載方法:

public class SpringApplication {

// 1、該方法中,先構造 SpringApplication 對象,再調用該對象的 run 方法。我們進入第二步查看構造過程
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
String[] args){
return new SpringApplication(primarySources).run(args);
}

// 2、webApplicationType 存儲的就是應用的類型,通過 deduceFromClasspath 方法返回。// 我們進入第三步查看該方法實現public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources){
...
this.webApplicationType = WebApplicationType.deduceFromClasspath();
...
}
}

public enum WebApplicationType {

private static final String[] SERVLET_INDICATOR_CLASSES = { "javax.servlet.Servlet",
"org.springframework.web.context.ConfigurableWebApplicationContext" };

private static final String WEBMVC_INDICATOR_CLASS = "org.springframework." + "web.servlet.DispatcherServlet";

private static final String WEBFLUX_INDICATOR_CLASS = "org." + "springframework.web.reactive.DispatcherHandler";

private static final String JERSEY_INDICATOR_CLASS = "org.glassfish.jersey.servlet.ServletContainer";

// 3、這里其實是根據引入的 Web 模塊 jar 包,來判斷是否包含各 Web 模塊的類,來返回相應的應用類型
static WebApplicationType deduceFromClasspath(){

// 當 DispatcherHandler 類存在,DispatcherServlet 和 ServletContainer 不存在時,
// 返回 Reactive ,表示當前 Spring Boot 應用類型是 Reactive Web 。
// 前者是 Reactice Web jar 中的類,后兩者是 Servlet Web 中的。if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
return WebApplicationType.REACTIVE;
}

// 這里判斷是非 Web 應用類型for (String className : SERVLET_INDICATOR_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return WebApplicationType.NONE;
}
}

// 以上都不滿足時,最后返回 Servlet 。return WebApplicationType.SERVLET;
}
}

以上,在 SpringApplication 的構造階段確定了當前應用的類型,該類型名稱存儲在 webApplicationType 字段中。

2.2容器啟動流程

接著進入容器啟動流程,進入重載的 run 方法中:

public class SpringApplication {

public static final String DEFAULT_CONTEXT_CLASS = "org.springframework.context."
+ "annotation.AnnotationConfigApplicationContext";

public static final String DEFAULT_WEB_CONTEXT_CLASS = "org.springframework.boot."
+ "web.servlet.context.AnnotationConfigServletWebServerApplicationContext";

public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework."
+ "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";

...

private WebApplicationType webApplicationType;

...

public ConfigurableApplicationContext run(String... args){
...

ConfigurableApplicationContext context = null;

try {
...
// 1、通過 createApplicationContext 方法創建對應的 ApplicationContext 應用上下文,進入 1.1 查看具體實現
context = createApplicationContext();

...

// 2、該方法實質是啟動 Spring 應用上下文的,但 Spring Boot 嵌入式容器也在該過程中被啟動,入參是上下文對象,我們進入 2.1 進行跟蹤
refreshContext(context);

...
}
...
}

// 1.1、protected ConfigurableApplicationContext createApplicationContext(){
Class<?> contextClass = this.applicationContextClass;
if (contextClass == null) {
try {

// 這里就是通過 webApplicationType 屬性,判斷應用類型,來創建不同的 ApplicationContext 應用上下文switch (this.webApplicationType) {
case SERVLET:

// 返回的是 Servlet Web ,具體對象為 AnnotationConfigServletWebServerApplicationContext,// 該類有一個關鍵父類 ServletWebServerApplicationContext
contextClass = Class.forName(DEFAULT_WEB_CONTEXT_CLASS);
break;
case REACTIVE:

// 返回的是 Reactive Web,具體對象為 AnnotationConfigReactiveWebServerApplicationContext
contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
break;
default:

// 應用類型是非 Web 時,返回 AnnotationConfigApplicationContext
contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
}
}
...
}
return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

// 2.1private void refreshContext(ConfigurableApplicationContext context){

// 里面調用的是 refresh 方法,進入 2.2 繼續跟蹤
refresh(context);

...
}

// 2.2protected void refresh(ApplicationContext applicationContext){
Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);

// 最終調用了 所有應用上下文的統一抽象類 AbstractApplicationContext 中的 refresh 方法,進入 3 查看實現
((AbstractApplicationContext) applicationContext).refresh();
}

// ...
}

AbstractApplicationContext 是 Spring 應用上下文的核心啟動類,Spring 的 ioc 從這里就開始進入創建流程。在后續在 Spring 系列的文章中會進行詳細討論,我們這里只關注容器創建的部分。

public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {

...

// 3
@Overridepublic void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {

try {
...

// Web 容器在這個方法中啟動,但在當前抽象類中這個方法是個空實現,具體由 ApplicationContext 上下文的子類對象進行重寫,
// 我們進入 4 查看其中一個子類的實現
onRefresh();

...
}
}
...
}
...
}

這里以 Servlet web 為例,具體上下文對象是
AnnotationConfigServletWebServerApplicationContext,該類實現了 ServletWebServerApplicationContext 類,onRefresh 方法由該類進行重寫。

public class ServletWebServerApplicationContext extends GenericWebApplicationContextimplements ConfigurableWebServerApplicationContext {
...

// 4
@Overrideprotected void onRefresh(){

...

try {

// 里面調用了 createWebServer 方法,進入 5 查看實現
createWebServer();
}
catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}

...

// 5private void createWebServer(){

// WebServer 就是容器對象,是一個接口,其對應的實現類分別是:
// JettyWebServer、TomcatWebServer、UndertowWebServer、NettyWebServer。這些容器對象由對應的容器工廠類進行創建
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();

// 當 webServer 等于 null ,也就是容器還沒創建時,進入該 if 中if (webServer == null && servletContext == null) {

// 這里是獲取 創建 Servlet Web 容器的工廠類,也是一個接口,有三個實現,分別是:
// JettyServletWebServerFactory、TomcatServletWebServerFactory、UndertowServletWebServerFactory
ServletWebServerFactory factory = getWebServerFactory();

// 通過容器工廠類的 getWebServer 方法,創建容器對象。這里以創建 Tomcat 為例,來繼續跟蹤容器的創建流程,// 跳到 6 查看 TomcatServletWebServerFactory 的 getWebServer 方法this.webServer = factory.getWebServer(getSelfInitializer());
}

...
}
}

TomcatServletWebServerFactory 是創建 Tomcat 的 Web 容器工廠類,但這個工廠類是如何被創建的呢?這里將會在文章的第三部分進行詳細討論。

public class TomcatServletWebServerFactory extends AbstractServletWebServerFactoryimplements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {

...
// 6
@Overridepublic WebServer getWebServer(ServletContextInitializer... initializers){

// 方法中先進行創建 Tomcat 的流程,如 Container 、Engine、Host、Servlet 幾個容器的組裝。// 后續有機會再對 Tomcat 進行詳細討論,這里就不深入了
Tomcat tomcat = new Tomcat();
File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");
tomcat.setBaseDir(baseDir.getAbsolutePath());
Connector connector = new Connector(this.protocol);
tomcat.getService().addConnector(connector);
customizeConnector(connector);
tomcat.setConnector(connector);
tomcat.getHost().setAutoDeploy(false);
configureEngine(tomcat.getEngine());
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}
prepareContext(tomcat.getHost(), initializers);

// 通過 getTomcatWebServer 方法返回 TomcatWebServer 容器對象。進入 7 查看接下來的流程return getTomcatWebServer(tomcat);
}

...

// 7、這里通過 TomcatWebServer 的構造方法創建該對象。進入 8 繼續跟蹤protected TomcatWebServer getTomcatWebServer(Tomcat tomcat){
return new TomcatWebServer(tomcat, getPort() >= 0);
}

...
}

TomcatWebServer 是具體的容器對象,在其對應的工廠類中進行創建,其實現了 WebServer 接口,并在該對象中進行 Tomcat 的啟動流程。

public class TomcatWebServer implements WebServer {

...

// 8
public TomcatWebServer(Tomcat tomcat, boolean autoStart){
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat;
this.autoStart = autoStart;

// 進入 initialize 方法中,查看實現
initialize();
}

private void initialize() throws WebServerException {
logger.info("Tomcat initialized with port(s): " + getPortsDescription(false));
synchronized (this.monitor) {
try {

...

// 調用 Tomcat 的 start 方法,正式啟動this.tomcat.start();

...

// 啟動守護線程來監聽http請求
startDaemonAwaitThread();
}
...
}
}

...
}

到這里,Web 容器的啟動流程就結束了,以上是以 Servlet Web 及其具體的 Tomcat 容器為例子進行的討論,這也是大部分開發者常用的體系。接著來對整個過程做一個總結。

首先通過引入的 Web 模塊 Maven 依賴 ,來判斷當前應用的類型,如 Servlet Web 或 Reactive Web。并根據應用類型來創建相應的 ApplicationContext 上下文對象。然后調用了 ApplicationContext 的父抽象類
AbstractApplicationContext 中的 refresh 方法,又在該方法中調用了子類的 onRefresh 方法。最后是在 onRefresh 中通過容器的工廠類創建具體容器對象,并在該容器對象中進行啟動。

3、加載 Web 容器工廠

上面說過, Web 容器對象是由其對應的工廠類進行創建的,那容器工廠類又是怎么創建呢?我們這里就來看一看。在《Spring Boot 自動裝配(二)》的 1.2 小節說過, Spring Boot 啟動時,會讀取所有 jar 包中 META-INF 文件夾下的 spring.factories 文件,并加載文件中定義好的類,如:

...
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\\

...

其中有一個
ServletWebServerFactoryAutoConfiguration 類:

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
...
}

該類通過 @Import 導入了
ServletWebServerFactoryConfiguration 中的三個內部類,這三個內部類就是用來創建容器工廠,我們進入其中查看具體實現:

@Configuration
class ServletWebServerFactoryConfiguration {

// 通過 @ConditionalOnClass 判斷 Servlet 、Tomcat、UpgradeProtocol 這三個 Class 是否存在,
// 當引用的是 Tomcat Maven 依賴時,則 Class 才存在,并創建 Tomcat 的容器工廠類 TomcatServletWebServerFactory@Configuration@ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })
@ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {

@Beanpublic TomcatServletWebServerFactory tomcatServletWebServerFactory(){
return new TomcatServletWebServerFactory();
}
}

// 當引用的是 Jetty Maven 依賴時,@ConditionalOnClass 條件才滿足,
// 創建的容器工廠類是 JettyServletWebServerFactory@Configuration@ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })
@ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedJetty {

@Beanpublic JettyServletWebServerFactory JettyServletWebServerFactory(){
return new JettyServletWebServerFactory();
}
}

// 當引用的是 Undertow Maven 依賴時,@ConditionalOnClass 條件才滿足,
// 創建的容器工廠類是 UndertowServletWebServerFactory@Configuration@ConditionalOnClass({ Servlet.class, Undertow.class, SslClientAuthMode.class })
@ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedUndertow {

@Beanpublic UndertowServletWebServerFactory undertowServletWebServerFactory(){
return new UndertowServletWebServerFactory();
}
}

可以看到,主要是通過引入相應 Web 容器的 Maven 依賴,來判斷容器對應的 Class 是否存在,存在則創建相應的容器工廠類。

4、總結

最后,來對 Spring Boot 嵌入式 Web 容器做一個整體的總結。Spring Boot 支持的兩大 Web 容器體系,一個是 Servlet Web ,另一個是 Reactive Web ,它們都有其具體的容器實現,相信大多數開發者使用的都是前者,且最常用的容器實現也是 Tomcat,所以這篇文章主要討論的也是 Spring Boot 啟動 Tomcat 嵌入式容器的流程。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-07-28 08:52:08

Docker命令操作系統

2022-04-07 09:29:04

文件系統硬盤操作系統

2021-12-14 09:34:31

丑數順序指針

2024-07-26 09:47:28

2022-01-10 06:52:59

拖拽庫項目搜索

2024-01-30 09:14:35

容器資源管理

2023-06-27 13:47:00

分布式事務本地事務

2023-07-04 08:06:40

數據庫容器公有云

2023-11-06 08:28:43

2024-04-29 13:07:00

運維保命原則Oracle

2023-11-07 08:13:53

分布式網絡

2022-06-28 08:16:35

MySQL數據容災

2022-03-08 17:52:58

TCP格式IP

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤服務器

2022-01-17 06:59:40

Grep指令linux

2021-07-28 07:53:20

Github ActiDotnet 應用

2023-02-09 08:35:39

Spring嵌入式容器

2022-03-31 18:59:43

數據庫InnoDBMySQL
點贊
收藏

51CTO技術棧公眾號

精品捆绑美女sm三区| 成人欧美一区二区三区1314| 欧美在线影院在线视频| 国产7777777| 日韩精品久久久久久久软件91| 亚洲一二三区视频在线观看| 久久久久久久久一区| 一级片一区二区三区| 影音先锋亚洲一区| 色伦专区97中文字幕| 成人免费看片载| 97欧美成人| 亚洲国产成人porn| 这里只有精品66| 外国精品视频在线观看 | 欧美成年人视频| 三上悠亚ssⅰn939无码播放| 国产精品xnxxcom| 91电影在线观看| 男人天堂手机在线视频| 麻豆传媒在线免费看| 91污片在线观看| 亚洲japanese制服美女| 尤物视频免费观看| 欧美成人69av| 中文字幕亚洲激情| 亚洲欧美日本一区| 亚洲成人影音| 欧美精品在欧美一区二区少妇| www黄色日本| 678在线观看视频| 亚洲精品乱码久久久久久久久 | 精品少妇人妻av一区二区三区| 国产成人精品一区二区三区在线| 欧美午夜久久久| 日韩精品在线中文字幕| 在线观看的网站你懂的| 亚洲三级在线免费观看| 相泽南亚洲一区二区在线播放| 青青九九免费视频在线| 成人免费av在线| 亚洲一区制服诱惑| 一炮成瘾1v1高h| 美女视频黄频大全不卡视频在线播放| 97成人精品区在线播放| 日本特黄特色aaa大片免费| 亚洲中无吗在线| 色偷偷av亚洲男人的天堂| 成人激情五月天| 国产影视精品一区二区三区| 国产丝袜高跟一区| 免费看污片网站| 怕怕欧美视频免费大全| 精品偷拍各种wc美女嘘嘘| 久久精品女同亚洲女同13| 国产美女撒尿一区二区| 精品99一区二区三区| 亚洲女则毛耸耸bbw| 97一区二区国产好的精华液| 日韩欧美一级二级三级| 国产又黄又嫩又滑又白| 亚洲伊人影院| 日韩av一区二区在线| 中文字幕一区二区三区人妻不卡| 亚洲精品小区久久久久久| 亚洲男人天堂2024| 超薄肉色丝袜一二三| 日韩啪啪电影网| 美女少妇精品视频| 国产一级在线视频| 羞羞视频在线观看欧美| 国产精品久久久久久超碰| 91在线公开视频| 国产99久久久国产精品潘金| 国产一区二区三区无遮挡| 免费在线黄色网址| 国产精品国产自产拍在线| 日本不卡一区二区三区四区| 黄色羞羞视频在线观看| 色综合久久综合中文综合网| 日本人69视频| 北条麻妃一区二区三区在线观看 | 91久久极品少妇xxxxⅹ软件 | 日本道在线视频| www在线观看黄色| 色综合久久久久| 中国黄色片一级| 黄色免费大全亚洲| 尤物99国产成人精品视频| 久久国产美女视频| 99精品国产福利在线观看免费| 日韩av成人在线观看| 国产又黄又粗又猛又爽| a亚洲天堂av| 亚洲自拍偷拍二区| 麻豆免费版在线观看| 欧美日韩dvd在线观看| 人妻换人妻a片爽麻豆| 欧美一区三区| 国内精品久久久久| 91成人国产综合久久精品| 成人中文字幕在线| 亚洲五月六月| 麻豆蜜桃在线观看| 欧美一区二区三区四区久久| 精品人妻互换一区二区三区| 亚洲天堂免费| 国产国语刺激对白av不卡| 国产www视频| 国产欧美一区二区三区沐欲| 国产手机免费视频| 婷婷成人av| 精品无人国产偷自产在线| 欧美日韩中文字幕在线观看| 日韩影院在线观看| 久久一区免费| 国产美女福利在线观看| 91精品国产一区二区人妖| 亚洲欧美va天堂人熟伦| 亚洲一级在线| http;//www.99re视频| 色哟哟免费在线观看| 色婷婷久久久久swag精品| 国产不卡一二三| 国内久久视频| 99影视tv| 1769免费视频在线观看| 制服视频三区第一页精品| 日本一区二区视频在线播放| 亚洲欧美卡通另类91av| 好吊妞www.84com只有这里才有精品 | 精品3atv在线视频| 亚洲精品网址在线观看| 日本网站在线免费观看| 国产成人精品aa毛片| 亚洲小说欧美另类激情| 国产成+人+综合+亚洲欧美| 一本大道亚洲视频| 中文字幕 国产精品| 久久综合网色—综合色88| 国产午夜伦鲁鲁| 国内精品国产成人国产三级粉色 | 亚洲国产欧美久久| 国产精品99精品| 成人的网站免费观看| 国产欧美精品aaaaaa片| 91嫩草精品| 国模精品系列视频| 亚洲欧洲综合在线| 欧美视频第一页| 亚洲熟妇无码av| 久热精品视频| 日韩精品不卡| 欧美视频在线视频精品| 色老头一区二区三区| 91福利免费视频| 亚洲激情图片小说视频| 国产精品99精品无码视亚| 国产一区日韩一区| 精品国产乱码久久久久久郑州公司 | 亚洲高清在线观看视频| 亚洲va韩国va欧美va精品 | 亚洲精品蜜桃乱晃| 国产成人精品电影久久久| 91大神在线网站| 欧美高清精品3d| 九九九在线视频| 99久久免费精品| 日本成人在线免费视频| 日韩成人精品一区二区| 91免费版黄色| 老牛影视精品| 在线观看不卡av| 国产jzjzjz丝袜老师水多| 亚洲成人自拍偷拍| 欧美熟妇激情一区二区三区| 久久99精品国产91久久来源| av一区二区三区免费观看| 青青草久久爱| 国产综合视频在线观看| japanese色国产在线看视频| 亚洲人在线观看| 999精品国产| 黄色精品一区二区| 国产又色又爽又高潮免费| 国产91丝袜在线播放九色| 欧美极品欧美精品欧美图片| 欧美残忍xxxx极端| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 女人抽搐喷水高潮国产精品| 国产欧美精品久久久| 波多野结衣乳巨码无在线观看| 国产亚洲欧美日韩美女| 精品人妻久久久久一区二区三区| 欧美视频不卡中文| 青青草手机视频在线观看| 久久久久久久免费视频了| www激情五月| 视频在线在亚洲| 中国丰满熟妇xxxx性| 日韩欧美国产精品综合嫩v| 1区1区3区4区产品乱码芒果精品| 交100部在线观看| 久久久国产在线视频| 玖玖综合伊人| 亚洲国产成人精品久久| 国产精品欧美激情在线| 色婷婷综合在线| 国产一级免费观看| 中文字幕五月欧美| 亚洲天堂久久新| 成人性视频免费网站| gai在线观看免费高清| 久久久人人人| 国产精品久久久久久久久电影网| 清纯唯美亚洲综合一区| 另类小说综合网| 国产欧美自拍一区| 成人欧美一区二区三区视频xxx| 欧美激情三区| 国产精品国产自产拍高清av水多| 美女扒开腿让男人桶爽久久软| 欧美成人剧情片在线观看| 福利视频在线导航| 亚洲色图第一页| 天天综合网在线| 亚洲国产99精品国自产| 亚洲第一视频在线| 日韩亚洲欧美一区| 91亚洲国产成人久久精品麻豆| 在线观看免费视频综合| 中文字幕精品三级久久久| 亚洲自拍偷拍麻豆| 劲爆欧美第一页| 亚洲理论在线观看| 福利所第一导航| 亚洲免费观看视频| 91麻豆精品成人一区二区| 国产精品无人区| 国产又黄又粗的视频| 久久亚洲一级片| 97超碰在线免费观看| 91丨九色丨尤物| 加勒比一区二区| 久久网站热最新地址| 黄色aaa视频| 国产日韩高清在线| 亚洲天堂av中文字幕| 亚洲欧洲一区二区在线播放| 萌白酱视频在线| 亚洲人成7777| 久久激情免费视频| 亚洲成人高清在线| 视频一区二区三区四区五区| 欧美丝袜一区二区| 男人天堂2024| 欧美天堂一区二区三区| 黄色一区二区视频| 欧美精品粉嫩高潮一区二区| av中文字幕播放| 精品国产亚洲在线| 香蕉视频黄色片| 中文国产亚洲喷潮| av网站导航在线观看免费| 欧美精品久久久久久久久久| 蜜桃视频动漫在线播放| 国产精品96久久久久久又黄又硬 | 校园激情久久| 色综合色综合色综合色综合| 韩国v欧美v亚洲v日本v| 亚洲视频 中文字幕| 久久综合999| 网爆门在线观看| 亚洲一线二线三线视频| 日本熟女毛茸茸| 欧美精品tushy高清| 亚洲国产成人精品一区二区三区| 日韩av在线免费看| 97超碰人人在线| 欧美成人免费全部| 中文字幕一区久| 亚洲xxxxx| 日本成人中文| 日韩视频在线免费播放| 亚洲黄色影院| 性chinese极品按摩| 国产精品123| 国产精品免费无码| 亚洲精品乱码久久久久久日本蜜臀| 中文字幕亚洲精品一区| 欧美高清dvd| 欧美挠脚心网站| 久久天堂电影网| 日韩pacopacomama| 99re在线观看| 日韩欧美一区免费| 日本网站免费在线观看| 国产精品中文字幕欧美| 男人舔女人下部高潮全视频| 一区二区三区四区av| jizz国产在线| 亚洲国产日韩欧美在线图片| 人人干在线视频| 日本亚洲欧洲色| 成人在线视频你懂的| 中文精品一区二区三区| 久久国产毛片| 你懂的在线观看网站| 1024精品合集| 少妇一级淫片日本| 亚洲国产另类久久精品 | 浅井舞香一区二区| 一区二区亚洲视频| 国产成年人在线观看| 久久免费国产| 国产xxxx视频| 一区二区三区欧美日韩| 91精品在线视频观看| 国产亚洲精品91在线| 黄色18在线观看| 成人xxxxx色| 91成人免费| 亚洲一级免费在线观看| 国产日产精品1区| av黄色在线看| 亚洲国产成人精品女人久久久 | 婷婷激情图片久久| 国产三级国产精品国产专区50| 26uuu国产电影一区二区| 日本少妇激情舌吻| 精品国产免费人成电影在线观看四季| 超碰免费在线播放| 成人黄色短视频在线观看| 欧美日中文字幕| av免费网站观看| 久久蜜臀精品av| 黑人精品无码一区二区三区AV| 亚洲第一区中文字幕| 黄色污污视频在线观看| 99一区二区三区| 尹人成人综合网| 中文字幕乱视频| 精品久久中文字幕| 日本一级在线观看| 日本免费久久高清视频| 久久99性xxx老妇胖精品| 国产三区在线视频| 国产亚洲欧美在线| 在线观看国产区| 中文字幕日韩电影| 成人国产精品久久| 欧美日韩午夜爽爽| 国产精品亚洲专一区二区三区| 青娱乐91视频| 亚洲国产黄色片| 韩漫成人漫画| 一区高清视频| 国产高清成人在线| 国产精品6666| 亚洲欧美国产精品va在线观看| 欧美国产日韩电影| 中文字幕超清在线免费观看| 国产成人午夜电影网| 国产成人精品一区二三区| 亚洲人成电影在线播放| 九九热这里有精品| 久久精品在线免费视频| 成人高清av在线| 无码人妻精品一区二区50| 日韩在线视频免费观看高清中文| 国产美女亚洲精品7777| 免费av手机在线观看| 亚洲国产高清不卡| 性做久久久久久久久久| 欧美亚洲在线播放| 色喇叭免费久久综合网| 岛国大片在线免费观看| 日韩欧美一区视频| 麻豆传媒免费在线观看| 国产精品美女诱惑| 欧美aa在线视频| 国产亚洲精品女人久久久久久| 精品夜色国产国偷在线| 久久青草免费| 欧美日韩成人免费视频| 国产精品理伦片| 蜜桃视频污在线观看| 国产精品久久久久久久app| 影音先锋日韩精品| 四虎永久免费影院| 欧美一区国产二区| 黑人巨大精品| 大胆欧美熟妇xx| 国产精品视频免费| 五月天婷婷视频| 国产在线视频一区| 小嫩嫩精品导航| 麻豆疯狂做受xxxx高潮视频| 国产亚洲福利一区| 久久久伦理片|