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

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

開發(fā) 架構
雖然市面上已經(jīng)有了大量成熟穩(wěn)定用于支撐系統(tǒng)建設的輪子,也就是服務、框架、組件、工具等,但對于一些較大型的公司來說,這些輪子可能并不一定能很好的支撐起系統(tǒng)需要承載的服務體量,這個時候就需要自建一些輪子。

[[387506]]

目錄

  • 一、前言
  • 二、什么是腳手架呢?
  • 三、誰提供了腳手架?
    • 1、Spring 官網(wǎng)腳手架
    • 2、阿里云腳手架
  • 四、手擼一個腳手架!
    • 1. 工程框架
    • 2. 應用層定義生成類接口
    • 3. FTL 模板定義
    • 4. FTL 生成文件
    • 5. 創(chuàng)建框架入口
    • 6. 測試驗證
  • 五、源碼下載
  • 六、總結
  • 七、系列推薦

一、前言

為什么我們要去造輪子?

造輪子的核心目的,是為了解決通用共性問題的凝練和復用。

雖然市面上已經(jīng)有了大量成熟穩(wěn)定用于支撐系統(tǒng)建設的輪子,也就是服務、框架、組件、工具等,但對于一些較大型的公司來說,這些輪子可能并不一定能很好的支撐起系統(tǒng)需要承載的服務體量,這個時候就需要自建一些輪子。

而提倡的不重復造輪子,新造輪子不一定能保證穩(wěn)定性。一般用在以官網(wǎng)推出的核心輪子上是適合的,比如 SpringBoot、Netty、HBase 等。但對于一些特殊場景的解決方案工具型組件,通常是沒有完全符合的輪子的,就像 SpringBoot 腳手架。

其實每個較大型的公司都會有很多同類技術服務的組件,例如 RPC、數(shù)據(jù)庫路由、注冊中心、分布式任務、MQ隊列消息等,而這時候腳手架的開發(fā)就需要適配這些組件,搭建出符合自己公司技術棧實現(xiàn)需要的系統(tǒng)架構。這不同于一些較小的互聯(lián)網(wǎng)公司,可以完全使用 SpringBoot 提供的一整套解決方案

另外,造輪子是個人技術沉淀、也是薪資待遇的積累!別說造不了飛機,只是你沒有提供場地!

有什么場景還能造輪子?

 

用于架構基建下的所有模塊都可以成為輪子,通常我們都是在這些場景下:負載均衡、服務網(wǎng)關、服務治理、框架語言、服務組件、數(shù)據(jù)承載、框架結構、部署方式、工具插件,建設需要的輪子。

其實一個較成熟的互聯(lián)網(wǎng)公司,大部分場景下的輪子,已基本建造完了。剩下的一般是用于解決業(yè)務場景下非業(yè)務邏輯的通用性組件,例如,高并發(fā)下的緩存熱Key、Redis 層路由、活動邀請的不唯一短碼生成,等等類似這樣的場景。但此類場景的輪子建設也是非常有價值的,在公司層面使用穩(wěn)定后,還可以推廣到市場獲得一定的認可,以及更好的會被收入到 Apache 項目。

二、什么是腳手架呢?

What is scaffolding? Is it a term for a particular platform?

Scaffolding is a meta-programming method of building database-backed software applications. It is a technique supported by some model-view-controller frameworks, in which the programmer may write a specification that describes how the application database may be used. The compiler uses this specification to generate code that the application can use to create, read, update and delete database entries, effectively treating the template as a "scaffold" on which to build a more powerful application.

  • https://stackoverflow.com/questions/235018/what-is-scaffolding-is-it-a-term-for-a-particular-platform

 

結合 stackoverflow 上的回答,腳手架是一種元編程方法,用于構建基于數(shù)據(jù)的應用。創(chuàng)建系統(tǒng)架構的程序員編寫一份規(guī)格說明書,用于描述怎么去使用數(shù)據(jù)庫。而腳手架可以根據(jù)這份規(guī)則說明書生成相應的框架代碼。我們把這種模式成為腳手架,在腳手架上更高效的構建出powerful 的應用!

說白了就是簡化具有共性重復操作的簡單工作,不再需要程序員還得一點點粘貼復制,克隆出一個已經(jīng)存在的架構。只需要在界面或者公用接口上,傳入必要的參數(shù),就可以創(chuàng)建出一個應用開發(fā)框架。

三、誰提供了腳手架?

1、Spring 官網(wǎng)腳手架

 

  • 推薦:⭐⭐⭐⭐
  • 鏈接:https://start.spring.io
  • 源碼:https://github.com/spring-io/start.spring.io
  • 描述:Spring Initializr 本質(zhì)上也是一個 Web 應用,它可以通過 Web 界面、Spring Tool Suite、IntelliJ IDEA 等方式,構建出一個基本的 Spring Boot 項目結構。同時可以使用它的源碼進行本地部署

2、阿里云腳手架

 

  • 推薦:⭐⭐⭐⭐
  • 鏈接:https://start.spring.io
  • 描述:Aliyun Java Initializr 和 Spring Initializr 是同類的 Web 服務,是代碼框架生成器,一鍵生成你的代碼框架,有完善的工具鏈,免費的IDEA插件,方便直接在IDE中生成,完善的工具鏈,免費的IDEA插件,方便直接在IDE中生成,同時也非常適合國內(nèi)用戶的網(wǎng)絡環(huán)境。

其實,這兩個腳手架都能很好的生成項目結構,讓程序員可以在統(tǒng)一的標準下快速的進入開發(fā)環(huán)境。只是依賴于自身選擇的支撐服務,選擇不同的框架就可以了。

四、手擼一個腳手架!

都有腳手架了,那為什么要自己擼一個呢?

腳手架的目的是為了在統(tǒng)一的標準下快速建設系統(tǒng)框架,把系統(tǒng)開發(fā)過程中需要的配置、組件、服務、測試,一并通過配置引入到系統(tǒng)開發(fā)中。

但有些時候在互聯(lián)網(wǎng)公司通用的腳手架是不太合適使用的,因為它沒有把公司內(nèi)的一些自研性質(zhì)的組件引入進去,也不能很好的融合。如果已經(jīng)用腳手架生成后還得需要研發(fā)人員自己大量復制進去一些特定的組件,就破壞了腳手架本身能力,也是破壞了準則和規(guī)范。

所以,需要結合腳手架的開發(fā)能力,包裝各類特定組件、服務、配置,實現(xiàn)符合公司領域的統(tǒng)一腳手架。

那么,本章節(jié)就帶著大家看看一個腳手架,該如何開發(fā)實現(xiàn)。其實并沒有太負責,我們可以使用 freemarker 的能力,構建系統(tǒng)框架。

1. 工程框架

  1. EasyRiggerInitializr 
  2. └── src 
  3.     ├── main 
  4.     │   ├── java 
  5.     │   │   └── cn.bugstack.initializr.rigger 
  6.     │   │       ├── application 
  7.     │   │       │  └── IProjectGenerator.java 
  8.     │   │       ├── domain 
  9.     │   │       │  ├── model 
  10.     │   │       │  │   └── ApplicationInfo.java      
  11.     │   │       │  │   └── ProjectInfo.java  
  12.     │   │       │  └── service 
  13.     │   │       │      ├── module 
  14.     │   │       │      │   ├── impl 
  15.     │   │       │      │   │   ├── GenerationApplication.java 
  16.     │   │       │      │   │   ├── GenerationIgnore.java 
  17.     │   │       │      │   │   ├── GenerationPackageInfo.java 
  18.     │   │       │      │   │   ├── GenerationPom.java 
  19.     │   │       │      │   │   ├── GenerationTest.java     
  20.     │   │       │      │   │   └── GenerationYml.java      
  21.     │   │       │      │   └── BaseModule.java     
  22.     │   │       │      └── ProjectGeneratorImpl.java 
  23.     │   │       └── RiggerApplication.java 
  24.     │   └── resources  
  25.     │       ├── generator 
  26.     │       │   ├── application.ftl 
  27.     │       │   ├── ignore.ftl  
  28.     │       │   ├── package-info.ftl  
  29.     │       │   ├── pom.ftl  
  30.     │       │   ├── test.ftl      
  31.     │       │   └── yml.ftl     
  32.     │       └── application.yml 
  33.     └── test 
  34.          └── java 
  35.              └── cn.bugstack.initializr.rigger.test 
  36.                  └── ApiTest.java 

 

整個用于創(chuàng)建腳手架的工程并不復雜,主要就是通過 freemarker 對各類定義的 ftl 模板文件,生成對應的系統(tǒng)框架結構。這里包括:工程主體、框架結構、啟動類、配置文件、測試類等,也可以結合自身需求把對應 ORM 的類和映射關系生成出來。

整個工程結構偏 DDD 層次結構,domain 領域中建設了所有的生成方式,resources/generator 定義生成模板,其他地方就沒有太大的差異了。

接下來簡單介紹下這個工程的代碼,讓大家可以理解這樣的工程是如何開發(fā)的,也可以通過這樣工程繼續(xù)完善成自己需要的結構。

2. 應用層定義生成類接口

  • cn.bugstack.initializr.rigger.application.IProjectGenerator.java
  1. public interface IProjectGenerator { 
  2.  
  3.     void generator(ProjectInfo projectInfo) throws Exception; 
  4.  

DDD 的分層結構,通常都會在 application 這個比較薄的層定義接口,再有 domain 領域?qū)幼鱿鄳膶崿F(xiàn)。

這個接口的定義主要是為了,讓外部調(diào)用方可以通過此接口創(chuàng)建工程框架。

3. FTL 模板定義

什么是 FreeMarker?

 

FreeMarker 是一款 模板引擎:即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發(fā)產(chǎn)品的組件。

模板編寫為FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。那就意味著要準備數(shù)據(jù)在真實編程語言中來顯示,比如數(shù)據(jù)庫查詢和業(yè)務運算, 之后模板顯示已經(jīng)準備好的數(shù)據(jù)。在模板中,你可以專注于如何展現(xiàn)數(shù)據(jù), 而在模板之外可以專注于要展示什么數(shù)據(jù)。

FreeMarker 在線手冊:http://freemarker.foofun.cn

3.1 application.ftl

  1. package ${packageName}; 
  2.  
  3. import org.springframework.boot.SpringApplication; 
  4. import org.springframework.boot.autoconfigure.SpringBootApplication; 
  5.  
  6. @SpringBootApplication 
  7. public class ${className} { 
  8.  
  9.     public static void main(String[] args) { 
  10.         SpringApplication.run(${className}.class, args); 
  11.     } 
  12.  

3.2 pom.ftl

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
  4.     <modelVersion>4.0.0</modelVersion> 
  5.     <parent> 
  6.         <groupId>org.springframework.boot</groupId> 
  7.         <artifactId>spring-boot-starter-parent</artifactId> 
  8.         <version>2.1.6.RELEASE</version> 
  9.         <relativePath/> <!-- lookup parent from repository --> 
  10.     </parent> 
  11.     <groupId>${groupId}</groupId> 
  12.     <artifactId>${artifactId}</artifactId> 
  13.     <version>${version}</version> 
  14.     <name>${name}</name
  15.     <description>${description}</description> 
  16.      
  17. </project> 

3.3 yml.ftl

  1. server: 
  2.   port: 8081 

以上,只是用于生成框架文件的基礎 ftl 文件,有需要一些特殊判斷和邏輯的,可以參考FreeMarker 在線手冊,編寫自己需要的 ftl 文件。

4. FTL 生成文件

cn.bugstack.initializr.rigger.domain.service.module.impl.GenerationApplication.java

  1. @Service 
  2. public class GenerationApplication extends BaseModule { 
  3.  
  4.     private Logger logger = LoggerFactory.getLogger(GenerationApplication.class); 
  5.  
  6.     public void doGeneration(ProjectInfo projectInfo, String projectsRoot, String lastPackageName, StringBuffer applicationJavaName) throws Exception { 
  7.  
  8.         ApplicationInfo applicationInfo = new ApplicationInfo( 
  9.                 projectInfo.getGroupId() + "." + lastPackageName, 
  10.                 applicationJavaName.toString() 
  11.         ); 
  12.  
  13.         String packagePath = applicationInfo.getPackageName().replace(".""/") + "/"
  14.  
  15.         File file = new File(projectsRoot + projectInfo.getArtifactId() + "/src/main/java/" + packagePath, 
  16.                 applicationInfo.getClassName() + ".java"); 
  17.  
  18.         // 寫入文件 
  19.         super.writeFile(file, "application.ftl", applicationInfo); 
  20.  
  21.         logger.info("創(chuàng)建主入口類 Application.java {}", file.getPath()); 
  22.     } 
  23.  
  • 關于 ftl 文件的使用,無論在用于生成那一層的文件,基本都是通用。這里只展示一下關于 Application.java 的創(chuàng)建。
  • 主要包括了,定義入?yún)?ApplicationInfo、定義文件位置 /src/main/java/、以及寫入到文件 super.writeFile,這三方面。

5. 創(chuàng)建框架入口

cn.bugstack.initializr.rigger.domain.service.ProjectGeneratorImpl.java

  1. @Service 
  2. public class ProjectGeneratorImpl implements IProjectGenerator { 
  3.  
  4.     private Logger logger = LoggerFactory.getLogger(ProjectGeneratorImpl.class); 
  5.  
  6.     @Resource 
  7.     private GenerationApplication generationApplication; 
  8.     @Resource 
  9.     private GenerationYml generationYml; 
  10.     @Resource 
  11.     private GenerationPom generationPom; 
  12.     @Resource 
  13.     private GenerationTest generationTest; 
  14.     @Resource 
  15.     private GenerationIgnore generationIgnore; 
  16.     @Resource 
  17.     private GenerationPackageInfo generationPackageInfo; 
  18.  
  19.     @Override 
  20.     public void generator(ProjectInfo projectInfo) throws Exception { 
  21.  
  22.         URL resource = this.getClass().getResource("/"); 
  23.         String projectsRoot = resource.getFile() + "/projects/"
  24.  
  25.         String lastPackageName = projectInfo.getArtifactId().replaceAll("-""").toLowerCase(); 
  26.         //啟動類名稱 
  27.         String[] split = projectInfo.getArtifactId().split("-"); 
  28.         StringBuffer applicationJavaName = new StringBuffer(); 
  29.         Arrays.asList(split).forEach(s -> { 
  30.             applicationJavaName.append(s.substring(0, 1).toUpperCase() + s.substring(1)); 
  31.         }); 
  32.         applicationJavaName.append("Application"); 
  33.  
  34.         // 1. 創(chuàng)建  Application.java 
  35.         generationApplication.doGeneration(projectInfo, projectsRoot, lastPackageName, applicationJavaName); 
  36.  
  37.         // 2. 生成 application.yml 
  38.         generationYml.doGeneration(projectInfo, projectsRoot); 
  39.  
  40.         // 3. 生成 pom.xml 
  41.         generationPom.doGeneration(projectInfo, projectsRoot); 
  42.  
  43.         // 4. 創(chuàng)建測試類 ApiTest.java 
  44.         generationTest.doGeneration(projectInfo, projectsRoot, lastPackageName, applicationJavaName); 
  45.  
  46.         // 5. 生成 .gitignore 
  47.         generationIgnore.doGeneration(projectInfo, projectsRoot); 
  48.  
  49.         // 6. DDD 四層描述文件 
  50.         generationPackageInfo.doGeneration(projectInfo, projectsRoot, lastPackageName, applicationJavaName); 
  51.  
  52.     } 
  53.  

ProjectGeneratorImpl 類,就是應用層接口 IProjectGenerator 在領域?qū)拥木唧w實現(xiàn)。這里包括了如下內(nèi)容:

  • 創(chuàng)建 Application.java
  • 生成 application.yml
  • 生成 pom.xml
  • 創(chuàng)建測試類 ApiTest.java
  • 生成 .gitignore
  • DDD 四層描述文件

綜上,就是整個腳手架生成的簡要介紹,其實并沒有多復雜,主要就是 ftl 文件的定義和使用,這種創(chuàng)建腳手架的方式還是很方便的。

6. 測試驗證

單元測試@Testpublic void test_IProjectGenerator() throws Exception { ProjectInfo projectInfo = new ProjectInfo( "cn.bugstack.demo", "web-test", "1.0.0-SNAPSHOT", "web-test", "Demo project for Spring Boot" ); iProjectGenerator.generator(projectInfo);}

測試結果


 

 

腳手架把創(chuàng)建出來的工程生成到 test-classes 下,這個路徑也可以配置到其他路徑里。

有了新生成的工程就可以通過 IDEA 打開了,與我們手動創(chuàng)建的工程是一樣的。

五、源碼下載

 

  • 源碼下載:關注公眾號:bugstack蟲洞棧,回復:腳手架
  • 項目介紹:SpringBoot 腳手架,簡化項目構建。目前的項目工程還比較簡單,非常適合新人學習使用。后續(xù)我們會在這個版本的基礎上陸續(xù)完善一些功能,把RPC、MQ、注冊中心、網(wǎng)關、等各類組件融合進來,方便選擇性的構建和擴展。

六、總結

 

  • 站在公司角度不重復造輪子是為了各部門職責和資源的成本,但對個人來說,不能因為一句不重復造輪子,就放棄了對知識棧深入學習的機會。
  • 沒有這些根基的學習,也壓根不會理解技術的遷移、服務的提取、組件的凝練。反反復復的總是做一些 API 的應用包殼,對個人技術上也就沒有什么成長。
  • 最后說回來,哪怕公司不需要你造輪子,沒關系,你可以造給自己,可以分享到 Github 社區(qū)。一方面是自己的學習匯總,另一方面也是對技術的沉淀和貢獻。

 

責任編輯:武曉燕 來源: bugstack蟲洞棧
相關推薦

2021-01-07 05:34:07

腳手架JDK緩存

2016-08-10 14:59:41

前端Javascript工具

2016-09-07 15:35:06

VueReact腳手架

2025-05-16 07:24:41

Springkafka腳手架

2021-12-23 10:35:32

SpringCloud腳手架架構

2020-03-20 08:32:41

物聯(lián)網(wǎng)腳手架傳感器

2021-05-21 05:22:52

腳手架工具項目

2018-08-30 16:08:37

Node.js腳手架工具

2022-04-24 11:33:47

代碼管理工程

2023-11-21 17:36:04

OpenFeignSentinel

2019-12-25 15:20:48

前端腳手架命令

2018-06-11 14:39:57

前端腳手架工具node.js

2023-09-21 11:03:31

開發(fā)輪子工具

2021-06-02 17:58:49

腳手架 冪等性前端

2014-08-15 09:36:06

2021-08-03 10:43:17

AI 數(shù)據(jù)人工智能

2024-03-11 13:18:00

RustClap項目

2020-09-19 09:47:05

AI 數(shù)據(jù)人工智能

2020-06-29 11:35:02

Spring BootJava腳手架

2022-01-14 14:09:11

腳手架代碼自定義
點贊
收藏

51CTO技術棧公眾號

日韩欧美精品电影| 日本福利片高清在线观看| 亚洲一区色图| 亚洲国产天堂久久国产91| 亚洲国产精品久久久久婷蜜芽| 久久r这里只有精品| 国产精品zjzjzj在线观看| 91福利在线播放| 黄色网zhan| 欧美日韩视频精品二区| 精品亚洲成a人在线观看| 欧美激情免费看| 日本污视频网站| 一区二区三区四区精品视频| 色哟哟亚洲精品| 777久久精品一区二区三区无码| 国内自拍视频在线播放| 先锋资源久久| 精品亚洲夜色av98在线观看 | 九九九九九国产| 波多野结衣在线观看| 久久精品视频免费| 粉嫩av四季av绯色av第一区| 亚洲 欧美 日韩 综合| 图片小说视频色综合| 亚洲欧美国产va在线影院| 97精品人人妻人人| 日韩一级特黄| 91精品福利在线| 欧美男女爱爱视频| 中文字幕在线观看网站| 欧美国产在线观看| 麻豆精品视频| 五月激情婷婷综合| 成人午夜看片网址| 99免费在线视频观看| 国产又粗又猛又爽又黄的| 久久激情婷婷| 97avcom| 久久久久久久久艹| 亚洲深深色噜噜狠狠爱网站| 中文字幕欧美日韩va免费视频| 日韩av自拍偷拍| 色猫猫成人app| 欧美日韩免费在线观看| 青草青青在线视频| 爱福利在线视频| 亚洲午夜在线观看视频在线| 波多野结衣 作品| 国产日产一区二区| 亚洲精品国产高清久久伦理二区| 久久国产精品免费一区| 人妻一区二区三区免费| 粉嫩一区二区三区性色av| www.成人av| 蜜臀久久精品久久久久| 成人av在线电影| 精品乱色一区二区中文字幕| 人妻精品无码一区二区| 99在线精品视频| 久久久综合香蕉尹人综合网| 理论视频在线| 中文在线一区二区 | 啊啊啊国产视频| 亚洲mmav| 欧美精品日韩一本| 一卡二卡三卡四卡五卡| 精品视频自拍| 亚洲欧美日韩国产成人| 亚洲一二三四视频| 亚洲v在线看| 欧美精品videosex牲欧美| 四虎永久在线精品| 久久精品麻豆| 成人a在线观看| 国产91麻豆视频| 久久久久久毛片| 宅男av一区二区三区| 里番在线播放| 欧美性生活大片免费观看网址| 日本亚洲欧洲精品| 黄色在线观看网站| 亚洲已满18点击进入久久| 成人免费aaa| 国产香蕉久久| 亚洲第一av网站| 怡红院一区二区三区| 中文字幕一区二区av | 青青草视频在线免费直播| 五月天网站亚洲| www.99在线| 麻豆精品一区| 亚洲精品视频在线观看视频| 欧美成人久久久免费播放| 午夜日韩视频| 国产精品99一区| 亚洲成a人片77777精品| 久久久久综合网| 樱空桃在线播放| 性欧美hd调教| 亚洲第一中文字幕在线观看| jizz18女人高潮| 99精品视频免费观看| 国产日韩亚洲欧美| 神马久久高清| 一区二区三区在线视频观看58 | 久久综合桃花网| 欧美jizz19性欧美| 久久综合88中文色鬼| 中文字幕黄色片| 国产精品一区二区在线观看不卡| 日韩**中文字幕毛片| 国产精品久久久久久久一区二区| 日韩专区欧美专区| 国产高清在线一区二区| eeuss影院在线观看| 午夜一区二区三区在线观看| 日韩视频在线观看一区二区三区| av手机免费在线观看| 欧美日韩大陆一区二区| 中文字幕av网址| 在线精品在线| 99久久一区三区四区免费| 啊v视频在线| 狠狠干狠狠久久| 亚洲美女高潮久久久| 亚洲乱码免费伦视频| 国产精品第一页在线| 午夜国产在线观看| 亚洲制服欧美中文字幕中文字幕| 亚洲色婷婷久久精品av蜜桃| 欧美色网在线| 亚洲欧美日韩中文在线| 久久午夜免费视频| 成人午夜激情在线| 妺妺窝人体色www看人体| 一级欧美视频| 中文字幕亚洲精品| 国产精品xxxxxx| 久久久亚洲午夜电影| 欧美变态另类刺激| jizzjizzjizz欧美| 欧美福利视频在线| 性猛交xxxx乱大交孕妇印度| 亚洲免费av高清| 丰满人妻一区二区三区大胸| 欧美福利网址| 99在线高清视频在线播放| 色噜噜狠狠狠综合欧洲色8| 91精品国产综合久久香蕉麻豆| 91欧美视频在线| 成人激情在线| 国产精品爽爽爽| 欧美被日视频| 7777精品伊人久久久大香线蕉超级流畅| 日本人dh亚洲人ⅹxx| 亚洲欧美网站在线观看| 亚洲一区二区三区四区视频 | 亚洲欧美在线一区| 精品国产乱子伦| 中文字幕va一区二区三区| 三上悠亚在线一区二区| 三级电影一区| 久久天天做天天爱综合色| 久久影院理伦片| 欧美一级大片| 中文字幕亚洲欧美一区二区三区 | 亚洲综合精品自拍| 真实乱偷全部视频| 日韩香蕉视频| 欧美日韩高清在线一区| 欧美大胆性生话| 色偷偷av一区二区三区乱| 国产精品无码天天爽视频| 亚洲美女在线一区| 国产精品熟妇一区二区三区四区| 国产99精品| 成人激情黄色网| 欧美理论电影| 国产亚洲一区二区精品| 精品一区二三区| 亚洲欧美视频在线观看视频| 国产艳妇疯狂做爰视频 | 久久婷婷五月综合色丁香| www.国产一区| 六月婷婷综合网| 色诱亚洲精品久久久久久| 美国一级片在线观看| 国产成人高清在线| 茄子视频成人免费观看| 欧美mv日韩| 精品日本一区二区| 国产91欧美| 国模精品视频一区二区| 国产午夜精品一区理论片| 日韩一区和二区| 无码人妻丰满熟妇精品 | 日本乱人伦a精品| 亚洲s色大片| 亚洲成在人线av| 中文字幕在线观看你懂的| 亚洲国产一区二区三区青草影视| 污免费在线观看| 亚洲欧美日韩专区| 蜜臀在线免费观看| 国产九一精品| 国产在线精品一区二区中文| 日韩一区中文| 2018日韩中文字幕| 亚洲精品一线| 中文字幕精品视频| 飘雪影视在线观看免费观看| 日韩一级二级三级精品视频| 国产九色91回来了| 精品欧美国产一区二区三区| 一区二区视频免费看| 国产蜜臀97一区二区三区| 国产黑丝一区二区| 国产精品一区二区x88av| 波多野结衣天堂| 日韩午夜高潮| 国产日韩亚洲欧美在线| 91视频综合| 日韩在线第一区| 国产不卡一区| 久久久久久九九九九| www.国产精品一区| 91精品国产99久久久久久红楼 | 欧美怡红院视频一区二区三区 | 97国产一区二区| 性生活一级大片| 韩国成人精品a∨在线观看| 亚洲免费看av| 老司机久久99久久精品播放免费| 日韩一区二区三区高清| 亚洲宅男网av| 欧美精品123| 欧美美女啪啪| 精品视频一区二区| 美女呻吟一区| 亚洲在线免费播放| wwwwxxxx国产| 99精品视频免费在线观看| 久久精品无码专区| 国产精品一区二区91| 成人免费播放视频| 国产精品正在播放| 在线成人精品视频| 国产传媒欧美日韩成人| 天天操夜夜操很很操| 国产精品亚洲一区二区三区妖精| www.中文字幕在线| 亚洲国产日韩在线| 久久精品免费一区二区| 久久香蕉精品| 九热视频在线观看| 麻豆91精品视频| 五月天视频在线观看| 精品一区二区在线观看| 免费人成视频在线播放| 国产精品自拍三区| 亚洲婷婷在线观看| 久久综合五月天婷婷伊人| 手机av免费看| 国产精品青草久久| 九九九免费视频| 香港成人在线视频| 樱花视频在线免费观看| 欧美日韩美女一区二区| 国产99999| 精品国产免费视频| 黄色视屏网站在线免费观看| 在线看国产精品| 亚洲h片在线看| 91超碰caoporn97人人| 欧美大片1688网站| 91欧美精品成人综合在线观看| 免费成人美女女| 91色琪琪电影亚洲精品久久| 国产色噜噜噜91在线精品| 免费看成人午夜电影| 精品久久久久久久久久久aⅴ| 国产一区二区久久久| 自拍欧美一区| 中文字幕一区二区三区有限公司| 国产欧美一区二区三区精品观看| 国产精品初高中精品久久| 神马香蕉久久| 久久久一二三四| 中文亚洲欧美| 91网址在线观看精品| 99国产精品一区| 亚洲 欧美 国产 另类| 亚洲一区二区精品视频| 激情五月婷婷网| 日韩欧美国产三级电影视频| 欧美另类自拍| 久久99精品久久久久久青青91| 黄在线免费观看| 欧美性一区二区三区| 成人黄色91| 日韩精品欧美一区二区三区| 欧美一区在线看| 污污视频网站免费观看| 国产成人免费av在线| 无码国产69精品久久久久同性| 91麻豆精品秘密| 精品欧美一区二区久久久久| 色8久久精品久久久久久蜜| 性做久久久久久久| 中文字幕日韩欧美在线| 最新日韩精品| 国产厕所精品在线观看| 999国产精品永久免费视频app| 青青草原国产免费| 久久蜜桃精品| 波多野结衣影院| 一区二区免费看| 亚洲在线观看av| 亚洲天堂成人在线视频| av电影免费在线看| yellow视频在线观看一区二区| 9l视频自拍九色9l视频成人| 神马影院一区二区三区| 9色精品在线| 欧美xxxx×黑人性爽| 一区二区三区加勒比av| 91丨九色丨丰满| 中文字幕日韩欧美在线| 日韩电影av| 欧美精品免费观看二区| 亚洲一区亚洲| 免费黄色三级网站| 亚洲午夜精品17c| 精品人妻伦一二三区久久| 久久综合电影一区| av一级久久| 麻豆md0077饥渴少妇| 国内精品写真在线观看| 国产稀缺精品盗摄盗拍| 欧美精品v国产精品v日韩精品| 黑人精品一区二区| 蜜臀久久99精品久久久无需会员| 欧美调教sm| 久久99国产精品| 一本色道88久久加勒比精品| 亚洲一区二区三区黄色| 午夜久久久久久久久久一区二区| 中文字幕在线日本| 国产亚洲激情在线| 精品日本视频| 艳色歌舞团一区二区三区| 蜜桃久久久久久| 五月天色婷婷丁香| 日韩视频永久免费| 日本三级在线观看网站| 成人情视频高清免费观看电影| 国产精品亚洲片在线播放| 熟妇人妻va精品中文字幕 | 日本又骚又刺激的视频在线观看| 亚洲视频在线观看免费| 日韩免费福利视频| 五月天色一区| 精品一区二区免费在线观看| 国产探花在线免费观看| 精品国产乱码久久久久久久久| 午夜免费视频在线国产| 91手机视频在线观看| 欧美色图首页| 国产呦小j女精品视频| 欧洲另类一二三四区| 97超碰人人在线| 成人国产在线激情| 精品动漫3d一区二区三区免费版 | 六九午夜精品视频| 久久久一二三四| 99久久免费视频.com| 超碰在线免费97| 欧美成人在线免费| 欧美三级电影在线| 中文字幕视频在线免费观看| 亚洲美女少妇撒尿| 天天av天天翘| 国产精品丝袜白浆摸在线| 欧美激情自拍| 人人人妻人人澡人人爽欧美一区| 亚洲成人午夜电影| av在线中文| 亚洲最大激情中文字幕| 亚洲在线国产日韩欧美| 色撸撸在线视频| 精品成人佐山爱一区二区| 素人一区二区三区| 欧美 日韩 亚洲 一区| 欧美高清一级片在线观看| 亚洲欧美另类视频| 国产一区二中文字幕在线看 | 亚洲午夜精品福利| 国产成人av影院| 在线免费一区二区|