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

Dubbo中SPI機制的實現原理和優勢

開發 前端
我們從 Dubbo 配置項的定義中發現,Dubbo 采用了與 JDK 不同的實現機制。雖然 Dubbo 也采用了 SPI 機制,也是從 jar 包中動態加載實現類,但它的實現方式與 JDK 中基于 ServiceLoader 是不一樣的。

確保系統的擴展性是我們開展架構設計工作的核心目標之一。實現擴展性的方法有很多,JDK 本身內置了一個 SPI(Service Provider Interface,服務提供者接口)機制,來幫開發人員動態加載各種不同的實現類,只要這些實現類遵循一定的開發規范即可。

另一方面,JDK 自帶的 SPI 機制存在一定的缺陷,因此市面上有些框架對 JDK 中的 SPI 機制做了一些增強,這方面的代表性框架就是 Dubbo。在今天的課程中,我們將對這兩種 SPI 機制進行對比,并重點闡述 Dubbo 中 SPI 機制的實現原理和優勢。為了更好地做比較,讓我們先從 JDK 中的 SPI 機制講起。

JDK 中的 SPI 機制解析

如果我們采用 JDK 中的 SPI,具體的開發工作會涉及三個步驟。

實現 JDK SPI 機制的開發步驟實現 JDK SPI 機制的開發步驟

對于 SPI 的開發者而言,我們需要設計一個服務接口,然后根據業務場景提供不同的實現類,這是第一步。

接下來的第二步是關鍵,我們需要創建一個以服務接口命名的配置文件,并把這個文件放置到代碼工程的 META-INF/services 目錄下。請注意,在這個配置文件中,我們需要指定服務接口對應實現類的完整類名。通過這一步,我們可以得到了一個包含 SPI 類和配置的 jar 包。

最后,SPI 的使用者就可以加載這個 jar 包并找到其中的這個配置文件,并根據所配置的實現類完整類名對這些類進行實例化。

上圖中的后面兩個步驟實際上都是為了遵循 JDK 中 SPI 的實現機制而進行的配置工作。

為了實現對 SPI 實現類的動態記載,JDK 專門提供了一個 ServiceLoader 工具類,這個工具類的使用方法如下所示:

public static void main(String[] args) {
  ServiceLoader<LogProvider> loader = ServiceLoader.load(LogProvider.class);
  for (LogProvider provider : loader) {
   System.out.println(provider.getClass());
   provider.info(“testInfo”);
  }
}

這里有一個 LogProvider 接口,并通過 ServiceLoader 的 load 方法將這個接口所配置的實現類加載到內存中,從而可以方便地使用這些 SPI 實現類所提供的功能。

接下來,讓我們來分析一下這個 ServiceLoader 工具類的實現原理。

ServiceLoader 本身實現了 JDK 中的 Iterable 接口,因此在上面的代碼示例中,通過 ServiceLoader.load 方法我們獲取的是一個迭代器,而底層則用到了 ServiceLoader.LazyIterator 這個迭代器類。

從命名上看,LazyIterator 是一個具備延遲加載機制的迭代器,它有 hasNextService 和 nexServicet 這兩個核心方法。我們先來看 hasNextService 方法:

//配置文件路徑
static final String PREFIX = "META-INF/services/";
private boolean hasNextService() {
    if (nextName != null) {
        return true;
    }
    if (configs == null) {
        // 通過 PREFIX 前綴與服務接口的名稱,我們可以找到目標 SPI 配置文件
        String fullName = PREFIX + service.getName();
        // 加載配置文件
        if (loader == null)
            configs = ClassLoader.getSystemResources(fullName);
        else
            configs = loader.getResources(fullName);
    }
    // 對 SPI 配置文件進行遍歷,并解析配置內容
    while ((pending == null) || !pending.hasNext()) {
        if (!configs.hasMoreElements()) {
            return false;
        }
        // 解析配置文件
        pending = parse(service, configs.nextElement());
 }
 // 更新 nextName 字段
    nextName = pending.next();
    return true;
}

可以看到,hasNextService 方法的核心作用是找到并解析配置文件。而接下來要展開的 nextService 方法則負責對所配置的類進行實例化,核心實現如下所示:

private S nextService() {
    String cn = nextName;
    nextName = null;
    // 加載 nextName 字段指定的類
 Class<?> c = Class.forName(cn, false, loader);
 // 檢測類型
    if (!service.isAssignableFrom(c)) {
        fail(service, "Provider " + cn  + " not a subtype");
 }
 // 創建實現類的對象
 S p = service.cast(c.newInstance());
 // 緩存已創建的對象
 providers.put(cn, p);
    return p;
}

這里通過 newInstance 方法創建了目標實例,并將已創建的實例對象放到 providers 集合中進行緩存,從而提高訪問效率。

Dubbo 中的 SPI 機制解析

為了實現框架自身的擴展性,Dubbo 也采用了類似 JDK 中 SPI 的設計思想,但提供了一套新的實現方式,并添加了一些擴展功能。

Dubbo 中與 SPI 機制相關的注解主要包括@SPI、@Adaptive 和@Activate,其中@SPI 注解提供了與 JDK 中 SPI 類似的功能。

Dubbo 中 SPI 相關注解Dubbo 中 SPI 相關注解

這三個注解的應用場景各不相同,其中@SPI 注解為 Dubbo 提供了最基礎的 SPI 機制,而@Adaptive 和@Activate 注解都是構建在這個注解之上,因此我們重點介紹@SPI 注解。如果在某個接口上添加了這個注解,那么 Dubbo 在運行過程中就會去查找接口對應的擴展點實現。

在 Dubbo 中,隨處可以看到@SPI 注解的應用場景。舉個例子,Protocol 接口定義如下:

@SPI("dubbo")
public interface Protocol

可以看到,在這個接口上使用的就是@SPI(“dubbo”) 注解。

請注意,在@SPI 注解中可以指定默認擴展點的名稱,例如這里的“dubbo”用來表明在 Protocol 接口的所有實現類中,DubboProtocol 是它的默認實現。

有了 SPI 的定義,我們接下來看一看 Dubbo 中 SPI 配置信息的存儲方式。我們已經知道,JDK 只會把 SPI 配置存放在 META-INF/services/這個目錄下,而 Dubbo 則提供了三個類似這樣的目錄:

Dubbo 中 SPI 配置的存放目錄Dubbo 中 SPI 配置的存放目錄

作為示例,我們繼續圍繞上面提到的 Protocol 接口展開討論。

針對 Protocol 接口,Dubbo 提供了 gRPCProtocol、DubboProtocol 等多個實現類,并通過 SPI 機制完成對具體某種實現方案的加載過程。讓我們分別來到提供這些實現類的代碼工程 dubbo-rpc-grpc 和 dubbo-rpc-dubbo,會發現在 META-INF/dubbo/internal/目錄下都包含了一個 com.apache.dubbo.rpc.Protocol 配置文件。其中,dubbo-rpc-grpc 工程的代碼結構如圖所示:

dubbo-rpc-grpc 工程的代碼結構dubbo-rpc-grpc 工程的代碼結構

類似的,dubbo-rpc-dubbo 工程的代碼結構如下圖所示:

dubbo-rpc-dubbo 工程的代碼結構dubbo-rpc-dubbo 工程的代碼結構

我們分別打開這兩個工程的 com.apache.dubbo.rpc.Protocol 配置文件,可以發現它們分別指向了 org.apache.dubbo.rpc.protocol.grpc.GrpcProtocol 和 org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol 類。

//dubbo-rpc-grpc 工程
grpc=org.apache.dubbo.rpc.protocol.grpc.GrpcProtocol
//dubbo-rpc-dubbo 工程:
dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol

當 Dubbo 在引用具體某一個代碼工程時,就可以通過這個工程中的配置項就可以找到 Dubbo 接口對應的擴展點實現。

同時,我們從上面配置項中也可以看出,Dubbo 中采用的定義方式與 JDK 中的不一樣。Dubbo 使用的一個 Key 值(如上面的 gRPC 和 Dubbo)來指定具體的配置項名稱,而不是采用完整類路徑。

介紹完@SPI 注解,我們接下來看 Dubbo 中的 ExtensionLoader 類,這個類扮演著與 JDK 中 ServiceLoader 工具類相同的角色。ExtensionLoader 是實現擴展點加載的核心類,如果我們想要獲取 DubboProtocol 這個實現類,那么可以采用以下方式:

DubboProtocol dubboProtocol = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(DubboProtocol.NAME);

我們來看一下這里 getExtension 方法的細節,這個方法代碼如下所示:

public T getExtension(String name) {
     ...
     //從緩存中獲取目標對象
        Holder<Object> holder = cachedInstances.get(name);
        if (holder == null) {
         //將目標對象放到緩存中
            cachedInstances.putIfAbsent(name, new Holder<Object>());
            holder = cachedInstances.get(name);
        }
        Object instance = holder.get();
        if (instance == null) {
            synchronized (holder) {
                instance = holder.get();
                if (instance == null) {
                 //創建目標對象
                    instance = createExtension(name);
                    holder.set(instance);
                }
            }
        }
        return (T) instance;
}

我們看到這里同樣用到了緩存機制。這個方法會首先檢查緩存中是否已經存在擴展點實例,如果沒有則通過 createExtension 方法進行創建。我們一路跟蹤 createExtension 方法,終于看到了熟悉的 SPI 機制,如下所示:

private Map<String, Class<?>> loadExtensionClasses() {
        final SPI defaultAnnotation = type.getAnnotation(SPI.class);
        if (defaultAnnotation != null) {
             //確定緩存名稱
        }
        Map<String, Class<?>> extensionClasses = new HashMap<String, Class<?>>();
     //分別從三個目錄中加載類實例
        loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY);
        loadFile(extensionClasses, DUBBO_DIRECTORY);
        loadFile(extensionClasses, SERVICES_DIRECTORY);
        return extensionClasses;
}

在這里,我們調用了三次 loadFile 方法,分別在 META-INF/dubbo/、META-INF/services/和 META-INF/dubbo/internal/這三個目錄中加載擴展點。在 loadFile 方法中,Dubbo 是直接通過 Class.forName 的形式加載這些 SPI 的擴展類,并進行緩存。

講到這里,我們發現,為了提升實例類的加載速度,Dubbo 和 JDK 都采用了緩存機制,這是它們的一個共同點。但實際上,我們也已經可以梳理 Dubbo 中 SPI 機制與 JDK 中 SPI 機制的區別,核心有兩點,就是 配置文件位置和 獲取實現類的條件

Dubbo 與 JDK 中 SPI 機制的兩點核心區別Dubbo 與 JDK 中 SPI 機制的兩點核心區別

  • 從加載 SPI 實例的配置文件位置來看,Dubbo 支持更多的加載路徑。JDK 只能加載一個固定的 META-INF/services,而 Dubbo 有三個路徑。
  • 就獲取實現類的條件而言,Dubbo 采用的是直接通過名稱對應的 Key 值來定位具體實現類,而 ServiceLoader 內部使用的是一個迭代器,在獲取目標接口的實現類時,只能通過遍歷的方式把配置文件中的類全部加載并實例化,顯然這樣效率比較低下。

簡單來說,Dubbo 沒有直接沿用 JDK SPI 機制,而是自己實現一套的主要目的就是克服這種效率低下的情況,并提供了更多的靈活性。

總結

我們從 Dubbo 配置項的定義中發現,Dubbo 采用了與 JDK 不同的實現機制。雖然 Dubbo 也采用了 SPI 機制,也是從 jar 包中動態加載實現類,但它的實現方式與 JDK 中基于 ServiceLoader 是不一樣的。于是,我們詳細分析了 JDK 和 Dubbo 在 SPI 機制設計和實現上的差異,并闡明了 Dubbo 內部的實現原理和所具備的優勢。

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

2024-10-29 08:34:55

SPI機制接口

2025-05-08 03:25:00

DubboSPI機制

2021-09-10 08:31:19

DubboSPI框架

2020-12-14 11:35:22

SPI Java機制

2023-12-11 07:21:12

SPI機制插件

2025-03-04 09:02:25

JavaSPI機制

2024-01-15 08:25:53

SPI機制JavaDubbo

2023-03-13 22:09:59

JavaSpring機制

2018-07-06 15:30:14

DubboSPIJDK

2020-06-30 15:35:36

JavaSPI代碼

2023-02-15 13:57:13

JavaSPI動態擴展

2011-11-30 14:35:19

JavaSPI

2025-08-05 01:55:00

JavaSPI機制

2025-05-27 01:00:00

2011-06-13 10:21:25

QT 信號 槽機制

2020-11-20 07:51:02

JavaSPI機制

2010-04-27 12:56:35

lvs負載均衡

2023-06-05 08:07:33

JavaJava SPI

2023-01-30 22:43:39

DubboZooKeeper

2024-01-19 12:48:00

Redis存儲數據庫
點贊
收藏

51CTO技術棧公眾號

国产+成+人+亚洲欧洲在线| 黄色视屏网站在线免费观看| 亚洲一级一区| 亚洲老头同性xxxxx| 久久久精品麻豆| v片在线观看| 91网站黄www| 成人激情在线观看| 9i看片成人免费看片| 免费精品国产| 精品免费国产二区三区| 国产淫片av片久久久久久| 老司机在线视频二区| 91小视频在线免费看| 成人精品视频99在线观看免费| 日本少妇吞精囗交| 婷婷综合社区| 国产亚洲一区二区精品| 国产精品熟妇一区二区三区四区| 国产一区二区三区朝在线观看| 亚洲一区二区高清| 国产一区二区三区在线观看视频| 国产美女视频免费看| 日产福利视频在线观看| 亚洲同性同志一二三专区| 老牛影视免费一区二区| 成人免费观看在线视频| 日本三级亚洲精品| 欧美在线免费看| 麻豆一区二区三区精品视频| 日韩久久久久| 国产午夜精品免费一区二区三区 | 毛片a片免费观看| av一区二区高清| 日韩精品在线免费观看| 久久精品无码专区| 日本99精品| 欧美一区午夜精品| 红桃视频 国产| 电影一区二区| 在线日韩一区二区| 99福利在线观看| 欧美人体视频xxxxx| 亚洲少妇屁股交4| 亚洲精品a区| **国产精品| 欧美日韩伊人| 国产香蕉一区二区三区在线视频 | 中文字幕成人一区| 成人亚洲综合天堂| 国产日韩欧美综合一区| 欧美日韩精品久久| 日本一区二区三区在线观看视频| av一区二区不卡| 狠狠色狠狠色综合人人| 日韩一级片免费观看| 婷婷激情图片久久| 最近2019中文免费高清视频观看www99| 91精品人妻一区二区| 一根才成人网| 欧美午夜片在线免费观看| 久久久久久免费看| 欧美gv在线观看| 色呦呦国产精品| 91色国产在线| 四虎国产精品永久在线国在线| 欧美精品免费视频| 深夜做爰性大片蜜桃| 亚洲午夜免费| 亚洲精品99久久久久中文字幕| 国产网站无遮挡| 最新亚洲精品| xxxxx成人.com| 欧美成人精品一区二区免费看片| 18成人免费观看视频| 97香蕉超级碰碰久久免费软件 | 影音先锋中文在线视频| 亚洲狠狠爱一区二区三区| 国产精品久久久久7777| 亚洲黄色免费av| 欧美日韩美少妇| 初高中福利视频网站| 欧美黄色录像| 日韩中文字幕免费| 久久精品国产亚洲av无码娇色 | 日本一区二区在线| 免费在线午夜视频| 亚洲第一狼人社区| 日韩美女视频在线观看| 91极品视觉盛宴| 日本免费高清一区| 天天综合视频在线观看| 亚洲男人的天堂在线aⅴ视频| 18禁裸男晨勃露j毛免费观看| 五月天av在线| 7777精品伊人久久久大香线蕉经典版下载 | 久久久久国产精品免费| 可以免费在线观看的av| 看电视剧不卡顿的网站| 国产欧美丝袜| 日本不卡三区| 欧美性猛xxx| 超碰91在线播放| 亚洲人成精品久久久| 亚洲国产高清一区二区三区| 最好看的中文字幕久久| 少妇av一区二区三区无码| 最新日韩一区| 亚洲国产高清高潮精品美女| 九一在线免费观看| 99精品热视频只有精品10| 91久久国产婷婷一区二区| 四虎在线免费观看| 欧美日韩在线看片| 国产真实乱偷精品视频免| 精品国产日本| 国产日产一区二区三区| 欧美视频精品一区| 国内自拍偷拍视频| 久久在线视频| 国产精品6699| 四虎在线观看| 午夜国产不卡在线观看视频| 97超碰人人看| 成人免费在线观看av| 2019中文在线观看| 高潮一区二区三区乱码| 中文在线一区二区 | 亚洲欧美日本视频在线观看| 7777精品久久久大香线蕉小说| av女优在线| 色就色 综合激情| 97人妻精品一区二区三区免| 国产精品magnet| 成人午夜一级二级三级| 一级日本在线| 欧美视频在线观看一区二区| 中文字幕av网址| 久久黄色网页| 欧美激情论坛| 欧美男女交配| 国产一区二区精品丝袜| 亚洲国产av一区二区三区| 91麻豆国产福利在线观看| 91免费黄视频| 欧美午夜寂寞| 欧美亚洲另类激情另类| 五月婷婷丁香花| 欧美日韩国内自拍| 性活交片大全免费看| 亚洲无线视频| 国产中文一区二区| 性感女国产在线| 精品无码久久久久久国产| 黄色在线免费观看| 国产日韩欧美精品在线| 精品久久久噜噜噜噜久久图片| 亚洲丝袜美腿一区| 国产精品久久久久77777| 成人午夜影视| 欧美日韩极品在线观看一区| 啪啪一区二区三区| 国产精品资源站在线| 欧美日韩视频免费| 日韩成人午夜| 国产精品久久久久久亚洲调教| 成人欧美亚洲| 欧美一区二区三区喷汁尤物| 久久久无码精品亚洲国产| www.色综合.com| 激情视频综合网| 亚洲精品久久| 国产精品久久九九| 成人小电影网站| 日韩在线不卡视频| 韩国av永久免费| 色偷偷成人一区二区三区91| 又色又爽的视频| 国产精品99久| www.爱色av.com| 99久久www免费| 国产精品一区而去| 免费污视频在线一区| 久久亚洲欧美日韩精品专区| 少妇av一区二区| 欧美视频日韩视频| 国产性生活网站| 久久精品亚洲一区二区三区浴池| 国产免费中文字幕| 夜夜嗨一区二区| 免费看啪啪网站| 欧美国产极品| 亚洲综合精品伊人久久| 黑人巨大精品| 欧美日韩国产成人在线观看| 久久精品a一级国产免视看成人| 欧美日韩成人激情| 伊人久久综合视频| 中文字幕佐山爱一区二区免费| 中文字幕人妻一区二区三区| 精品一区二区三区在线观看| a√天堂在线观看| 伊人久久大香线| 欧美一区视久久| 亚洲综合网狠久久| 国产精品一二三视频| 色在线视频观看| 久久在精品线影院精品国产| 久青草国产在线| 亚洲精品一区二区三区福利| 一道本在线视频| 日韩欧美主播在线| 国产一级免费观看| 1024精品合集| 日本精品在线观看视频| 日韩精品一卡| 国产精品免费在线播放| 久久免费影院| 国产精品成人v| 理论不卡电影大全神| 欧美激情va永久在线播放| 欧美午夜电影一区二区三区| 亚洲色图18p| 五月婷婷狠狠干| 亚洲国产精品高清久久久| 国产精品一二三四五区| 欧美日韩亚洲国产综合| 波多野结衣视频网址| 黄色精品在线看| 圆产精品久久久久久久久久久| 亚洲欧美乱综合| 羞羞在线观看视频| 中文字幕一区二区三区视频| 免费一级做a爰片久久毛片潮| 成人sese在线| 稀缺小u女呦精品呦| 国产伦精一区二区三区| 中文字幕第66页| 国产一区高清在线| www激情五月| 国产一区二区三区精品欧美日韩一区二区三区 | 99热99这里只有精品| 欧美激情一区二区三区全黄| 爱情岛论坛成人| 久久只有精品| 别急慢慢来1978如如2| 天堂成人国产精品一区| 动漫av免费观看| 免费成人美女在线观看.| www.色就是色| 久久精品国产一区二区三| 最新中文字幕免费视频| 美日韩一级片在线观看| xxx国产在线观看| 极品美女销魂一区二区三区免费| 久国产精品视频| 国产成人免费视频一区| 国产免费a级片| 99riav久久精品riav| 国内精品久久99人妻无码| 久久毛片高清国产| www.99热| 亚洲女性喷水在线观看一区| 国产真人真事毛片| 欧美日韩美女在线观看| 999视频在线| 91麻豆精品国产91久久久久| 精品国精品国产自在久不卡| 亚洲国产精品资源| 青青草在线视频免费观看| 一个色综合导航| 成年人黄视频在线观看| 久久久久久久久久av| 不卡福利视频| 成人激情春色网| 国产精品chinese在线观看| 免费看污久久久| 国产精品99久久精品| 日本香蕉视频在线观看| 免费在线观看成人av| 福利片一区二区三区| 丁香桃色午夜亚洲一区二区三区| 大又大又粗又硬又爽少妇毛片 | 91在线播放观看| 日韩欧美国产中文字幕| а中文在线天堂| 亚欧色一区w666天堂| 国产又大又黄又粗| 欧美一区二区视频在线观看2022| 五月婷婷丁香花| 久久精品中文字幕一区| 亚洲一区资源| 99re视频| 成人aaaa| 少妇无码av无码专区在线观看| 久久国产精品第一页| 欧美xxxxx精品| 亚洲色图丝袜美腿| 国产性生活视频| 欧美成人性战久久| 成人h小游戏| 91高清视频在线免费观看| 日韩免费大片| 欧美精品成人一区二区在线观看| 欧美激情综合色综合啪啪| 妺妺窝人体色www在线观看| 成人性生交大片免费看视频在线 | 性欧美69xoxoxoxo| 久草精品在线播放| av色综合久久天堂av综合| 欧美肥妇bbwbbw| 在线观看网站黄不卡| 日韩一级在线播放| 久久精品99久久香蕉国产色戒| 久久sese| 久久久久高清| 激情久久五月| 国产黑丝在线视频| 国产精品高潮呻吟久久| 亚洲 欧美 日韩 在线| 亚洲国产高清高潮精品美女| 日本资源在线| 91在线观看免费| 99久久99久久精品国产片桃花| 91日韩视频在线观看| 久久蜜桃av一区精品变态类天堂| 国产精品黄色网| 精品国产亚洲在线| 金瓶狂野欧美性猛交xxxx| 91亚洲精品在线| 亚洲无中文字幕| 亚洲午夜精品一区| 国产精品美女一区二区| 中文在线免费观看| 亚洲日韩欧美视频一区| 成人午夜视屏| 青青影院一区二区三区四区| 一本一本久久| 麻豆国产精品一区| 色综合久久久久久久| 巨骚激情综合| 国产精品日韩av| 日韩成人精品一区二区| 在线观看国产一级片| 国产精品三级久久久久三级| 中文字幕一区二区三区波野结| 一色桃子一区二区| 久久av影院| 手机看片日韩国产| 国产suv精品一区二区三区| 久久综合色综合| 亚洲国产另类久久精品 | 欧美/亚洲一区| 女教师高潮黄又色视频| 亚洲电影第三页| 天堂资源中文在线| 国产成人jvid在线播放| 精品视频网站| 国产成人美女视频| 亚洲精品久久久蜜桃| 内射后入在线观看一区| 97超碰色婷婷| 欧美码中文字幕在线| 看看黄色一级片| 亚洲一区二区三区小说| 无码国产伦一区二区三区视频| 日韩免费观看视频| 99久久久久| 特级特黄刘亦菲aaa级| 色婷婷国产精品| 日本在线观看免费| 高清国产在线一区| 久久精品成人| 亚洲精品一区二区三区在线播放| 日韩一区二区三区视频在线 | 精品999视频| 成人国产在线激情| 激情久久中文字幕| 阿v天堂2014| 精品精品国产高清一毛片一天堂| 樱花草涩涩www在线播放| 亚洲精品第一区二区三区| 粉嫩av一区二区三区粉嫩| 日日夜夜狠狠操| 欧美成人精品一区二区| 亚洲三级精品| 五月天国产视频| 日本韩国精品一区二区在线观看| 欧美激情二区| 久久影视中文粉嫩av| 久久国产婷婷国产香蕉| 日韩精品一卡二卡| 自拍偷拍亚洲一区| 精品人人人人| 在线观看中文av| 色狠狠综合天天综合综合| 久久免费电影| 中文字幕一区二区三区四区五区六区| 成人av一区二区三区| 一道本在线视频|