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

詳解Java中的SPI技術以及在架構設計的運用

開發 前端
今天我們首先學習了 SPI 的定義,然后基于 JDK 中數據庫驅動的例子,重點講解了如何基于 SPI 來實現數據庫驅動的擴展性。JDK 對數據庫驅動進行了抽象,提供了抽象的 Driver 和 Connection 接口,這些接口就是 SPI 接口。

衡量一個架構設計的好壞,其中一個標準就是看這個架構是否具有可擴展性,架構設計中有很多常用的實現擴展性的技術,這次我們就來探討一下比較常見的 SPI 技術。

我們首先了解一下什么是 SPI,然后講一講 JDK 是如何基于 SPI 機制來獲取到具體的數據庫驅動實現的。接下來,我們分析 JDK SPI 機制的不足之處。最后,概要講解一下 Apache Dubbo 對 SPI 進行了哪些改進,以及 Apache Dubbo 是如何基于增強 SPI 實現 Dubbo 框架的可擴展性的。

服務提供者接口(Service provider interface,SPI),是指被第三方實現或者擴展的接口,它可以用來實現框架的擴展性和實現組件的可替換性。這里服務提供者接口中的服務是指一組接口和抽象類,服務提供者基于服務提供者接口來實現具體的服務。

JDK 中的 SPI 機制

了解了 SPI 的基本定義,我們接下來看一下 SPI 是如何在 JDK 中使用的。在 Java 開發中,我們經常使用下面這段代碼來獲取一個數據庫連接。

DriverManager.getConnection("a database url of the form jdbc:subprotocol:subnam");

比如獲取 MySQL 數據庫連接,我們可以用如下代碼來操作:

DriverManager.getConnection("jdbc:mysql://localhost:3306/testDb?useUnicode=true&characterEncoding=UTF-8");

或者要獲取 Oracle 數據庫連接,對應代碼如下所示:

DriverManager.getConnection("jdbc:oracle:thin:@localhost:3306:testDb");

獲取完數據庫連接后,我們該怎么用呢?

基于 MySQL 數據庫的示例,下面這段代碼就展示了如何基于連接做數據庫表的操作:

public static void main(String[] argc) throws SQLException {
  Connection con = null;
  try {
    //1. 獲取 MySQL 數據庫連接
    con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/testDb?useUnicode=true&characterEncoding=UTF-8");
    //2. 執行 SQL 語句
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM table");
    //3. 處理結果集數據
    while (rs.next()) {
      String name = rs.getString("name");
      String desc = rs.getString("desc");
      System.out.println(name + ", " + desc);
    }
  } catch (SQLException e) {
    e.printStackTrace();
  } finally {
    //4. 關閉連接
    if (con != null) {
      con.close();
    }
  }

我們先獲取到 MySQL 數據庫的一個連接,然后基于連接執行查詢操作,接著處理查詢操作返回的數據集,處理完畢后關閉連接。

從上面示例可知,DriverManager.getConnection 方法根據傳遞的 database url 不同,可以獲取不同數據庫的連接,也就是說 DriverManager.getConnection 方法是與具體的數據庫驅動實現無關的。這是一個很好的設計,那么它是如何實現的呢?

首先,我們來剖析下 DriverManager.getConnection 的實現機制,我們列出來 DriverManager.getConnection 相關的類圖模型:

java.sql.Driver 文件的內容如下圖:

圖片圖片

Oracle 驅動包中 META-INF/services/java.sql.Driver 文件的內容如下所示:

圖片圖片

從 META-INF/services/java.sql.Driver 文件找到具體驅動的實現類的名稱后,會調用 ServiceLoader 內的 nextService 方法,使用 Class.forName(“驅動實現類名稱”…)來創建這個驅動的 Class 對象,然后通過 Class 對象的 newInstance() 方法創建一個驅動實現類的實例對象。

private S nextService() {
    ...
    // 創建驅動實現類的 Class 對象
    Class<?> c = null;
    try {
        c = Class.forName(cn, false, loader);
    } catch (ClassNotFoundException x) {
        fail(service,
             "Provider " + cn + " not found");
    }
    ...
    // 基于驅動實現類的 Class 對象創建一個實例對象
    try {
        S p = service.cast(c.newInstance());
        providers.put(cn, p);
        return p;
    } catch (Throwable x) {
      ...
    }
}

另外,我們會發現具體的驅動實現類,比如 MySQL 驅動的 Driver 類內,存在一個 static 的代碼塊。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  public Driver() throws SQLException {
  }
  static {
    // 注冊 MySQL 驅動到 DriverManager
    try {
      DriverManager.registerDriver(new Driver());
    } catch (SQLException var1) {
      throw new RuntimeException("Can't register driver!");
    }
  }
}

這個 static 代碼塊會在創建 Driver 的實例對象時被觸發執行,而上面 ServiceLoader 類的 nextService 方法內就創建了 Driver 的實例,所以觸發了 Driver 類的 static 代碼塊執行,也就是把 Driver 類注冊到了 DriverManager 中的 registeredDrivers 列表里面。

到這里,我們講解了 DriverManager.getConnection 內的一部分邏輯,也就是 loadInitialDrivers 方法的邏輯。它的內部使用 ServiceLoader 掃描 classpath 下所有的 jar 包,并找到實現 Driver 接口的驅動包,然后注冊驅動實現類到 DriverManager。

上面我們講解了如何注冊驅動到 DriverManager,下面我們繼續看當 DriverManager.getConnection 獲取數據庫連接時,如何使用驅動來具體獲取數據庫連接的:

private static Connection getConnection(
    String url, java.util.Properties info, Class<?> caller) throws SQLException{}
       ...
       // 遍歷 registeredDrivers
        for(DriverInfo aDriver : registeredDrivers) {
            if(isDriverAllowed(aDriver.driver, callerCL)) {
                try {
                    // 從驅動獲取連接
                    Connection con = aDriver.driver.connect(url, info);
                    if (con != null) {
                        return (con);
                    }
                } catch (SQLException ex) {
                    if (reason == null) {
                        reason = ex;
                    }
                }
            }
          ...
        }
       ...
    }
}

由上面代碼可知,getConnection 方法內會遍歷 registeredDrivers 中的驅動實現類,然后調用驅動實現類的 connect 方法,每個驅動實現類的 connect 方法根據 URL 來判斷當前請求的 URL 是否需要自己處理,如果不需要就返回 null,否則返回具體的連接對象。

總的來說,JDK 對數據庫驅動進行了抽象,提供了 SPI 接口 Driver 和 Connection。然后,驅動開發者就可以實現這個 SPI 接口,來提供具體數據庫的驅動實現包。驅動開發者提供的驅動包里面需要包含 META-INF/services/java.sql.Driver 文件,并且文件內要寫入驅動實現類的類名。

JDK 提供的 ServiceLoader 機制會掃描 classpath 下的所有 jar 包,并且找到含有 META-INF/services/java.sql.Driver 文件的 jar,判定它為數據庫驅動包,然后 ServiceLoader 會根據實現類的名稱實例化這個驅動實現類,并注冊驅動實現類到 DriverManager 內。當我們調用 DriverManager 的 getConnection 方法時,就可以獲取到具體的驅動實現類并獲取數據庫連接了。

請注意,在 JDK 的 SPI 機制實現中,ServiceLoader 會把所有驅動實現包中的驅動實現類都實例化(創建一個對應的實例對象)。如果某些驅動實現類初始化很耗時,實例化會很浪費資源,并且會降低應用啟動速度。

Dubbo 中的 SPI 機制

Apache Dubbo 是一款微服務框架,為大規模微服務實踐提供高性能 RPC 通信、流量治理、可觀測性等解決方案。

Dubbo 的 SPI 實現借鑒了 JDK 的 SPI 思想,但是進行了一些優化改進,解決了 JDK SPI 的以下問題:

  1. JDK SPI 會一次性實例化所有實現類,有的擴展實現類初始化很耗時,但實際又沒用,還會拖慢啟動速度;
  2. JDK SPI 在實例化擴展實現類失敗時,不會友好地通知用戶具體異常。

Dubbo SPI 增加了對擴展實現類的 IoC 和 AOP 的支持,一個擴展實現類可以直接注入其它擴展實現類,也可以使用 Wrapper 類對擴展實現類進行功能增強。

Dubbo 框架的實現采用了分層架構思想,架構中的每層都是一個獨立模塊,上層依賴下層提供的功能,下層對上層提供服務,下層的改變對上層不可見。

圖片圖片

在這個架構圖中,從上往下看,除去 Service 和 Config 層是 API 層外,剩下的從 Proxy 層到 Serialize 層都是 SPI 層,這意味著從 Proxy 層到 Serialize 層每層都是可擴展的、可被替換的。

比如,Cluster 層默認提供了豐富的集群容錯策略,但是如果開發者有定制化需求,可以通過 Dubbo 提供的 SPI 擴展接口 org.apache.dubbo.rpc.cluster.Cluster 提供個性化的集群容錯策略,其中 SPI 接口 org.apache.dubbo.rpc.cluster.Cluster 的定義如下:

@SPI("failover")
public interface Cluster {
  @Adaptive
  <T> Invoker<T> join(Directory<T> var1) throws RpcException;
}

我們通過 CustomCluster 類實現了 SPI 接口——Cluster,其中 CustomClusterInvoker 為具體的容錯策略的實現。

public class CustomCluster implements Cluster {
  @Override
  public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
    return new CustomClusterInvoker<>(directory);
  }
}

創建好 CustomCluster 類后,我們需要在 resources 目錄下創建一個名稱為 META-INF.dubbo 的文件夾,然后在它的下面創建一個名為 org.apache.dubbo.rpc.cluster.Cluster 的文件,文件內容為:customCluster=org.apache.dubbo.demo.cluster.CustomCluster。

圖片圖片

最后,我們在消費端發起請求時,可以設置集群容錯策略。

// 0.創建服務引用對象實例
ReferenceConfig<GreetingService> referenceConfig = new ReferenceConfig<GreetingService>();
// 1.設置應用程序信息
referenceConfig.setApplication(new ApplicationConfig("first-dubbo-consumer"));
// 2.設置服務注冊中心
referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
// 3.設置服務接口和超時時間
referenceConfig.setInterface(GreetingService.class);
// 4.設置集群容錯策略
referenceConfig.setCluster("customCluster");
// 5.設置服務分組與版本
referenceConfig.setVersion("1.0.0");
referenceConfig.setGroup("dubbo");
// 6.引用服務
greetingService = referenceConfig.get();

代碼 4 就是我們設置的集群容錯策略——customCluster。你可能會問,Dubbo 如何根據集群容錯策略的名稱——customCluster 找到具體的容錯策略實現類呢?其實就是通過 Dubbo 的增強 SPI 機制來實現的,這個機制和 JDK SPI 機制差不多。

總結

圖片圖片

今天我們首先學習了 SPI 的定義,然后基于 JDK 中數據庫驅動的例子,重點講解了如何基于 SPI 來實現數據庫驅動的擴展性。JDK 對數據庫驅動進行了抽象,提供了抽象的 Driver 和 Connection 接口,這些接口就是 SPI 接口。

具體的驅動包實現者可以實現這些 SPI 接口來實現具體數據庫驅動。JDK 通過使用 ServiceLoader 機制來掃描驅動包的實現類,并注冊這些驅動到 DriverManager,所以我們可以通過 DriverManager.getConnection 方法獲取數據庫連接。

接下來,我們了解了 JDK SPI 的不足,概要介紹了 Dubbo 中增強的 SPI 的特點以及 Dubbo 如何基于 SPI 實現可擴展性。最后,我們基于 Dubbo 的集群容錯策略擴展接口,講解了 Dubbo 中如何來實現擴展。

責任編輯:武曉燕 來源: 程序猿技術充電站
相關推薦

2017-05-17 14:51:31

DNS架構負載均衡

2016-12-19 11:33:26

2009-06-12 16:07:05

演進式架構設計敏捷開發

2012-07-02 14:47:57

架構敏捷開發

2009-07-06 10:36:41

敏捷開發

2021-07-21 16:30:38

iOSAPP架構

2024-09-19 08:46:46

SPIAPI接口

2023-03-28 08:29:52

2011-04-08 17:03:19

Java架構

2025-04-15 04:00:00

2022-05-27 11:27:31

技術架構ROI

2010-01-15 10:15:34

分布式交換技術

2022-04-11 09:15:00

前端開發技術

2022-06-28 08:02:44

SPISpringJava

2017-08-17 09:49:06

云存儲技術運用

2023-05-12 08:06:46

Kubernetes多云架構

2025-05-19 08:05:00

數據庫MVCCMySQL

2016-10-21 14:57:10

2025-03-13 13:00:00

架構DNSIP

2025-04-28 09:00:00

DNS架構網絡
點贊
收藏

51CTO技術棧公眾號

91捆绑美女网站| 亚洲人成网www| 亚洲色图在线视频| 国产精品18毛片一区二区| 天天爽夜夜爽夜夜爽精品| 国产日产精品一区二区三区四区的观看方式 | 国产一区自拍视频| 影音先锋在线国产| 99精品视频精品精品视频| 日韩美女一区二区三区| 国产91对白刺激露脸在线观看| 高清性色生活片在线观看| 国产一区在线观看视频| 欧美亚洲成人精品| 久久久久99精品成人| 亚洲成人五区| 在线观看日韩电影| 精品人妻人人做人人爽| 大地资源中文在线观看免费版| 国产成人av福利| 国产精品白嫩美女在线观看| 久久久一二三区| 第四色成人网| 亚洲男人天堂网| 国产清纯白嫩初高中在线观看性色| 国产日韩另类视频一区| 亚洲精品中文在线影院| 日韩女优中文字幕| 欧美一区二区黄片| 国精产品一区一区三区mba桃花| 51久久精品夜色国产麻豆| 一级性生活免费视频| 中文字幕av一区二区三区人| 亚洲白虎美女被爆操| 日日干日日操日日射| 久久91导航| 精品女厕一区二区三区| 亚洲国产一二三精品无码| av在线播放免费| 26uuu精品一区二区| 国产精品18毛片一区二区| av资源免费看| 国内精品伊人久久久久av影院 | 伊人av综合网| 成人性生交大免费看| 欧美wwwsss9999| 精品国产a毛片| 97超碰免费在线观看| 国产精品99久久久久久董美香| 色欧美乱欧美15图片| 男女视频网站在线观看| 欧美精品videossex少妇| 亚洲精品成人悠悠色影视| 亚洲资源在线网| www.成人.com| 国产精品午夜免费| 亚洲成人网上| 亚洲乱亚洲乱妇| 国产精品国产三级国产普通话99| 亚洲第一综合| 午夜在线播放| 亚洲欧美日韩小说| 穿情趣内衣被c到高潮视频| av片在线观看网站| 一区二区三区在线观看视频| 九九久久九九久久| 在线你懂的视频| 亚洲一区二区免费视频| 成人精品视频在线播放| 男人天堂视频在线观看| 欧美性猛交xxxx免费看漫画| 日本女优爱爱视频| 99久久婷婷国产综合精品首页| 欧美日韩一级黄| 91小视频在线播放| 亚洲电影一区| 亚洲精品720p| 亚洲性猛交xxxx乱大交| 色97色成人| 久久亚洲欧美日韩精品专区 | 九色视频网站在线观看| 国产精品系列在线| 亚洲欧美日韩不卡| 美女精品导航| 色欧美片视频在线观看在线视频| 中文字幕永久有效| 国产精品午夜av| 亚洲视频自拍偷拍| 午夜激情福利网| 在线观看一区视频| 国产精品99免视看9| 国产精品毛片久久久久久久av| 高清不卡一二三区| 欧洲亚洲一区二区| 国产精品一卡二卡三卡| 亚洲国产欧美一区二区三区丁香婷| 草草久久久无码国产专区| 日本精品裸体写真集在线观看| 91精品国产综合久久久久久 | 91亚洲国产成人精品一区| 高清国产一区二区三区| 日韩一本精品| 成年人国产在线观看| 欧美在线观看18| 亚洲区 欧美区| 国产欧美高清视频在线| 欧美激情精品久久久久久免费印度| 日韩综合在线观看| 国产超碰在线一区| 神马影院我不卡| 国产99re66在线视频| 欧美性猛片xxxx免费看久爱| 农村末发育av片一区二区| jlzzjlzz亚洲女人| 97视频在线看| 99视频免费看| 国产精品午夜电影| 免费国产黄色网址| 国产一区二区av在线| 国产性色av一区二区| 久久久久久久九九九九| 美女网站色91| 久久精品一区二区三区不卡免费视频| 菠萝菠萝蜜在线观看| 色94色欧美sute亚洲线路二| 大桥未久恸哭の女教师| 欧美国产三区| 国产精品中文字幕在线观看| 欧美理论在线观看| 亚洲麻豆国产自偷在线| 777一区二区| 精品视频97| 欧亚精品中文字幕| 色欲久久久天天天综合网| 一区二区三区日韩精品| 国产不卡的av| 99九九热只有国产精品| 国产精品91久久久| 久久久久久青草| 黄色成人av网| 亚洲激情 欧美| 国内精品久久久久久久影视蜜臀| 91视频免费在线| www.欧美日本韩国| 欧美一区二区三区视频在线观看| 可以免费看av的网址| 免费看黄色91| 午夜精品一区二区三区四区| 播放一区二区| 亚洲无亚洲人成网站77777| 亚洲欧美自拍视频| 91蝌蚪porny九色| 黑人糟蹋人妻hd中文字幕| 丝袜美腿一区二区三区动态图| 国内精品久久久久影院优| 欧美在线 | 亚洲| 午夜精品爽啪视频| 一二三不卡视频| 久久国产精品久久w女人spa| 欧洲精品在线一区| www.一区| 久久影视电视剧免费网站清宫辞电视 | 亚洲国产精品第一页| 欧美精品色网| 精品国产日本| 天天免费亚洲黑人免费| 亚洲天堂视频在线观看| 中文字幕在线一| 亚洲欧美另类综合偷拍| 性一交一黄一片| 亚洲三级影院| 茄子视频成人在线观看| 欧美视频精品| 久久天天躁日日躁| 噜噜噜久久,亚洲精品国产品| 亚洲第一综合色| 久久精品国产亚洲av麻豆| 日韩av网站在线观看| 欧美精品一区二区性色a+v| 亚洲一区二区三区中文字幕在线观看| 午夜精品视频在线| 精品久久久久一区二区三区| 欧美日韩国产综合一区二区三区| 玖玖爱这里只有精品| 不卡免费追剧大全电视剧网站| 亚洲中文字幕久久精品无码喷水| 国产精品videosex性欧美| 99久久免费国| 欧美成人h版| 美女精品视频一区| 天天爽夜夜爽夜夜爽| 欧美中文字幕一区二区三区亚洲| 天天看天天摸天天操| 成人午夜电影小说| 无码少妇一区二区三区芒果| 欧美国产先锋| 日韩精品欧美在线| 日韩精品一区二区三区中文在线| 欧洲精品久久久| 18+视频在线观看| 亚洲人av在线影院| 成人免费公开视频| 欧美性高清videossexo| 国产一级片播放| 国产精品美女久久久久av爽李琼| 性农村xxxxx小树林| 日本美女一区二区三区| www.射射射| 99久久久久| 日韩精品无码一区二区三区| 精品伊人久久久| 91精品免费视频| 天天综合一区| 日韩在线观看免费全| 韩国av在线免费观看| 欧美在线制服丝袜| 久久久久亚洲av无码专区| 日本一区二区三区国色天香| 日韩无码精品一区二区| 极品少妇xxxx精品少妇| 国产1区2区在线| 好看的日韩av电影| 一区二区三区在线观看www| 欧美男男freegayvideosroom| 91免费欧美精品| 国产精品.xx视频.xxtv| 欧美中文在线字幕| 黄色漫画在线免费看| 色综合男人天堂| 成人三级网址| 日韩在线视频免费观看| 国产精品久久久久一区二区国产 | 欧美精品一区三区| 日p在线观看| 色噜噜国产精品视频一区二区| 蜜桃视频在线播放| 日韩精品福利网站| 日本美女一级片| 精品精品国产高清一毛片一天堂| 国产伦理一区二区| 宅男在线国产精品| 国产精品国产av| 欧美精品九九99久久| 亚洲网站在线免费观看| 欧美日韩视频一区二区| 中文字幕激情视频| 欧美色男人天堂| 艳妇乳肉豪妇荡乳av| 欧美性极品少妇| 在线免费观看一区二区| 欧美日韩在线三区| 一区二区视频免费观看| 欧美精品在欧美一区二区少妇| 91久久精品国产91性色69| 欧美视频在线一区二区三区| 中文字幕+乱码+中文乱码www| 在线观看www91| 在线观看免费中文字幕| 欧美日本在线看| 国产精品嫩草影院精东| 欧美一区二区三区公司| 精品人妻无码一区二区三区蜜桃一| 日韩手机在线导航| 好吊色在线观看| 日韩精品在线私人| 国产日产精品久久久久久婷婷| 尤物tv国产一区| 国产激情视频在线观看| 欧美激情精品在线| 制服丝袜专区在线| 国产国语videosex另类| 日韩精品第二页| 国产激情一区二区三区在线观看 | 国产无码精品一区二区| 午夜精品福利久久久| aaaaaa毛片| 欧美另类变人与禽xxxxx| 精品国产无码AV| 日韩电影视频免费| p色视频免费在线观看| 久久久精品视频成人| 国产在线xxx| 国产91色在线播放| 国产一区 二区| 好吊色欧美一区二区三区| 精品久久久久久久久久久下田 | 色视频在线观看免费| 尤物九九久久国产精品的分类| 永久免费网站在线| 日韩女在线观看| 色播一区二区| 色女孩综合网| 精品福利电影| 嫩草视频免费在线观看| 不卡视频在线观看| 色婷婷粉嫩av| 欧美性高潮床叫视频| 91丨九色丨丰满| 亚洲精品一区av在线播放| 美女羞羞视频在线观看| 欧美在线视频a| 秋霞影院一区| 亚洲一区二区三区精品在线观看| 136国产福利精品导航网址| 91视频这里只有精品| 99久久777色| 九九精品在线观看视频| 在线日韩av片| 亚洲人在线观看视频| 欧美成人免费小视频| 成人在线高清| 免费国产一区二区| 欧美日韩影院| 亚洲免费在线播放视频| 日本一区二区三区免费乱视频| 日本少妇性高潮| 4438x成人网最大色成网站| 黄色av网站在线| 国产91av在线| 成人高潮a毛片免费观看网站| 亚洲一二三区精品| 久久国产欧美| 成人手机在线免费视频| 一区二区在线观看免费视频播放| 在线观看亚洲一区二区| 亚洲人成电影在线观看天堂色| 国产一二在线播放| 成人动漫在线视频| 888久久久| 亚洲精品成人在线播放| 亚洲国产精品成人综合色在线婷婷 | 国产日韩欧美电影在线观看| 欧美女王vk| 黄色片一级视频| 91麻豆高清视频| 中文字幕亚洲精品一区| 亚洲国产古装精品网站| 美女精品导航| 国产精品成人一区二区三区 | 欧美多人乱p欧美4p久久| 日本久久二区| 在线观看日本一区| 久久99久久久久久久久久久| 国产传媒视频在线 | 亚洲精品久久久狠狠狠爱 | 久久精品噜噜噜成人av农村| 一级黄色录像毛片| 欧美日韩一区二区在线观看 | 欧美日韩国产电影| 欧美自拍偷拍第一页| 欧美高跟鞋交xxxxxhd| 美女久久精品| 亚洲乱码日产精品bd在线观看| 国产老肥熟一区二区三区| 91日韩中文字幕| 日韩一级二级三级| 性欧美1819sex性高清大胸| 亚洲一区二区三区成人在线视频精品| 亚洲综合婷婷| 国产高潮失禁喷水爽到抽搐| 婷婷夜色潮精品综合在线| 人人九九精品| 国产经典一区二区| 欧美www视频在线观看| 国产精品久久久久野外| 亚洲国产一二三| 欧美婷婷久久五月精品三区| 国产97色在线|日韩| 日韩黄色大片网站| 亚洲欧美日韩一二三区| 亚洲一区二区av电影| 午夜在线视频观看| 国产精品成熟老女人| 香蕉视频官网在线观看日本一区二区| 日韩精品xxx| 精品久久久久久中文字幕大豆网 | 狠狠干 狠狠操| 国产亚洲福利社区一区| 91国产免费视频| 韩国一区二区电影| 免费精品国产的网站免费观看| 天堂在线中文在线| 亚洲成人www| 超碰国产在线| 成人精品一二区| 久久一区二区三区超碰国产精品| 亚洲aaa视频| 亚洲国产精品资源| jizzjizz少妇亚洲水多| 日本a级片在线观看| 久久综合网色—综合色88| 在线观看免费中文字幕| 97精品在线观看| 久久精品播放| av鲁丝一区鲁丝二区鲁丝三区| 欧美日韩国产首页在线观看| 美女av在线免费看| 中文视频一区视频二区视频三区| 91小视频免费看| 国产视频手机在线|