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

一款優(yōu)秀數(shù)據(jù)庫中間件的不完全解析

數(shù)據(jù)庫 其他數(shù)據(jù)庫
數(shù)據(jù)庫中間件可以理解為是一種具有連接池功能,但比連接池更高級的、帶很多附加功能的輔助組件,不僅可以租沖浪板,還可以提供地點(diǎn)推薦、上保險(xiǎn)等等各類服務(wù)。

[[400698]]

本文內(nèi)容概述

數(shù)據(jù)庫中間件有啥用

架構(gòu)剖析之高屋建瓴

2.1. 整體概述

2.2. 組件圖看架構(gòu)

細(xì)節(jié)剖析之一葉知秋

 3.1. 配置加載和bean初始化

3.2. 細(xì)說讀寫分離

總結(jié)

Part1數(shù)據(jù)庫中間件有啥用

有一天,你去三亞玩耍,就想玩?zhèn)€沖浪,即時(shí)你不差錢,難道還要自己采買快艇、滑板等等裝備來滿足這為數(shù)不多的心血來潮么。租一個(gè)就行了嘛。這其實(shí)就是連接池的作用。

數(shù)據(jù)庫中間件可以理解為是一種具有連接池功能,但比連接池更高級的、帶很多附加功能的輔助組件,不僅可以租沖浪板,還可以提供地點(diǎn)推薦、上保險(xiǎn)等等各類服務(wù)。

從網(wǎng)上的資料看,zdal應(yīng)該算是半開源的,好像是之前開源過,但后續(xù)沒有準(zhǔn)備維護(hù),然后就刪除了,不過github被fork下來好多,隨便一搜就是一片,當(dāng)前,只是老的版本。目前螞蟻內(nèi)部的zdal好像已經(jīng)更新到zdal5了吧,那咱可就看不到了。

越復(fù)雜的系統(tǒng),數(shù)據(jù)庫中間件的作用越大。就拿zdal來說,它提供分庫分表,結(jié)果集合并,sql解析,數(shù)據(jù)庫failover動態(tài)切換等數(shù)據(jù)訪問層統(tǒng)一解決方案。下面就一起來看下,其內(nèi)部實(shí)現(xiàn)是怎么樣的。

Part2架構(gòu)剖析之高屋建瓴

2.1整體概述

如上圖所示,zdal有四個(gè)重要的組成部分:

價(jià)值體現(xiàn)--客戶端Client包。對外暴露基本操作接口,用于業(yè)務(wù)層簡單黑盒的操作數(shù)據(jù)源;業(yè)務(wù)只和client交互,動態(tài)切換/路由等邏輯只需要進(jìn)行規(guī)則配置,相關(guān)邏輯由zdal實(shí)現(xiàn)。

核心功能--連接管理datasource包。最核心的能力,提供多種類型數(shù)據(jù)庫的連接管理;不管功能多花哨,最終目的還是為了解決數(shù)據(jù)庫連接的問題。

關(guān)鍵能力--SQL解析parser包。基礎(chǔ)SQL解析能力;解析sql類型、字段名稱、數(shù)據(jù)庫等等,配合規(guī)則進(jìn)行路由

擴(kuò)展能力--庫表路由rule包。根據(jù)parser解析出的字段確定邏輯庫表和物理庫表。

2.2組件圖看架構(gòu)

組件圖對整體架構(gòu)和各組件及相互聯(lián)系的理解可以起到很好的幫助。一個(gè)簡版的組件圖畫了好久,還有不少錯(cuò),不過大概是這么個(gè)意思,哎,基本功要丟~

對照上圖可以比較清晰的看到:

Client包對應(yīng)用層暴露的數(shù)據(jù)源、負(fù)責(zé)監(jiān)聽配置動態(tài)變更的監(jiān)聽組件、負(fù)責(zé)加載組織各部分的配置組件、負(fù)責(zé)加載spring bean 和庫表規(guī)則的配置組件;

 Client中加載了規(guī)則組件,實(shí)現(xiàn)邏輯表和數(shù)據(jù)庫的路由規(guī)則。

Client中的庫表配置調(diào)用datasource中的數(shù)據(jù)源管理服務(wù)并構(gòu)建連接池的連接池;

Client中的SqlDispatcher服務(wù)調(diào)用SQL解析組件實(shí)現(xiàn)SQL解析。

Part3細(xì)節(jié)剖析之一葉知秋

3.1配置加載和bean初始化

大部分情況下,我們使用如mybatis這樣的ORM框架來進(jìn)行數(shù)據(jù)庫操作,其實(shí)不管是ORM還是其他方式,應(yīng)用層都需要對數(shù)據(jù)源進(jìn)行配置。

所以,client對外暴露了一個(gè)符合JDBC標(biāo)準(zhǔn)的datasource數(shù)據(jù)源,用來滿足應(yīng)用層ORM等框架配置數(shù)據(jù)源的要求--ZdalDataSource

如圖片被壓縮看不清,后臺回復(fù)<zdal類圖>獲取 

  1. //只提供了一個(gè)init方法,這也是spring啟動時(shí)時(shí),必須要調(diào)用的初始化方法,所有功能,都從這里開始  
  2. public class ZdalDataSource extends AbstractZdalDataSource implements DataSource{  
  3.     public void init() {  
  4.         try {  
  5.             super.initZdalDataSource();  
  6.         } catch (Exception e) {  
  7.             CONFIG_LOGGER.error("...");  
  8.             throw new ZdalClientException(e);  
  9.         }  
  10.     } 

ZdalDataSource#init() 方法即為配置加載的核心入口,init中負(fù)責(zé)加載spring配置,根據(jù)配置初始化數(shù)據(jù)源,并創(chuàng)建連接池,同時(shí),將邏輯表和物理庫的對應(yīng)關(guān)系都維護(hù)起來供后續(xù)路由調(diào)用。 

  1.     /*父類的init方法*/  
  2. protected void initZdalDataSource() {  
  3.     /*用FileSystemXmlApplicationContext方式加載配置文件中的數(shù)據(jù)源和規(guī)則,轉(zhuǎn)化成zdalConfig對象*/  
  4.     this.zdalConfig = ZdalConfigurationLoader.getInstance().getZdalConfiguration(appName,dbmode, appDsName, configPath);  
  5.     this.dbConfigType = zdalConfig.getDataSourceConfigType();  
  6.    this.dbType = zdalConfig.getDbType();  
  7.    //初始化數(shù)據(jù)源  
  8.    this.initDataSources(zdalConfig);  
  9.    this.inited.set(true);  
  10.     }  

從上面的類圖和這里的兩個(gè)入口方法大概了解到zdal配置加載的啟動流程。下面我們就來詳細(xì)看一下,讀寫分離和分庫分表的規(guī)則是怎么被加載,怎么起作用的。

3.2細(xì)說讀寫分離

讀寫分離配置的加載

首先,我們需要有數(shù)據(jù)源的相關(guān)配置,如下圖:

圖片此XML配置會在init方法被調(diào)用時(shí),被初始化,解析成ZdalConfig類的屬性,ZdalConfig類的主要成員見下面代碼: 

  1. public class ZdalConfig {  
  2.     /** key=dsName;value=DataSourceParameter 所有物理數(shù)據(jù)源的配置項(xiàng),比如用戶名,密碼,庫名等 */  
  3.     private Map<String, DataSourceParameter> dataSourceParameters = new ConcurrentHashMap<String, DataSourceParameter>();  
  4.     /** 邏輯數(shù)據(jù)源和物理數(shù)據(jù)源的對應(yīng)關(guān)系:key=logicDsName,value=physicDsName */  
  5.     private Map<String, String>              logicPhysicsDsNames  = new ConcurrentHashMap<String, String>();  
  6.     /** 數(shù)據(jù)源的讀寫規(guī)則,比如只讀,或讀寫等配置*/  
  7.     private Map<String, String>              groupRules           = new ConcurrentHashMap<String, String>();  
  8.     /** 異常轉(zhuǎn)移的數(shù)據(jù)源規(guī)則*/  
  9.     private Map<String, String>              failoverRules        = new ConcurrentHashMap<String, String>();  
  10.     //一份完整的讀寫分離和分庫分表規(guī)則配置  
  11.     private AppRule                          appRootRule; 

可以看到,xml中的規(guī)則,被解析到xxxRules里。這里以groupRules為例,failover同理。

下一步則是通過解析得到的zdalConfig 來初始化數(shù)據(jù)源: 

  1. protected final void initDataSources(ZdalConfig zdalConfig) {  
  2.     //DataSourceParameter中存的是數(shù)據(jù)源參數(shù),如用戶名密碼,最大最小連接數(shù)等  
  3.     for (Entry<String, DataSourceParameter> entry : zdalConfig.getDataSourceParameters().entrySet()) {  
  4.         try {  
  5.            //初始化連接池  
  6.            ZDataSource zDataSource = new ZDataSource(/*設(shè)置最大最小連接數(shù)*/createDataSourceDO(entry.getValue(),zdalConfig.getDbType(), appDsName + "." + entry.getKey())); 
  7.             this.dataSourcesMap.put(entry.getKey(), zDataSource); 
  8.          } catch (Exception e) {  
  9.             //...  
  10.         }  
  11.    }  
  12.   //其他分支略,只看最簡單的分組模式  
  13.   if (dbConfigType.isGroup()) {  
  14.        //讀寫配置賦值  
  15.        this.rwDataSourcePoolConfig = zdalConfig.getGroupRules();  
  16.        //初始化多份讀庫下的負(fù)載均衡  
  17.        this.initForLoadBalance(zdalConfig.getDbType());  
  18.   }  
  19.   //注冊監(jiān)聽:為了滿足動態(tài)切換  
  20.   this.initConfigListener();  

initForLoadBalance的方法如下: 

  1. private void initForLoadBalance(DBType dbType) {  
  2.     Map<String, DBSelector> dsSelectors = this.buildRwDbSelectors(this.rwDataSourcePoolConfig);  
  3.     this.runtimeConfigHolder.set(new ZdalRuntime(dsSelectors));  
  4.     this.setDbTypeForDBSelector(dbType);  

可以看到,首先構(gòu)建出了DB選擇器,然后賦值給了runtimeConfigHolder供運(yùn)行時(shí)獲取。而構(gòu)建DB選擇器的時(shí)候,其實(shí)是按讀寫兩個(gè)維度,把所有數(shù)據(jù)源都構(gòu)建了一遍,即group_r和group_w下都包含5個(gè)數(shù)據(jù)源,只不過各自的權(quán)重不一樣: 

  1. //比如按上面的配置寫庫只有一個(gè),但是也會包含全數(shù)據(jù)源  
  2. group_0_w_0 :< bean:read0DataSource , writeWeight:0>  
  3. group_0_w_1 :< bean:writeDataSource , writeWeight:10>  
  4. group_0_w_2 :< bean:read1DataSource , writeWeight:0>  
  5. group_0_w_3 :< bean:read2DataSource , writeWeight:0>  
  6. group_0_w_4 :< bean:read3DataSource , writeWeight:0>  
  7. //上述就是寫相關(guān)的DBSelecter的內(nèi)容。 

讀寫分離怎么起作用

以delete為例,更新刪除是要操作寫庫的 

  1. public void delete(ZdalDataSource dataSource) {  
  2.     String deleteSql = "delete from test" 
  3.     Connection conn = null 
  4.     PreparedStatement pst = null 
  5.     try {  
  6.        conn = dataSource.getConnection();  
  7.        pst = conn.prepareStatement(deleteSql);  
  8.        pst.execute(); 
  9.     } catch (Exception e) {  
  10.            //...  
  11.     } finally {  
  12.           //資源關(guān)閉  
  13.     }  

getConnection會從上文中提到的runtimeConfigHolder中獲取DBSelecter,然后執(zhí)行execute方法 

  1. public boolean execute() throws SQLException {  
  2.    SqlType sqlType = getSqlType(sql);  
  3.    // SELECT相關(guān)的就選擇group_r對應(yīng)的DBSelecter  
  4.   if (sqlType == SqlType.SELECT || sqlType == SqlType.SELECT_FOR_UPDATE|| sqlType == SqlType.SELECT_FROM_DUAL) {  
  5.     //略  
  6.    return true;  
  7.    //update/delete相關(guān)的就選擇group_w對應(yīng)的DBSelecter  
  8.  } else if (sqlType == SqlType.INSERT || sqlType == SqlType.UPDATE|| sqlType == SqlType.DELETE) {  
  9.       if (super.dbConfigType == DataSourceConfigType.GROUP) {  
  10.           executeUpdate0();  
  11.       } else {  
  12.           executeUpdate();  
  13.      }  
  14.      return false;  
  15.  }  

如果是讀取相關(guān)的,那就選_r的DBSelecter,如果是寫相關(guān)的,那就選_W的DBSelecter。那么executeUpdate0中是怎么執(zhí)行區(qū)分讀寫數(shù)據(jù)源的呢,其實(shí)就是把這一組的數(shù)據(jù)源根據(jù)權(quán)重篩選一遍。 

  1. // WeightRandom#select(int[], java.lang.String[])  
  2. private String select(int[] areaEnds, String[] keys) {  
  3.    //這里的areaEnds數(shù)組,是一個(gè)累加范圍值數(shù)據(jù)  
  4.    //比如三個(gè)庫權(quán)重    10   9   8  
  5.    //那么areaEnds就是  10  19  27 是對每個(gè)權(quán)重的累加,最后一個(gè)值是總和  
  6.    int sum = areaEnds[areaEnds.length - 1];  
  7.    //這樣隨機(jī)出來的數(shù),是符合權(quán)重分布的  
  8.    int rand = random.nextInt(sum);  
  9.    for (int i = 0; i < areaEnds.length; i++) {  
  10.        if (rand < areaEnds[i]) {  
  11.            return keys[i];  
  12.    }  
  13.    return null;  

Part4總結(jié)

本篇文章,把阿里數(shù)據(jù)庫中間件相關(guān)的組件和加載流程進(jìn)行了總結(jié),就一個(gè)最基本的分組讀寫分離的流程,對內(nèi)部實(shí)現(xiàn)進(jìn)行了闡述。說是解析,其實(shí)是提供給大家一種閱讀的思路,畢竟篇幅有限,如果對中間件感興趣的同學(xué),可以fork下代碼,按上述邏輯自己閱讀下。

看源碼時(shí),比如dubbo這些中間件其實(shí)是比較容易入手的,因?yàn)樗麄兌家劳杏赟pring進(jìn)行JavaBean的裝載,所有,對Spring容器暴露的那些init、load方法,就是很好的切入點(diǎn)。個(gè)人思路,希望對大家有所幫助。 

 

責(zé)任編輯:龐桂玉 來源: Coder的技術(shù)之路
相關(guān)推薦

2017-12-01 05:04:32

數(shù)據(jù)庫中間件Atlas

2017-11-27 05:36:16

數(shù)據(jù)庫中間件TDDL

2017-11-27 05:06:42

數(shù)據(jù)庫中間件cobar

2011-08-30 09:50:22

OracleRMAN不完全恢復(fù)基于SCN恢復(fù)

2011-08-30 09:35:10

OracleRMAN不完全恢復(fù)基于時(shí)間恢復(fù)

2021-12-16 08:21:31

高并發(fā)消息中間件

2018-02-24 19:37:33

Java8數(shù)據(jù)庫中間件

2017-04-13 08:46:41

oracle數(shù)據(jù)挖掘

2011-08-10 13:03:58

CJDBC數(shù)據(jù)庫集群

2017-05-23 18:55:05

mysql-proxy數(shù)據(jù)庫架構(gòu)

2017-12-11 13:30:49

Go語言數(shù)據(jù)庫中間件

2024-01-02 16:43:58

2017-07-26 09:41:28

MyCATSQLMongoDB

2015-09-01 10:42:15

編程規(guī)范完全指南

2024-12-06 08:29:29

2021-07-27 05:49:59

MySQL數(shù)據(jù)庫中間件

2011-08-30 10:02:18

OracleRMAN不完全恢復(fù)基于日志序列號恢復(fù)

2017-11-27 06:01:37

數(shù)據(jù)庫中間件中間層

2017-12-01 05:40:56

數(shù)據(jù)庫中間件join

2017-07-18 17:35:16

數(shù)據(jù)庫MyCATPreparedSta
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲国产精品久久久久久6q | 阿v天堂2014| 欧美精品高清| 国产精品色眯眯| 亚洲bt天天射| 亚洲另类在线观看| 欧美电影《睫毛膏》| 亚洲精品一区二区三区四区高清| 久久婷婷国产精品| 综合图区亚洲| 久久久久久夜精品精品免费| 91美女片黄在线观看游戏| 日本熟妇毛茸茸丰满| 欧美在线免费看视频| 日韩视频免费观看高清在线视频| avav在线看| h视频在线免费观看| 久久只精品国产| 91福利视频导航| 中文字幕av资源| 影音先锋一区| 久久久国产91| av中文字幕免费观看| 日韩视频一二区| 欧洲精品在线观看| 狠狠97人人婷婷五月| 黄网站视频在线观看| 久久精品水蜜桃av综合天堂| av成人在线电影| 亚洲天堂视频网| 亚洲一区日韩| 性视频1819p久久| 91高清免费观看| 国产中文精品久高清在线不| 日韩一级免费一区| 五月天激情视频在线观看| 欧美gv在线| 亚洲va韩国va欧美va| 国产成人免费高清视频| 91大神在线网站| 国产亚洲午夜高清国产拍精品 | 国产精品流白浆在线观看| 欧美日韩在线综合| 国产免费999| 成人免费看黄| 色天使久久综合网天天| 青青艹视频在线| 51精品视频| 亚洲国产毛片aaaaa无费看 | 99九九视频| 国产毛片一区二区三区va在线| 久久一区二区三区四区五区| 91成人在线视频| 国产香蕉视频在线| 亚洲精品美女91| 38少妇精品导航| 天天综合天天干| 亚洲一区二区三区高清| 欧美在线视频一区| 无码人妻丰满熟妇精品区| 久久激情综合| 国产成人精品综合| 久久久999久久久| 免费人成精品欧美精品| 国产精品久久9| 一二三区在线播放| 精品午夜久久福利影院| 91久久偷偷做嫩草影院| 丰满少妇高潮在线观看| 成人av网站在线观看| 久久riav| 国产资源在线观看| 国产精品久久久久久久久免费樱桃 | 国产精品一二三在线观看| 18视频在线观看网站| 亚洲国产日产av| 国产成人a亚洲精v品无码| 免费成人直播| 欧美猛男超大videosgay| 伊人五月天婷婷| 超碰97久久国产精品牛牛| 亚洲成年人在线播放| 草草影院第一页| 日本一区二区在线看| 久热国产精品视频| 日本一区二区三区免费视频| 久久精品主播| 91成人理论电影| 欧美成人综合在线| 最新国产精品久久精品| 亚洲 欧美 综合 另类 中字| 大胆人体一区| 日韩三级高清在线| 国产精品jizz| 欧美一区成人| 情事1991在线| 精品二区在线观看| 久久久蜜桃精品| 日韩中文字幕亚洲精品欧美| 小h片在线观看| 91精品国产一区二区人妖| 午夜av免费看| 亚洲先锋影音| 欧美在线视频一区| 成 人 黄 色 片 在线播放| 久久蜜桃av一区二区天堂| 日本一本草久p| 日韩中文影院| 日韩精品中文字幕一区二区三区 | 日韩深夜福利| 久久影院模特热| 波多野结衣一区二区三区四区| 国产激情一区二区三区| 亚洲丰满在线| 国模冰冰炮一区二区| 日韩你懂的在线播放| 18啪啪污污免费网站| 亚洲狼人精品一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲 欧美 精品| 一区二区三区视频在线看| 三级a在线观看| 亚欧洲精品视频在线观看| 欧美插天视频在线播放| 中文字幕+乱码+中文字幕明步| 成人的网站免费观看| 六月婷婷激情网| 成人深夜福利| 亚洲人成电影在线观看天堂色| 日韩av女优在线观看| 国内一区二区视频| 色呦呦网站一区| 久久免费高清视频| 一级片在线免费播放| 波多野结衣91| 日本中文字幕在线视频观看| 国产麻豆一区二区三区| 中文字幕精品在线| 亚洲毛片一区二区三区| 91在线porny国产在线看| 超碰人人爱人人| 国产一区二区三区黄网站| 伊人av综合网| 黄色片中文字幕| 久久综合色综合88| 久久精品视频16| 9l视频自拍蝌蚪9l视频成人| 美日韩精品免费观看视频| 一级片免费网站| 中文字幕乱码久久午夜不卡| 国产a级一级片| 亚洲动漫精品| 欧美亚洲国产成人精品| 香蕉av一区二区三区| 性欧美大战久久久久久久久| a天堂视频在线观看| 最新成人av网站| 国产精品高清免费在线观看| h网站视频在线观看| 欧美亚洲动漫另类| 国产三级aaa| 国产一二三精品| 国产精品av免费观看| 国产精品45p| 欧美在线激情网| 国产在线高清| 欧美日韩国产精选| 国产免费亚洲高清| 超碰人人人人人人人| 奇米一区二区三区av| 在线观看亚洲视频啊啊啊啊| 成人国产精品一区二区网站| 久久不射热爱视频精品| 欧美一级淫片免费视频魅影视频| 精品久久久久久久大神国产| 熟女俱乐部一区二区| 热久久一区二区| 乱子伦一区二区| 久久视频在线观看| 国产精品777| 久久99精品久久| 欧美va亚洲va国产综合| 亚洲天堂视频网站| 国产精品乱码一区二区三区软件| 在线播放免费视频| 日韩天天综合| 亚洲综合av一区| 国产精品久久久网站| 国产成人鲁鲁免费视频a| 精品自拍一区| 亚洲精品大尺度| 亚洲免费视频二区| 亚洲永久精品大片| www.色天使| 国产精选一区二区三区| 亚洲爆乳无码专区| 欧美一区网站| 日本不卡在线观看| 日韩视频一二区| 国产精品国产福利国产秒拍| 性欧美高清come| 影音先锋欧美精品| 韩国av在线免费观看| 欧美无人高清视频在线观看| 国产在线拍揄自揄拍无码视频| 久久这里只有精品6| 亚洲一区二区中文字幕在线观看| 亚洲久久成人| 日韩不卡一二区| 国产欧美一区二区精品久久久| 亚洲va男人天堂| 日本免费久久| 欧美激情精品久久久久久黑人| 国产日本在线| 亚洲激情在线观看视频免费| 97精品久久人人爽人人爽| 欧美日韩中文字幕| 久久久久国产精品夜夜夜夜夜| 欧美国产乱子伦| 亚洲调教欧美在线| 国产一区二区中文字幕| 丁香婷婷激情网| 99热这里只有精品8| 欧美乱做爰xxxⅹ久久久| 欧美一级淫片| 久久久久一区二区| 草草视频在线一区二区| 91免费版网站入口| 日本精品久久| 国产精品久久久久久久久久新婚| av最新在线| 色综合老司机第九色激情 | 久久蜜桃av一区二区天堂| 精品国产aⅴ一区二区三区东京热| 久久爱www久久做| 一区二区三区 日韩| 日日夜夜精品视频免费| 黑人糟蹋人妻hd中文字幕| 99热免费精品| 黄页免费在线观看视频| 国内自拍视频一区二区三区 | 精品孕妇一区二区三区| 在线播放国产一区二区三区| 男生女生差差差的视频在线观看| 亚洲国产精品电影| 亚洲高清精品视频| 日韩三级免费观看| 高潮一区二区三区乱码| 精品电影一区二区三区| 少妇一区二区三区四区| 日韩美一区二区三区| www.com在线观看| 欧美变态tickling挠脚心| www.久久成人| 精品美女一区二区| 欧洲成人一区二区三区| 亚洲国产精品va在线看黑人| 午夜激情在线视频| 亚洲摸下面视频| 国产三级电影在线观看| 日日骚久久av| 久久黄色美女电影| 久久99精品久久久久久琪琪| 福利网站在线观看| 992tv成人免费影院| 成人教育av| 国产免费一区二区三区在线能观看| 久久久成人av毛片免费观看| 国产精品尤物福利片在线观看| 日韩成人综合网站| av一区观看| 丝袜美腿一区二区三区动态图| 欧美日韩一区综合| 成人在线免费观看91| 天堂av在线中文| 精品99视频| 国产精品视频黄色| 国产伦精品一区二区三区视频青涩 | 欧美日韩一区在线播放| 91日韩视频| 国产精品免费看久久久无码| 亚洲精品麻豆| 污污的视频免费| 国产传媒日韩欧美成人| 久久人人妻人人人人妻性色av| 久久精品一区八戒影视| www.av免费| 天天色天天操综合| 国产精品高清无码| 欧美白人最猛性xxxxx69交| 日韩一区av| 久久久国产精品x99av| h片精品在线观看| 国产精品视频资源| 在线综合色站| 亚洲国产日韩美| 在线成人www免费观看视频| www.xxx亚洲| 国产福利一区二区三区视频| 亚洲AV无码片久久精品| 亚洲精品视频免费看| 伦av综合一区| 日韩一区二区精品葵司在线| 九色国产在线观看| 久久6精品影院| 中文另类视频| 国产免费高清一区| 欧美国产一级| 99re在线视频免费观看| 国产精品一区二区无线| 在线观看国产精品一区| 亚洲福利视频导航| 一级黄色片在线观看| 亚洲色图日韩av| 黄页在线观看免费| 成人在线视频网| 久久av综合| 国产欧美日韩网站| 国产二区国产一区在线观看| 正在播放国产对白害羞| 欧美视频不卡中文| 成人毛片在线免费观看| 久久精品久久久久| 91伊人久久| 美国av一区二区三区| 激情91久久| 韩国三级在线看| 亚洲精品免费一二三区| 中文字幕在线观看高清| 亚洲色图美腿丝袜| 成人av免费电影网站| 国产午夜精品一区| 红桃视频欧美| wwwxxx色| 亚洲精品乱码久久久久久久久| 中文字幕资源网| 亚洲性夜色噜噜噜7777| 成人免费看黄| 日本欧美精品久久久| 免费在线日韩av| 国产精品无码永久免费不卡| 亚洲国产精品自拍| 亚洲精品国产精品国| 欧美丰满少妇xxxxx| 亚洲精品午夜| www.国产在线视频| 国产成人精品aa毛片| 免费中文字幕在线| 日韩午夜在线播放| 欧美大胆的人体xxxx| 国产精品永久入口久久久| 亚洲无线视频| bl动漫在线观看| 欧美日韩激情视频| 九色在线视频蝌蚪| 国产精品福利小视频| 久久综合电影| 日韩精品aaa| 一区二区三区av电影 | 国产午夜精品视频| 热久久久久久| 日韩精品福利片午夜免费观看| 国产高清在线精品| 国产一级特黄视频| 国产丝袜视频一区| 欧美不卡高清一区二区三区| 色中色综合成人| 国产麻豆欧美日韩一区| 国产一级特黄aaa大片| 亚洲美女动态图120秒| 日韩在线影院| 99热都是精品| 成人av在线网站| 欧美人一级淫片a免费播放| 色综合伊人色综合网| 欧美片网站免费| www.com毛片| 亚洲欧洲性图库| 黄色av网站免费在线观看| 人九九综合九九宗合| 97视频精品| 黄色录像a级片| 欧美老女人第四色| 三级福利片在线观看| 免费亚洲一区二区| 久久丁香综合五月国产三级网站 | 日韩欧美精品在线观看| 亚洲1卡2卡3卡4卡乱码精品| 3d动漫精品啪啪一区二区三区免费| 亚洲精品社区| 神马久久精品综合| 日韩精品视频免费在线观看| 欧美少妇激情| 给我免费播放片在线观看| 国产欧美日韩综合精品一区二区| 国产成人a人亚洲精品无码| 欧洲成人午夜免费大片| 亚洲欧美偷拍自拍| 欧美特黄一区二区三区| 91精品国产aⅴ一区二区|