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

一文讀懂微內核架構

開發 架構
微內核是一種典型的架構模式 ,區別于普通的設計模式,架構模式是一種高層模式,用于描述系統級的結構組成、相互關系及相關約束。

 [[361063]]

本文轉載自微信公眾號「 JAVA日知錄」,作者 JAVA日知錄 。轉載本文請聯系 JAVA日知錄公眾號。

什么是微內核架構?

微內核是一種典型的架構模式 ,區別于普通的設計模式,架構模式是一種高層模式,用于描述系統級的結構組成、相互關系及相關約束。微內核架構在開源框架中的應用非常廣泛,比如常見的 ShardingSphere 還有Dubbo都實現了自己的微內核架構。那么,在介紹什么是微內核架構之前,我們有必要先闡述這些開源框架會使用微內核架構的原因。

為什么要使用微內核架構?

微內核架構本質上是為了提高系統的擴展性 。所謂擴展性,是指系統在經歷不可避免的變更時所具有的靈活性,以及針對提供這樣的靈活性所需要付出的成本間的平衡能力。也就是說,當在往系統中添加新業務時,不需要改變原有的各個組件,只需把新業務封閉在一個新的組件中就能完成整體業務的升級,我們認為這樣的系統具有較好的可擴展性。

就架構設計而言,擴展性是軟件設計的永恒話題。而要實現系統擴展性,一種思路是提供可插拔式的機制來應對所發生的變化。當系統中現有的某個組件不滿足要求時,我們可以實現一個新的組件來替換它,而整個過程對于系統的運行而言應該是無感知的,我們也可以根據需要隨時完成這種新舊組件的替換。

比如在 ShardingSphere 中提供的分布式主鍵功能,分布式主鍵的實現可能有很多種,而擴展性在這個點上的體現就是, 我們可以使用任意一種新的分布式主鍵實現來替換原有的實現,而不需要依賴分布式主鍵的業務代碼做任何的改變 。

微內核架構模式為這種實現擴展性的思路提供了架構設計上的支持,ShardingSphere 基于微內核架構實現了高度的擴展性。在介紹如何實現微內核架構之前,我們先對微內核架構的具體組成結構和基本原理做簡要的闡述。

什么是微內核架構?

從組成結構上講, 微內核架構包含兩部分組件:內核系統和插件 。這里的內核系統通常提供系統運行所需的最小功能集,而插件是獨立的組件,包含自定義的各種業務代碼,用來向內核系統增強或擴展額外的業務能力。在 ShardingSphere 中,前面提到的分布式主鍵就是插件,而 ShardingSphere 的運行時環境構成了內核系統。

那么這里的插件具體指的是什么呢?這就需要我們明確兩個概念,一個概念就是經常在說的 API ,這是系統對外暴露的接口。而另一個概念就是 SPI(Service Provider Interface,服務提供接口),這是插件自身所具備的擴展點。就兩者的關系而言,API 面向業務開發人員,而 SPI 面向框架開發人員,兩者共同構成了 ShardingSphere 本身。

可插拔式的實現機制說起來簡單,做起來卻不容易,我們需要考慮兩方面內容。一方面,我們需要梳理系統的變化并把它們抽象成多個 SPI 擴展點。另一方面, 當我們實現了這些 SPI 擴展點之后,就需要構建一個能夠支持這種可插拔機制的具體實現,從而提供一種 SPI 運行時環境 。

如何實現微內核架構?

事實上,JDK 已經為我們提供了一種微內核架構的實現方式,就是JDK SPI。這種實現方式針對如何設計和實現 SPI 提出了一些開發和配置上的規范,ShardingSphere、Dubbo 使用的就是這種規范,只不過在這基礎上進行了增強和優化。所以要理解如何實現微內核架構,我們不妨先看看JDK SPI 的工作原理。

JDK SPI

SPI(Service Provider Interface)主要是被框架開發人員使用的一種技術。例如,使用 Java 語言訪問數據庫時我們會使用到 java.sql.Driver 接口,不同數據庫產品底層的協議不同,提供的 java.sql.Driver 實現也不同,在開發 java.sql.Driver 接口時,開發人員并不清楚用戶最終會使用哪個數據庫,在這種情況下就可以使用 Java SPI 機制在實際運行過程中,為 java.sql.Driver 接口尋找具體的實現。

下面我們通過一個簡單的示例演示一下JDK SPI的使用方式:

首先我們定義一個生成id鍵的接口,用來模擬id生成

  1. public interface IdGenerator { 
  2.     /** 
  3.      * 生成id 
  4.      * @return 
  5.      */ 
  6.     String generateId(); 

然后創建兩個接口實現類,分別用來模擬uuid和序列id的生成

  1. public class UuidGenerator implements IdGenerator { 
  2.     @Override 
  3.     public String generateId() { 
  4.         return UUID.randomUUID().toString(); 
  5.     } 
  6.  
  7. public class SequenceIdGenerator implements IdGenerator { 
  8.     private final AtomicLong atomicId = new AtomicLong(100L); 
  9.     @Override 
  10.     public String generateId() { 
  11.         long leastId = this.atomicId.incrementAndGet(); 
  12.         return String.valueOf(leastId); 
  13.     } 

在項目的resources/META-INF/services 目錄下添加一個名為com.github.jianzh5.spi.IdGenerator的文件,這是 JDK SPI 需要讀取的配置文件,內容如下:

  1. com.github.jianzh5.spi.impl.UuidGenerator 
  2. com.github.jianzh5.spi.impl.SequenceIdGenerator 

創建main方法,讓其加載上述的配置文件,創建全部IdGenerator 接口實現的實例,并執行生成id的方法。

  1. public class GeneratorMain { 
  2.     public static void main(String[] args) { 
  3.         ServiceLoader<IdGenerator> serviceLoader = ServiceLoader.load(IdGenerator.class); 
  4.         Iterator<IdGenerator> iterator = serviceLoader.iterator(); 
  5.         while(iterator.hasNext()){ 
  6.             IdGenerator generator = iterator.next(); 
  7.             String id = generator.generateId(); 
  8.             System.out.println(generator.getClass().getName() + "  >>id:" + id); 
  9.         } 
  10.     } 

執行結果如下:

JDK SPI 源碼分析

通過上述示例,我們可以看到 JDK SPI 的入口方法是 ServiceLoader.load() 方法,在這個方法中首先會嘗試獲取當前使用的 ClassLoader,然后調用 reload() 方法,調用關系如下圖所示:

調用關系

在 reload() 方法中,首先會清理 providers 緩存(LinkedHashMap 類型的集合),該緩存用來記錄 ServiceLoader 創建的實現對象,其中 Key 為實現類的完整類名,Value 為實現類的對象。之后創建 LazyIterator 迭代器,用于讀取 SPI 配置文件并實例化實現類對象。

  1. public void reload() { 
  2.  providers.clear(); 
  3.  lookupIterator = new LazyIterator(service, loader); 

在前面的示例中,main() 方法中使用的迭代器底層就是調用了 ServiceLoader.LazyIterator 實現的。Iterator 接口有兩個關鍵方法:hasNext() 方法和 next() 方法。這里的 LazyIterator 中的 next() 方法最終調用的是其 nextService() 方法,hasNext() 方法最終調用的是 hasNextService() 方法,我們來看看 hasNextService()方法的具體實現:

  1. private static final String PREFIX = "META-INF/services/";  
  2. Enumeration<URL> configs = null;  
  3. Iterator<String> pending = null;  
  4. String nextName = null;  
  5. private boolean hasNextService() { 
  6.  if (nextName != null) { 
  7.   return true
  8.  } 
  9.  if (configs == null) { 
  10.   try { 
  11.    //META-INF/services/com.github.jianzh5.spi.IdGenerator 
  12.    String fullName = PREFIX + service.getName(); 
  13.    if (loader == null
  14.     configs = ClassLoader.getSystemResources(fullName); 
  15.    else 
  16.     configs = loader.getResources(fullName); 
  17.   } catch (IOException x) { 
  18.    fail(service, "Error locating configuration files", x); 
  19.   } 
  20.  } 
  21.  // 按行SPI遍歷配置文件的內容  
  22.  while ((pending == null) || !pending.hasNext()) { 
  23.   if (!configs.hasMoreElements()) { 
  24.    return false
  25.   } 
  26.   // 解析配置文件  
  27.   pending = parse(service, configs.nextElement()); 
  28.  } 
  29.  // 更新 nextName字段  
  30.  nextName = pending.next(); 
  31.  return true

在 hasNextService() 方法中完成 SPI 配置文件的解析之后,再來看 LazyIterator.nextService() 方法,該方法「負責實例化 hasNextService() 方法讀取到的實現類」,其中會將實例化的對象放到 providers 集合中緩存起來,核心實現如下所示:

  1. private S nextService() {  
  2.     String cn = nextName;  
  3.     nextName = null;  
  4.     // 加載 nextName字段指定的類  
  5.     Class<?> c = Class.forName(cn, false, loader);  
  6.     if (!service.isAssignableFrom(c)) { // 檢測類型  
  7.         fail(service, "Provider " + cn  + " not a subtype");  
  8.     }  
  9.     S p = service.cast(c.newInstance()); // 創建實現類的對象  
  10.     providers.put(cn, p); // 將實現類名稱以及相應實例對象添加到緩存  
  11.     return p;  
  12. }  

以上就是在 main() 方法中使用的迭代器的底層實現。最后,我們再來看一下 main() 方法中使用 ServiceLoader.iterator() 方法拿到的迭代器是如何實現的,這個迭代器是依賴 LazyIterator 實現的一個匿名內部類,核心實現如下:

  1. public Iterator<S> iterator() {  
  2.     return new Iterator<S>() {  
  3.         // knownProviders用來迭代providers緩存  
  4.         Iterator<Map.Entry<String,S>> knownProviders  
  5.             = providers.entrySet().iterator();  
  6.         public boolean hasNext() {  
  7.             // 先走查詢緩存,緩存查詢失敗,再通過LazyIterator加載  
  8.             if (knownProviders.hasNext())   
  9.                 return true;  
  10.             return lookupIterator.hasNext();  
  11.         }  
  12.         public S next() {  
  13.             // 先走查詢緩存,緩存查詢失敗,再通過 LazyIterator加載  
  14.             if (knownProviders.hasNext())  
  15.                 return knownProviders.next().getValue();  
  16.             return lookupIterator.next();  
  17.         }  
  18.         // 省略remove()方法  
  19.     };  
  20. }  

JDK SPI 在 JDBC 中的應用

了解了 JDK SPI 實現的原理之后,我們再來看實踐中 JDBC 是如何使用 JDK SPI 機制加載不同數據庫廠商的實現類。

JDK 中只定義了一個 java.sql.Driver 接口,具體的實現是由不同數據庫廠商來提供的。這里我們就以 MySQL 提供的 JDBC 實現包為例進行分析。

在 mysql-connector-java-*.jar 包中的 META-INF/services 目錄下,有一個 java.sql.Driver 文件中只有一行內容,如下所示:

  1. com.mysql.cj.jdbc.Driver 

在使用 mysql-connector-java-*.jar 包連接 MySQL 數據庫的時候,我們會用到如下語句創建數據庫連接:

  1. String url = "jdbc:xxx://xxx:xxx/xxx";  
  2. Connection conn = DriverManager.getConnection(url, username, pwd);  

「DriverManager 是 JDK 提供的數據庫驅動管理器」,其中的代碼片段,如下所示:

  1. static {  
  2.     loadInitialDrivers(); 
  3.     println("JDBC DriverManager initialized");  
  4. }  

在調用 getConnection() 方法的時候,DriverManager 類會被 Java 虛擬機加載、解析并觸發 static 代碼塊的執行;在 loadInitialDrivers()方法中通過 JDK SPI 掃描 Classpath 下 java.sql.Driver 接口實現類并實例化,核心實現如下所示:

  1. private static void loadInitialDrivers() {  
  2.     String drivers = System.getProperty("jdbc.drivers")  
  3.     // 使用 JDK SPI機制加載所有 java.sql.Driver實現類  
  4.     ServiceLoader<Driver> loadedDrivers =   
  5.            ServiceLoader.load(Driver.class);  
  6.     Iterator<Driver> driversIterator = loadedDrivers.iterator();  
  7.     while(driversIterator.hasNext()) {  
  8.         driversIterator.next();  
  9.     }  
  10.     String[] driversList = drivers.split(":");  
  11.     for (String aDriver : driversList) { // 初始化Driver實現類  
  12.         Class.forName(aDriver, true,  
  13.             ClassLoader.getSystemClassLoader());  
  14.     }  
  15. }  

在 MySQL 提供的 com.mysql.cj.jdbc.Driver 實現類中,同樣有一段 static 靜態代碼塊,這段代碼會創建一個 com.mysql.cj.jdbc.Driver 對象并注冊到 DriverManager.registeredDrivers 集合中(CopyOnWriteArrayList 類型),如下所示:

  1. static {  
  2.    java.sql.DriverManager.registerDriver(new Driver());  

在 getConnection() 方法中,DriverManager 從該 registeredDrivers 集合中獲取對應的 Driver 對象創建 Connection,核心實現如下所示:

  1. private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException {  
  2.     // 省略 try/catch代碼塊以及權限處理邏輯  
  3.     for(DriverInfo aDriver : registeredDrivers) {  
  4.         Connection con = aDriver.driver.connect(url, info);  
  5.         return con;  
  6.     }  
  7. }  

小結

本文我們詳細講述了微內核架構的一些基本概念并通過一個示例入手,介紹了 JDK 提供的 SPI 機制的基本使用,然后深入分析了 JDK SPI 的核心原理和底層實現,對其源碼進行了深入剖析,最后我們以 MySQL 提供的 JDBC 實現為例,分析了 JDK SPI 在實踐中的使用方式。

 

掌握了JDK的SPI機制就等于掌握了微內核架構的核心,以上,希望對你有所幫助!

 

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-05-18 09:48:58

前端開發架構

2022-04-26 06:04:11

零信任網絡安全

2023-11-08 08:21:52

MVPMVVMMVI

2025-09-19 09:52:19

2021-08-04 16:06:45

DataOps智領云

2023-12-22 19:59:15

2022-09-22 09:00:46

CSS單位

2022-11-06 21:14:02

數據驅動架構數據

2018-09-28 14:06:25

前端緩存后端

2025-04-03 10:56:47

2023-11-27 17:35:48

ComponentWeb外層

2023-05-20 17:58:31

低代碼軟件

2022-10-20 08:01:23

2022-07-05 06:30:54

云網絡網絡云原生

2022-12-01 17:23:45

2021-12-29 18:00:19

無損網絡網絡通信網絡

2022-07-26 00:00:03

語言模型人工智能

2025-10-14 09:01:20

2018-08-22 17:58:01

數據平臺數據倉庫架構

2023-08-27 21:02:14

點贊
收藏

51CTO技術棧公眾號

欧美高清www午色夜在线视频| 99精品欧美一区二区三区小说| 中文字幕无线精品亚洲乱码一区 | 黄上黄在线观看| 日韩av一二三| 欧美另类99xxxxx| 91玉足脚交白嫩脚丫| 日韩精品三区| 一区二区国产盗摄色噜噜| 久久国产精品免费一区| 老熟妇一区二区三区啪啪| 亚洲精品91| 国产婷婷成人久久av免费高清| 欧美黄色性生活| 国产黄色大片在线观看| 国产欧美日韩综合| 成人自拍爱视频| 波多野结衣小视频| 国产精品chinese| 在线视频欧美日韩精品| 性农村xxxxx小树林| 欧美日一区二区三区| 亚洲一区欧美一区| 亚洲一区二区三区欧美| 色呦呦免费观看| 久久se这里有精品| 国产91精品久久久久久| 免费在线观看一级片| 啪啪亚洲精品| 亚洲福利视频二区| 午夜免费福利网站| 精品网站在线| 欧美日韩国产综合新一区| 黄色免费高清视频| 国产精品免费观看| 91美女在线视频| 国产精品.com| 国产一区二区三区黄片| 葵司免费一区二区三区四区五区| 精品国模在线视频| 337人体粉嫩噜噜噜| 你懂的在线观看一区二区| 69成人精品免费视频| 日本xxxx黄色| 四虎影视4hu4虎成人| 懂色av影视一区二区三区| 欧美日韩中文字幕在线播放| 色三级在线观看| 久久亚洲欧美国产精品乐播| 福利视频一区二区三区| 国产情侣一区二区| 国产精品一区专区| 亚洲自拍偷拍网址| 国产成人精品一区二三区四区五区| 久久精品午夜| 国产成人激情视频| 无码人妻丰满熟妇区bbbbxxxx| 国产日韩欧美高清免费| 97精品欧美一区二区三区| 顶臀精品视频www| 亚洲va在线| 超碰91人人草人人干| 美国黄色片视频| 99热国内精品| 欧美大胆a视频| 久久婷婷综合国产| 亚洲毛片播放| 青青青国产精品一区二区| 国产三级av片| 快she精品国产999| 国产精品一香蕉国产线看观看 | 青草在线视频在线观看| 一片黄亚洲嫩模| 国产一区二区三区小说| 高清视频在线观看三级| 色88888久久久久久影院野外| 人人干人人视频| 在线观看亚洲精品福利片| 欧美一区二区三区成人| 日韩精品人妻中文字幕有码| 蜜桃久久久久| 亚洲性无码av在线| 国产视频精品免费| 精品动漫3d一区二区三区免费版 | 国产91丝袜在线播放九色| 国产精品我不卡| 先锋av资源站| 国产精品天干天干在线综合| 蜜桃视频成人在线观看| 97天天综合网| 欧美亚洲尤物久久| 亚洲精品鲁一鲁一区二区三区 | 久久精品免费在线| 亚洲综合激情| 成人中心免费视频| 日韩永久免费视频| 欧美韩日一区二区三区| 国产在线视频综合| 欧亚一区二区| 欧美岛国在线观看| 一级二级黄色片| 狠色狠色综合久久| 国产精品成人av性教育| 国产伦理吴梦梦伦理| 99re热视频精品| 影音先锋欧美资源| 午夜影院在线播放| 日韩一区二区三区在线| 无码人妻精品一区二区中文| 亚洲欧美色图| 国产精品久久久久久久久借妻| 午夜精品在线播放| 中文字幕av资源一区| 免费无码毛片一区二三区| 欧美91在线|欧美| 亚洲精品久久久久| 青草草在线视频| 日本午夜一区二区| 韩国成人av| 成人在线播放| 欧美写真视频网站| 久久国产精品无码一级毛片| 综合激情视频| 国产精品一区专区欧美日韩| 欧洲综合视频| 天天免费综合色| 日韩欧美中文视频| 欧美精品一区二区三区中文字幕 | 久久久久久天堂| 免费成人性网站| 欧美成人在线免费观看| 黄页网站大全在线免费观看| 欧美精品高清视频| 性の欲びの女javhd| 午夜一区不卡| 精品高清视频| 白浆视频在线观看| 日韩欧美国产1| 日韩av手机在线免费观看| 日韩电影在线免费| 欧美日韩综合精品| 黄色综合网址| 亚洲欧美中文字幕在线一区| 中文字幕一区二区三区手机版| 国产呦萝稀缺另类资源| 亚洲午夜久久久影院伊人| 性欧美videohd高精| 亚洲欧美资源在线| 亚洲天堂一区在线| www久久精品| 日本免费一级视频| 尤物tv在线精品| 日韩免费av片在线观看| 免费a在线观看| 91极品视觉盛宴| 亚洲综合色一区| 久久免费黄色| 神马一区二区影院| 日韩五码电影| 久久色免费在线视频| 99热这里只有精品99| 一区二区在线免费观看| 亚洲熟女一区二区三区| 在线观看的日韩av| 久久精彩视频| 欧美成a人片在线观看久| 夜夜躁日日躁狠狠久久88av| 国产三级理论片| 中文字幕亚洲综合久久菠萝蜜| 福利片一区二区三区| 亚洲精品888| 国产精品区一区二区三含羞草| 成人黄色动漫| 日韩成人免费视频| 欧美 亚洲 另类 激情 另类| 最新中文字幕一区二区三区| 国产人妻精品午夜福利免费| 国产欧美午夜| 色噜噜狠狠一区二区三区| 欧美性生活一级| 欧美人在线观看| 国产精品国产高清国产| 欧美在线免费视屏| 福利所第一导航| 久久综合五月天婷婷伊人| 日本a√在线观看| 牛牛国产精品| 青青草久久网络| 91成人app| 97在线看福利| 在线观看黄色av| 欧美精品一区在线观看| 天天综合久久综合| 一区二区三区视频在线观看| 97人妻精品一区二区免费| 韩国v欧美v亚洲v日本v| 鲁一鲁一鲁一鲁一色| 久久网站免费观看| 国产主播一区二区三区四区| 国产一区二区三区四区五区3d| 欧美国产激情18| 国产高清在线观看| 欧美精品一区视频| 在线观看毛片av| 欧美日韩裸体免费视频| 伊人久久久久久久久久久久久久| 不卡视频在线观看| 热久久久久久久久| 免费在线成人| 日韩成人三级视频| 不卡在线一区二区| 国内视频一区| 嫩呦国产一区二区三区av| 日av在线播放中文不卡| 2024最新电影免费在线观看| 亚洲欧洲偷拍精品| 色婷婷av一区二区三| 5566中文字幕一区二区电影| 亚洲天堂一区在线观看| 亚洲男人天堂一区| 操她视频在线观看| 久久久高清一区二区三区| 日本人妻一区二区三区| 加勒比av一区二区| 成人免费视频久久| 在线视频免费在线观看一区二区| 无颜之月在线看| 99精品全国免费观看视频软件| 欧美日韩国产高清视频| 日韩极品少妇| 国产一区二区三区色淫影院| 日韩中文字幕| 亚洲精品欧美日韩专区| 久久精品国产福利| 国产精品视频yy9099| 日韩天堂在线| 国产成人亚洲综合91精品| free性护士videos欧美| 久久久久久国产精品三级玉女聊斋 | 国产精品主播直播| 超碰人人草人人| 激情综合色丁香一区二区| 自拍偷拍21p| 久久精品国产久精国产爱| 91淫黄看大片| 日本少妇一区二区| 色综合色综合色综合色综合| 日韩高清不卡在线| 国产一级特黄a大片免费| 日韩在线观看一区二区| 亚洲成色www.777999| 久久综合伊人| 欧在线一二三四区| 日韩高清在线一区| www欧美激情| 国产在线视频精品一区| 精品国产一二区| 波多野结衣中文字幕一区| 少妇激情一区二区三区视频| www.日韩精品| 三级网站在线免费观看| 久久久久久久久蜜桃| 在线视频第一页| 亚洲国产精品成人综合色在线婷婷| 91视频免费在观看| 成人欧美一区二区三区黑人麻豆| 久久久久99精品成人片试看| 尤物在线观看一区| 久久久久久久久久影院| 在线一区二区三区四区五区 | 日韩美女天天操| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 丝袜美腿中文字幕| 国产欧美日韩三区| 青花影视在线观看免费高清| 一区二区三区在线视频观看| 日韩欧美激情视频| 日本道精品一区二区三区| 一级黄色大毛片| 精品成人在线观看| 国产黄色在线| 欧美激情国产日韩精品一区18| 国产美女精品写真福利视频| 国产成人极品视频| 欧美h版在线观看| 久久一区免费| 婷婷色综合网| av免费观看网| 韩国三级中文字幕hd久久精品| 在线观看免费视频国产| 国产亚洲自拍一区| 精品视频一区二区在线观看| 欧洲色大大久久| 精品人妻少妇AV无码专区| 亚洲欧美国产精品va在线观看| 日韩三级影院| 欧美在线一级视频| 激情不卡一区二区三区视频在线| 久久这里精品国产99丫e6| 91精品久久久久久久久久不卡| 97视频久久久| 国模少妇一区二区三区| 91视频在线网站| 亚洲激情在线激情| 免费在线不卡av| 亚洲国产天堂久久综合网| 麻豆传媒视频在线观看免费| 欧美有码在线视频| 999久久久精品一区二区| 天天爽天天狠久久久| 夜夜嗨一区二区| 国产成人av免费观看| 国产日产亚洲精品系列| 日本特黄特色aaa大片免费| 911精品国产一区二区在线| 亚洲日本国产精品| 欧美激情在线观看| 成人在线视频国产| 亚洲欧美一区二区原创| 久久www成人_看片免费不卡| 日本成人在线免费| 自拍偷拍亚洲激情| 亚洲天堂手机版| 亚洲欧美色婷婷| 免费一二一二在线视频| 99精品国产高清一区二区| 亚洲不卡av不卡一区二区| 黄色一级二级三级| 91色九色蝌蚪| 日本在线小视频| 日韩精品一区二区三区三区免费| 麻豆网站在线免费观看| 国产精品久久久久久久久久免费| 欧美一级一片| 黄色大片在线免费看| 国产精品1区2区3区| 欧美大片xxxx| 欧美日韩国产综合视频在线观看| 黄视频在线观看免费| 欧美中文在线观看国产| 欧美亚洲国产日韩| 乱人伦xxxx国语对白| 成人av一区二区三区| 国产一卡二卡在线播放| 欧美大片免费久久精品三p| 污污片在线免费视频| 亚洲综合色av| 亚洲综合色站| 日本精品一二三区| 香蕉av福利精品导航| 欧美在线精品一区二区三区| 欧美激情一区二区三区在线视频观看| 亚洲高清999| 黄色一级片在线看| 97久久精品人人爽人人爽蜜臀| 日本在线观看中文字幕| 亚洲美女动态图120秒| videos性欧美另类高清| 欧美另类一区| 久久机这里只有精品| 国产精品免费人成网站酒店| 欧美一区二区成人6969| 国产嫩草在线视频| 久久国产一区二区| 免费观看久久久4p| 欧美视频www| 亚洲国产女人aaa毛片在线| 日韩激情电影| 婷婷四月色综合| 国产麻豆精品视频| 国产成人免费看| 少妇高潮 亚洲精品| 亚洲福利合集| 欧美少妇性生活视频| 中文字幕一区二区在线观看| 99久久国产免费| 777精品视频| 成人羞羞动漫| 亚洲色图欧美另类| 在线免费观看不卡av| 国产黄a三级三级三级av在线看| www.久久爱.cn| 久久国产主播| 青青青在线免费观看| 亚洲精品mp4| 日韩国产一二三区| 日本一道本久久| 国产精品五月天| 韩国av免费在线观看| 国产精品久久久久久影视| 欧美精品观看| 成人黄色免费网址| 欧美白人最猛性xxxxx69交| 免费观看欧美大片| 韩国黄色一级大片| 国产丝袜欧美中文另类| 丰满人妻一区二区三区无码av| 国产精品久久久一区| 亚洲经典视频在线观看| 免费看一级黄色|