精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久久亚洲国产精品| 国产一区二区三区在线播放免费观看| 尤物国产精品| 亚洲精品国产精品国| 国产亚洲一级| 色婷婷综合久久久久| 秘密基地免费观看完整版中文| 黄网av在线| 国产片一区二区| 成人网页在线免费观看| 国产一级一片免费播放放a| 亚洲人成精品久久久| 3atv一区二区三区| 99久久久无码国产精品6| 高h视频在线观看| 99久久国产综合精品女不卡| 国产成+人+综合+亚洲欧洲| 免费三片在线播放| 91视频综合| 亚洲裸体xxxx| 免费看黄色片的网站| 欧美天堂视频| 红桃av永久久久| 天天在线免费视频| 日本午夜在线| av在线综合网| 粉嫩av四季av绯色av第一区 | 综合电影一区二区三区| 国产精品久久久一区二区三区| 欧美视频xxxx| 噜噜噜躁狠狠躁狠狠精品视频| 精品中文字幕在线2019| 久久一区二区电影| 好吊妞视频这里有精品| 51久久夜色精品国产麻豆| 中文字幕亚洲区| 91久久国产精品91久久性色| 男人天堂2024| 国产欧美另类| 国语对白做受69| 欧美成人一区二区三区高清| 希岛爱理av一区二区三区| 在线精品国产成人综合| 精品国产av无码| 婷婷综合一区| 精品少妇一区二区三区在线视频| 91插插插影院| 国产一区二区高清在线| 91精品国产一区二区三区香蕉| 美女一区二区三区视频| 秋霞国产精品| 欧美日韩国产不卡| 成年人三级黄色片| 看片一区二区| 欧美性videosxxxxx| 亚洲视频在线观看一区二区三区| 男人久久天堂| 精品久久久国产| 欧美视频在线观看网站| 男人av在线播放| 色哟哟一区二区在线观看| 免费av网址在线| 在线看欧美视频| 欧美日韩dvd在线观看| 一级做a免费视频| 免费视频观看成人| 日韩美女一区二区三区四区| 69亚洲乱人伦| 亚洲婷婷伊人| 一本色道久久综合狠狠躁篇怎么玩| 欧美亚一区二区三区| 国产99久久| 日韩在线播放一区| 欧美成人精品欧美一级| 亚洲精品偷拍| 国产精品美女久久| 一级淫片免费看| 国产精品一品二品| 久久精品午夜一区二区福利| 国产69久久| a级影片在线观看| 国产亚洲美州欧州综合国| 色一情一乱一伦一区二区三区 | 国产一区二区小视频| 国产馆精品极品| 鲁鲁狠狠狠7777一区二区| 95在线视频| 一区二区在线观看免费| 少妇性饥渴无码a区免费| 国内自拍亚洲| 亚洲激情视频在线| 91无套直看片红桃在线观看| 欧美日韩国产成人精品| 国产福利精品在线| 国产黄色小视频在线观看| 2019国产精品| 在线观看成人免费| 手机看片久久| 精品国产99国产精品| 婷婷无套内射影院| av在线小说| 欧美日韩一二三区| 少妇被狂c下部羞羞漫画| 日韩av在线播放网址| 国语自产精品视频在线看| 一区二区视频播放| 久久综合久久综合久久综合| japanese在线视频| 蜜臀国产一区| 精品国产乱码久久久久久蜜臀| 久久久久亚洲AV成人无在| 精品久久久中文字幕| 欧美狂野另类xxxxoooo| 婷婷中文字幕在线观看| 性爽视频在线| 欧美一三区三区四区免费在线看| 成人免费毛片糖心| 亚洲高清不卡| 97se视频在线观看| 国产在线激情| 中文字幕免费一区二区三区| 日韩三级中文字幕| 成熟妇人a片免费看网站| 日韩欧美精品一区| 欧美综合第一页| 亚洲精品97久久中文字幕| 91丨九色丨蝌蚪富婆spa| 日韩和欧美的一区二区| 91丝袜在线| 欧美成人欧美edvon| 亚洲精品午夜视频| 久久久久久穴| 成人一区二区在线| 青青青国内视频在线观看软件| 欧美美女bb生活片| 成都免费高清电影| 国产精品久久久久一区二区三区厕所 | 久久日韩精品一区二区五区| 日韩在线电影一区| 性欧美gay| 亚洲乱码av中文一区二区| 久久久久久久蜜桃| 大胆亚洲人体视频| 亚洲理论电影在线观看| 日韩国产亚洲欧美| 欧美日中文字幕| 俺去亚洲欧洲欧美日韩| 国产99免费视频| 久久精品无码一区二区三区| 一区二区三区国产福利| 日韩av福利| 欧美人妇做爰xxxⅹ性高电影| 人妻视频一区二区| 蜜臀va亚洲va欧美va天堂 | wwwxxx在线观看| 亚洲图片欧美色图| 亚洲av无码久久精品色欲| 伊人色**天天综合婷婷| 99在线观看视频网站| 国内在线视频| 亚洲美女性生活视频| 久久午夜鲁丝片| 99精品国产一区二区青青牛奶| 91最新在线免费观看| 欧美卡一卡二| 成人免费视频网站在线观看| 欧美刺激性大交免费视频| 国产乱色精品成人免费视频| 久久久久久久久久久久久女国产乱| 国产精品少妇在线视频| 亚洲国产中文在线| 久久久久久久影院| 香蕉视频黄在线观看| 99精品国产视频| 久久亚洲免费| 欧美人与性动交α欧美精品济南到| 精品国精品国产| 在线观看免费av片| 1024成人网| 亚洲自拍偷拍精品| 免费一级欧美片在线观看| 国产亚洲精品久久久久久久| 欧洲亚洲成人| 亚洲成人1区2区| 亚洲精品日韩精品| 亚洲国产欧美日本视频| 日韩在线观看网址| 亚洲精品午夜国产va久久成人| 国产三级一区二区三区| 色哟哟网站在线观看| 石原莉奈一区二区三区在线观看| 久久影视中文粉嫩av| 996久久国产精品线观看| 欧美成人手机在线| 免费在线高清av| 日韩精品一区在线观看| 草视频在线观看| 99精品视频免费在线观看| 五月婷婷之婷婷| 色婷婷综合久久久久久| 久久成年人视频| 国产女主播在线写真| 精品福利在线导航| 国产精华7777777| 午夜精品成人在线视频| 免费国产羞羞网站美图| 波多野结衣在线一区| 人妻丰满熟妇av无码区app| 色天天综合网| 欧美一区1区三区3区公司| 91亚洲无吗| 91美女高潮出水| 精品国产欧美日韩一区二区三区| 久久久欧美一区二区| 国产一二区在线观看| 久久66热偷产精品| 久99久视频| 北条麻妃一区二区三区在线观看| 亚洲欧洲日本专区| 国产一区二区波多野结衣| 欧洲人成人精品| 久久黄色精品视频| 第一福利永久视频精品| 最新日韩免费视频| wwww国产精品欧美| 你懂的在线观看网站| 国产.欧美.日韩| 国产在线视频三区| 日本不卡一区二区| 成年人视频在线免费| 国产偷自视频区视频一区二区| 蜜臀在线免费观看| 成人网ww555视频免费看| 欧美专区在线观看| 欧美电影免费观看| 日韩av在线免费观看| 肥臀熟女一区二区三区| 欧美mv日韩mv国产网站| 刘亦菲毛片一区二区三区| 自拍av一区二区三区| 超碰97在线资源站| 9i在线看片成人免费| 久久久午夜精品福利内容| proumb性欧美在线观看| 中文字幕乱码在线| 欧美日韩国产网站| 亚洲精品一区二区三区影院| 日本韩国免费观看| 亚洲狼人国产精品| 黑鬼狂亚洲人videos| 亚洲免费综合| 特级西西人体www高清大胆| 亚洲欧美综合久久久| a级片一区二区| 亚洲精品美女91| 国产超级av在线| 一本色道久久| 成年人小视频网站| 日韩中文字幕麻豆| 亚洲va在线va天堂va偷拍| 亚洲色诱最新| 999在线免费视频| 精品在线一区二区三区| 亚洲精品综合在线观看| 国产91丝袜在线18| 亚洲精品乱码久久| 国产亚洲一区二区三区在线观看| 成人黄色短视频| 一区二区三区毛片| 久久精品国产成人av| 正在播放国产对白害羞| 日本爱爱小视频| 久久久久国产成人精品亚洲午夜| 日韩一级视频在线观看| 中文字幕+乱码+中文字幕一区| 波多野结衣久久久久| 夜夜爽夜夜爽精品视频| 久久国产视频一区| 欧美精品xxxxbbbb| 人妻妺妺窝人体色www聚色窝| 亚洲欧洲国产精品| 超碰caoporn久久| 97avcom| h1515四虎成人| 成人免费看片网站| 污视频软件在线观看| 菠萝蜜视频在线观看一区| 欧美老熟妇乱大交xxxxx| 中文字幕在线观看一区二区| 国产精品suv一区二区69| 欧美最猛黑人xxxxx猛交| 精品人妻一区二区三区蜜桃| 亚洲理论在线a中文字幕| 超鹏97在线| 国产精品激情av电影在线观看 | 国产精品日韩一区二区| 国产91精品对白在线播放| 日本香蕉视频在线观看| 蜜臀久久99精品久久久久久9| 久久久久亚洲无码| 亚洲丝袜美腿综合| 无码人妻精品一区二区| 亚洲成人网av| av免费在线观| 国产精品无码专区在线观看 | 先锋影音一区二区三区| 亚洲视频久久| 免费网站在线观看黄| 日本一区免费视频| 亚洲男人第一av| 欧美成人一级视频| 爆操欧美美女| 国产欧美欧洲在线观看| 自拍偷拍一区| 国产精品久久..4399| 国产麻豆精品在线观看| 极品尤物一区二区| 日本久久电影网| 视频一区二区在线播放| 久久久人成影片一区二区三区观看| 91麻豆精品国产综合久久久 | 日韩欧美国产精品| 黄色网址在线免费播放| 国产精品视频播放| 精品国产精品久久一区免费式 | 久久精品国产亚洲AV无码麻豆| 欧美老女人在线| 人人干在线视频| 日本精品久久久久影院| 日韩成人动漫在线观看| 国产精品www在线观看| 国产成人精品三级麻豆| 男的操女的网站| 欧美一级在线免费| 中文在线字幕免费观看| 亚洲一区中文字幕| 欧美在线视屏| 日本高清免费在线视频| 亚洲免费在线看| 精品久久久免费视频| 欧美巨大黑人极品精男| 视频欧美一区| 欧美一级爱爱视频| 亚洲国产综合网| 一区二区三区天堂av| 午夜激情成人网| 日韩wuma| 麻豆成人av在线| 在线看的片片片免费| 欧美一区二区啪啪| 人人澡人人添人人爽一区二区| 99国产视频在线| 亚洲三级毛片| 99久久人妻无码精品系列| 色av一区二区| 免费在线你懂的| 91亚洲精品视频| 亚洲大片在线| 成人精品999| 欧美高清www午色夜在线视频| 国产在线高清视频| 高清视频一区| 久久美女性网| 美女av免费看| 日韩视频免费观看高清完整版 | 国模私拍视频在线播放| 国产欧美日韩视频一区二区三区| 国产视频亚洲| 超碰人人干人人| 日韩一区二区在线看| 123区在线| 日韩欧美国产二区| 国产真实乱子伦精品视频| 久久这里只有精品免费| 亚洲欧美日韩国产中文| 亚洲午夜国产成人| 欧美精品一区二区三区三州| 国产欧美一区二区精品久导航 | 先锋影音日韩| 国产成人啪免费观看软件| 五月婷婷色丁香| 色av吧综合网| 欧美日韩另类图片| 一道本在线免费视频| 亚洲国产综合视频在线观看| 国产高清视频在线观看| 98国产高清一区| 日韩av中文字幕一区二区| 国产黄色片在线免费观看| 日韩h在线观看| 一区二区三区| 国产99久久九九精品无码| 亚洲天堂成人在线观看| 三级视频网站在线| 亚洲xxxxx性| 日韩精品乱码免费| 国产无遮挡又黄又爽| 色老头一区二区三区| 欧美日韩一区二区三区四区不卡 | 久久免费午夜影院|