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

Nacos客戶端是如何實現實例獲取的負載均衡呢?

開發 前端
本篇文章追蹤Nacos客戶端源碼,分析了從實例列表中獲得其中一個實例的算法,也就是隨機權重負載均衡算法。整體業務邏輯比較簡單,從ServiceInfo中獲得實例列表,一路篩選,選中目標實例,然后根據它們的權重進行二次處理,數據結構封裝,最后基于Arrays#binarySearch提供的二分查找法來獲得對應的實例。

[[418899]]

前面我們講了Nacos客戶端如何獲取實例列表,如何進行緩存處理,以及如何訂閱實例列表的變更。在獲取到一個實例列表之后,你是否想過一個問題:如果實例列表有100個實例,Nacos客戶端是如何從中選擇一個呢?

這篇文章,就帶大家從源碼層面分析一下,Nacos客戶端采用了如何的算法來從實例列表中獲取一個實例進行請求的。也可以稱作是Nacos客戶端的負載均衡算法。

單個實例獲取

NamingService不僅提供了獲取實例列表的方法,也提供了獲取單個實例的方法,比如:

  1. Instance selectOneHealthyInstance(String serviceName, String groupName, List<String> clusters, boolean subscribe) 
  2.         throws NacosException; 

該方法會根據預定義的負載算法,從實例列表中獲得一個健康的實例。其他重載的方法功能類似,最終都會調用該方法,我們就以此方法為例來分析一下具體的算法。

具體實現代碼:

  1. @Override 
  2. public Instance selectOneHealthyInstance(String serviceName, String groupName, List<String> clusters, 
  3.         boolean subscribe) throws NacosException { 
  4.     String clusterString = StringUtils.join(clusters, ","); 
  5.     if (subscribe) { 
  6.         // 獲取ServiceInfo 
  7.         ServiceInfo serviceInfo = serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString); 
  8.         if (null == serviceInfo) { 
  9.             serviceInfo = clientProxy.subscribe(serviceName, groupName, clusterString); 
  10.         } 
  11.         // 通過負載均衡算法獲得其中一個實例 
  12.         return Balancer.RandomByWeight.selectHost(serviceInfo); 
  13.     } else { 
  14.         // 獲取ServiceInfo 
  15.         ServiceInfo serviceInfo = clientProxy 
  16.                 .queryInstancesOfService(serviceName, groupName, clusterString, 0, false); 
  17.         // 通過負載均衡算法獲得其中一個實例 
  18.         return Balancer.RandomByWeight.selectHost(serviceInfo); 
  19.     } 

selectOneHealthyInstance方法邏輯很簡單,調用我們之前講到的方法獲取ServiceInfo對象,然后作為參數傳遞給負載均衡算法,由負載均衡算法計算出最終使用哪個實例(Instance)。

算法參數封裝

先跟蹤一下代碼實現,非核心業務邏輯,只簡單提一下。

上面的代碼可以看出調用的是Balancer內部類RandomByWeight的selectHost方法:

  1. public static Instance selectHost(ServiceInfo dom) { 
  2.     // ServiceInfo中獲去實例列表 
  3.     List<Instance> hosts = selectAll(dom); 
  4.     // ... 
  5.     return getHostByRandomWeight(hosts); 

selectHost方法核心邏輯是從ServiceInfo中獲取實例列表,然后調用getHostByRandomWeight方法:

  1. protected static Instance getHostByRandomWeight(List<Instance> hosts) { 
  2.     // ... 判斷邏輯 
  3.     // 重新組織數據格式 
  4.     List<Pair<Instance>> hostsWithWeight = new ArrayList<Pair<Instance>>(); 
  5.     for (Instance host : hosts) { 
  6.         if (host.isHealthy()) { 
  7.             hostsWithWeight.add(new Pair<Instance>(host, host.getWeight())); 
  8.         } 
  9.     } 
  10.     // 通過Chooser來實現隨機權重負載均衡算法 
  11.     Chooser<String, Instance> vipChooser = new Chooser<String, Instance>("www.taobao.com"); 
  12.     vipChooser.refresh(hostsWithWeight); 
  13.     return vipChooser.randomWithWeight(); 

getHostByRandomWeight前半部分是將Instance列表及其中的權重數據進行轉換,封裝成一個Pair,也就是建立成對的關系。在此過程中只使用了健康的節點。

真正的算法實現則是通過Chooser類來實現的,看名字基本上知道實現的策略是基于權重的隨機算法。

負載均衡算法實現

所有的負載均衡算法實現均位于Chooser類中,Chooser類的提供了兩個方法refresh和randomWithWeight。

refresh方法用于篩選數據、檢查數據合法性和建立算法所需數據模型。

randomWithWeight方法基于前面的數據來進行隨機算法處理。

先看refresh方法:

  1. public void refresh(List<Pair<T>> itemsWithWeight) { 
  2.     Ref<T> newRef = new Ref<T>(itemsWithWeight); 
  3.     // 準備數據,檢查數據 
  4.     newRef.refresh(); 
  5.     // 上面數據刷新之后,這里重新初始化一個GenericPoller 
  6.     newRef.poller = this.ref.poller.refresh(newRef.items); 
  7.     this.ref = newRef; 

基本步驟:

  • 創建Ref類,該類為Chooser的內部類;
  • 調用Ref的refresh方法,用于準備數據、檢查數據等;
  • 數據篩選完成,調用poller#refresh方法,本質上就是創建一個GenericPoller對象;
  • 成員變量重新賦值;

這里重點看Ref#refresh方法:

  1. /** 
  2.  * 獲取參與計算的實例列表、計算遞增數組數總和并進行檢查 
  3.  */ 
  4. public void refresh() { 
  5.     // 實例權重總和 
  6.     Double originWeightSum = (double) 0; 
  7.      
  8.     // 所有健康權重求和 
  9.     for (Pair<T> item : itemsWithWeight) { 
  10.          
  11.         double weight = item.weight(); 
  12.         //ignore item which weight is zero.see test_randomWithWeight_weight0 in ChooserTest 
  13.         // 權重小于等于0則不參與計算 
  14.         if (weight <= 0) { 
  15.             continue
  16.         } 
  17.         // 有效實例放入列表 
  18.         items.add(item.item()); 
  19.         // 如果值無限大 
  20.         if (Double.isInfinite(weight)) { 
  21.             weight = 10000.0D; 
  22.         } 
  23.         // 如果值為非數字 
  24.         if (Double.isNaN(weight)) { 
  25.             weight = 1.0D; 
  26.         } 
  27.         // 權重值累加 
  28.         originWeightSum += weight; 
  29.     } 
  30.      
  31.     double[] exactWeights = new double[items.size()]; 
  32.     int index = 0; 
  33.     // 計算每個節點權重占比,放入數組 
  34.     for (Pair<T> item : itemsWithWeight) { 
  35.         double singleWeight = item.weight(); 
  36.         //ignore item which weight is zero.see test_randomWithWeight_weight0 in ChooserTest 
  37.         if (singleWeight <= 0) { 
  38.             continue
  39.         } 
  40.         // 計算每個節點權重占比 
  41.         exactWeights[index++] = singleWeight / originWeightSum; 
  42.     } 
  43.      
  44.     // 初始化遞增數組 
  45.     weights = new double[items.size()]; 
  46.     double randomRange = 0D; 
  47.     for (int i = 0; i < index; i++) { 
  48.         // 遞增數組第i項值為items前i個值總和 
  49.         weights[i] = randomRange + exactWeights[i]; 
  50.         randomRange += exactWeights[i]; 
  51.     } 
  52.      
  53.     double doublePrecisionDelta = 0.0001; 
  54.     // index遍歷完則返回; 
  55.     // 或weights最后一位值與1相比,誤差小于0.0001,則返回 
  56.     if (index == 0 || (Math.abs(weights[index - 1] - 1) < doublePrecisionDelta)) { 
  57.         return
  58.     } 
  59.     throw new IllegalStateException( 
  60.             "Cumulative Weight calculate wrong , the sum of probabilities does not equals 1."); 

可結合上面代碼中的注釋來理解,核心步驟包括以下:

  • 遍歷itemsWithWeight,計算權重總和數據;非健康節點會被剔除掉;
  • 計算每個節點的權重值在總權重值中的占比,并存儲在exactWeights數組當中;
  • 將exactWeights數組當中值進行數據重構,形成一個遞增數組weights(每個值都是exactWeights坐標值的總和),后面用于隨機算法;
  • 判斷是否循環完成或誤差在指定范圍內(0.0001),符合則返回。

所有數據準備完成,調用隨機算法方法randomWithWeight:

  1. public T randomWithWeight() { 
  2.     Ref<T> ref = this.ref; 
  3.     // 生成0-1之間的隨機數 
  4.     double random = ThreadLocalRandom.current().nextDouble(0, 1); 
  5.     // 采用二分法查找數組中指定值,如果不存在則返回(-(插入點) - 1),插入點即隨機數將要插入數組的位置,即第一個大于此鍵的元素索引。 
  6.     int index = Arrays.binarySearch(ref.weights, random); 
  7.     // 如果沒有查詢到(返回-1或"-插入點") 
  8.     if (index < 0) { 
  9.         index = -index - 1; 
  10.     } else { 
  11.         // 命中直接返回結果 
  12.         return ref.items.get(index); 
  13.     } 
  14.      
  15.     // 判斷坐標未越界 
  16.     if (index < ref.weights.length) { 
  17.         // 隨機數小于指定坐標的數值,則返回坐標值 
  18.         if (random < ref.weights[index]) { 
  19.             return ref.items.get(index); 
  20.         } 
  21.     } 
  22.      
  23.     // 此種情況不應該發生,但如果發生則返回最后一個位置的值 
  24.     /* This should never happen, but it ensures we will return a correct 
  25.      * object in case there is some floating point inequality problem 
  26.      * wrt the cumulative probabilities. */ 
  27.     return ref.items.get(ref.items.size() - 1); 

該方法的基本操作如下:

  • 生成一個0-1的隨機數;
  • 使用Arrays#binarySearch在數組中進行查找,也就是二分查找法。該方法會返回包含key的值,如果沒有則會返回”-1“或”-插入點“,插入點即隨機數將要插入數組的位置,即第一個大于此鍵的元素索引。
  • 如果命中則直接返回;如果未命中則對返回值取反減1,獲得index值;
  • 判斷index值,符合條件,則返回結果;

至此,關于Nacos客戶端實例獲取的負載均衡算法代碼層面追蹤完畢。

算法實例演示

下面用一個實例來演示一下,該算法中涉及的數據變化。為了數據美觀,這里采用4組數據,每組數據進來確保能被整除;

節點及權重數據(前面節點,后面權重)如下:

  1. 1 100 
  2. 2 25 
  3. 3 75 
  4. 4 200 

第一步,計算權重綜合:

  1. originWeightSum = 100 + 25 + 75 + 200 = 400 

第二步,計算每個節點權重比:

  1. exactWeights = {0.25, 0.0625, 0.1875, 0.5} 

第三步,計算遞增數組weights:

  1. weights = {0.25, 0.3125, 0.5, 1} 

第四步,生成0-1的隨機數:

  1. random = 0.3049980013493817 

第五步,調用Arrays#binarySearch從weights中搜索random:

  1. index = -2 

關于Arrays#binarySearch(double[] a, double key)方法這里再解釋一下,如果傳入的key恰好在數組中,比如1,則返回的index為3;如果key為上面的random值,則先找到插入點,取反,減一。

插入點即第一個大于此key的元素索引,那么上面第一個大于0.3049980013493817的值為0.3125,那么插入點值為1;

于是按照公式計算Arrays#binarySearch返回的index為:

  1. index = - ( 1 ) - 1 = -2 

第六步,也就是沒有恰好命中的情況:

  1. index = -( -2 ) - 1 = 1 

然后判斷index是否越界,很明顯 1 < 4,未越界,則返回坐標為1的值。

算法的核心

上面演示了算法,但這個算法真的能夠做到按權重負載嗎?我們來分析一下這個問題。

這個問題的重點不在random值,這個值基本上是隨機的,那么怎么保證權重大的節點獲得的機會更多呢?

這里先把遞增數組weights用另外一個形式來表示:

上面的算法可以看出,weights與exactWeights為size相同的數組,對于同一坐標(index),weights的值是exactWeights包含當前坐標及前面所有坐標值的和。

如果把weights理解成一條線,對應節點的值是線上的一個個點,體現在圖中便是(圖2到圖5)有色(灰色+橘黃色)部分。

而Arrays#binarySearch算法的插入點獲取的是第一個大于key(也就是random)的坐標,也就是說每個節點享有的隨機范圍不同,它們的范圍由當前點和前一個點的區間決定,而這個區間正好是權重比值。

權重比值大的節點,占有的區間就比較多,比如節點1占了1/4,節點4占了1/2。這樣,如果隨機數是均勻分布的,那么占有范圍比較大的節點更容易獲得青睞。也就達到了按照權重獲得被調用的機會了。

小結

本篇文章追蹤Nacos客戶端源碼,分析了從實例列表中獲得其中一個實例的算法,也就是隨機權重負載均衡算法。整體業務邏輯比較簡單,從ServiceInfo中獲得實例列表,一路篩選,選中目標實例,然后根據它們的權重進行二次處理,數據結構封裝,最后基于Arrays#binarySearch提供的二分查找法來獲得對應的實例。

 

而我們需要注意和學習的重點便是權重獲取算法的思想及具體實現,最終達到能夠在實踐中進行運用。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2010-04-21 12:57:33

RAC負載均衡配置

2021-04-30 08:19:32

SpringCloud客戶端負載Ribbo

2023-10-30 11:28:33

Kubernetes負載均衡

2011-08-17 10:10:59

2019-06-19 14:58:38

服務器負載均衡客戶端

2019-09-10 09:58:19

Dubbo負載均衡Hash

2010-12-21 11:03:15

獲取客戶端證書

2021-07-16 06:56:50

Nacos注冊源碼

2011-12-15 11:03:21

JavaNIO

2019-10-29 05:34:34

IPJava服務器

2021-06-22 15:06:13

Redis客戶端 Redis-clie

2023-11-15 13:50:07

服務端IP

2018-12-19 10:31:32

客戶端IP服務器

2025-04-15 10:00:00

Feign負載均衡微服務

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2010-05-10 17:52:30

實現負載均衡

2025-08-28 08:26:47

2013-03-13 10:51:44

瘦客戶端VDI

2010-12-31 14:23:57

Exchange Se

2021-08-06 06:51:14

NacosRibbon服務
點贊
收藏

51CTO技術棧公眾號

国产精品乱战久久久| 污污视频在线| 精品一区二区三区av| 久久艳片www.17c.com| 中文字幕 欧美 日韩| 国产盗摄——sm在线视频| 久久久久久麻豆| 亚洲一区二区三区毛片| 欧美精品二区三区| 91精品一区国产高清在线gif | 九九热视频这里只有精品| 免费的av网站| 四虎国产精品成人免费影视| 亚洲午夜羞羞片| 污视频在线免费观看一区二区三区 | 成人免费观看视频大全| 91在线播放网址| 亚洲xxxx18| 成人午夜精品视频| 亚洲伦理精品| 久久精品亚洲国产| 亚洲女优在线观看| 久久精品66| 91精品久久久久久久99蜜桃| 久久久久久久久久久久久久国产| 国产婷婷视频在线| 国产日韩精品一区二区浪潮av | 麻豆视频在线看| 亚洲一区免费网站| 日韩av在线看免费观看| 精品一区二区三区免费看| 色悠悠久久综合| 六月婷婷激情综合| 成人在线免费看黄| 国产精品视频在线看| 蜜桃欧美视频| 五月婷婷久久久| 粉嫩在线一区二区三区视频| 成人精品久久av网站| 在线观看亚洲黄色| 久久婷婷麻豆| 日本久久精品视频| 国产做受高潮漫动| 精品96久久久久久中文字幕无| 精品国产欧美一区二区三区成人| 精品无码人妻一区二区免费蜜桃| 亚洲欧洲美洲国产香蕉| 日韩风俗一区 二区| wwwxxx色| 精品三级在线观看视频| 亚洲第一男人天堂| 污污内射在线观看一区二区少妇| 福利片一区二区| 亚洲精品在线电影| 老熟妇精品一区二区三区| 成人精品动漫一区二区三区| 精品少妇一区二区三区日产乱码 | 日韩高清dvd| 韩国三级av在线免费观看| 久久综合999| 欧美日韩在线观看一区二区三区 | 91麻豆swag| 免费看国产精品一二区视频| 精品视频二区| 国产精品素人一区二区| 中文字幕精品—区二区日日骚| 在线视频婷婷| 亚洲免费观看高清完整版在线| 中文字幕第50页| 人人澡人人添人人爽一区二区| 一区二区日韩电影| 国产免费黄色av| 成人免费毛片嘿嘿连载视频…| 欧美色大人视频| 精品国产乱码久久久久久1区二区 91网址在线观看精品 | 欧美精品尤物在线观看| 中文字幕不卡av| 日韩激情综合网| 亚洲一级二级| 国产极品jizzhd欧美| 91成人在线免费| 国产91精品入口| 久久一区二区精品| 69久久精品| 一个色综合av| 国产精品wwwww| 亚洲国产精选| 亚洲精品美女在线| 少妇视频在线播放| 国内成人在线| 热久久免费视频精品| 亚洲一级片免费看| 成人在线综合网| 日韩三级电影| 久草在线视频资源| 欧美性大战久久久久久久蜜臀| 性久久久久久久久久久久久久| 精品伊人久久久| 中文字幕日韩在线播放| 久久精品国产av一区二区三区| 嫩草成人www欧美| 91影院在线免费观看视频| 午夜激情小视频| 亚洲三级免费电影| 精品99在线视频| 精品视频一二| 国产亚洲精品久久久| 久草网视频在线观看| 天堂精品中文字幕在线| av一本久道久久波多野结衣| 国产日本在线| 五月激情综合婷婷| 超碰91在线播放| 亚洲精品国产setv| 欧美精品久久久久a| 在线观看黄色网| www亚洲一区| 女人帮男人橹视频播放| 国产成人久久精品一区二区三区| 亚洲欧美激情在线视频| 美女视频黄免费| 精品一区二区在线视频| 日韩福利视频| 欧美成人ⅴideosxxxxx| 亚洲第一中文字幕| 欧美日韩精品在线观看视频| 首页国产欧美日韩丝袜| 久久国产精品免费一区| 免费网站在线观看人| 欧美高清视频在线高清观看mv色露露十八 | 日韩在线视频线视频免费网站| 天海翼一区二区| 国产高清视频一区| 欧美日韩一级在线 | 国产伦精品一区二区三毛| 黄视频在线观看网站| 欧美视频一区二区在线观看| 中文字幕免费视频| 亚洲尤物精选| 欧美18视频| 天天综合av| 日韩电影大片中文字幕| 精品在线播放视频| 91丨porny丨国产| 日本精品一区在线观看| 老司机精品视频在线播放| 久久久人成影片一区二区三区| 精品欧美一区二区精品少妇| 亚洲欧美日韩国产手机在线| 国产精品嫩草影院8vv8| 欧美黄色大片在线观看| 国产精选久久久久久| 在线免费黄色| 91精品婷婷国产综合久久性色| 亚洲一区电影在线观看| 国内精品视频一区二区三区八戒| 影音先锋在线亚洲| 免费观看在线一区二区三区| 欧美国产日韩一区二区在线观看| 亚洲乱熟女一区二区| 亚洲午夜电影在线观看| 亚洲人人夜夜澡人人爽| 久久精品综合| 先锋影音日韩| 国产美女视频一区二区| 欧美激情第99页| 天天综合在线视频| 日本韩国精品一区二区在线观看| 免费视频91蜜桃| 国内不卡的二区三区中文字幕| 永久免费看av| 欧美综合自拍| 国产精品日本精品| 天堂av中文在线| 亚洲国产精品va在线看黑人 | 亚洲精品电影院| 国产激情91久久精品导航 | 色综合咪咪久久| 妖精视频在线观看免费| 国产在线一区观看| 成人免费性视频| 国产欧美日韩在线观看视频| 成人激情av在线| 草草在线视频| 色多多国产成人永久免费网站 | 国产精品视频在线观看免费| 亚洲午夜久久久久久久久久久 | 久久理论电影| 国产91精品入口17c| 最新国产精品自拍| 精品成人久久| 日韩电影免费观看在| 日本99精品| 欧美伊久线香蕉线新在线| 1pondo在线播放免费| 精品少妇一区二区三区在线播放| 不卡av电影在线| 一区二区三区不卡在线观看| 精品人妻少妇嫩草av无码| 久88久久88久久久| 欧美精品99久久| 亚洲国产精品综合久久久| 久久国产精品亚洲va麻豆| 91精品一区| 日本成人黄色片| 美足av综合网| 懂色av懂色av粉嫩av| 欧美福利在线| 欧美第一黄网| 精品伊人久久| 国产精品吹潮在线观看| 羞羞视频在线免费国产| 国产亚洲精品激情久久| 欧美一级视频免费| 欧美久久免费观看| 日韩一级在线视频| 亚洲第一成人在线| 欧美日韩人妻精品一区二区三区 | 欧日韩不卡视频| 成人av在线影院| 免费看的av网站| 久久国产精品区| 爆乳熟妇一区二区三区霸乳| 99国产成+人+综合+亚洲欧美| 超碰成人在线免费观看| 欧美一二区在线观看| 看欧美日韩国产| 国产成人在线中文字幕| 亚洲自拍小视频免费观看| 精品国产美女a久久9999| 国产suv精品一区二区| 九色porny自拍视频在线播放| 久久91亚洲精品中文字幕奶水| 免费在线看黄色| 日韩视频精品在线| 在线免费看黄| 俺去了亚洲欧美日韩| 91精彩视频在线观看| 国产亚洲成av人片在线观看桃| 免费在线黄色网址| 亚洲毛片一区二区| 你懂的在线观看视频网站| 精品一区二区三区四区| 色中色在线视频| 亚洲欧美精品伊人久久| 免费av在线电影| 国产亚洲a∨片在线观看| 成人一区二区不卡免费| 国产一区二区三区欧美| 成人免费在线电影| 中文字幕一区电影| 免费不卡视频| 九九九久久久久久| av电影免费在线看| 668精品在线视频| 成人爽a毛片免费啪啪| 日韩av免费在线播放| 日韩av超清在线观看| 国产精品嫩草视频| 91成人app| 超碰97在线播放| 欧美一区二区三区久久| 人禽交欧美网站免费| 成人aaaa| 成人免费网站入口| 国产精品亚洲综合久久| 亚洲视频在线a| 黄色日韩网站视频| 亚洲综合中文网| 99天天综合性| 成年人在线免费看片| 日韩码欧中文字| 国产精品99精品无码视| 日韩欧美亚洲综合| 中文字字幕在线观看| 日韩一卡二卡三卡国产欧美| 三级小视频在线观看| 亚洲天堂第二页| www.在线视频| 欧美亚洲另类制服自拍| 国产一区一一区高清不卡| 91久久中文字幕| 青青草这里只有精品| 视频一区二区在线| 欧美精品一区二区三区久久久竹菊| 日韩一级性生活片| 日韩av电影一区| 日本泡妞xxxx免费视频软件| 久久亚洲欧美国产精品乐播| 色欲AV无码精品一区二区久久| 亚洲天堂免费在线观看视频| 日本少妇在线观看| 欧美日韩成人激情| 色一情一乱一区二区三区| 这里只有精品视频| 久草成色在线| 国产一区二区丝袜| 亚洲国产精品嫩草影院久久av| 日本精品免费视频| 久久综合图片| 88av在线播放| 最新国产精品久久精品| 99久久精品国产亚洲| 91精品国产日韩91久久久久久| 欧洲一级在线观看| 欧美激情精品久久久久久黑人| 三级成人在线| 国产精品制服诱惑| 91av精品| 中文字幕网av| 国产亚洲欧洲一区高清在线观看| 国产在线视频在线观看| 欧美精品久久99久久在免费线 | 日韩精选在线| 国产精品视频网站在线观看| 久久电影网站中文字幕| 国产免费看av| 激情久久av一区av二区av三区| 国产欧美久久久| 日韩在线激情视频| 国产极品久久久久久久久波多结野 | 91好吊色国产欧美日韩在线| 国产精品一区免费在线观看| 久久午夜精品视频| 在线视频你懂得一区| 亚洲三区在线观看无套内射| 欧美激情精品久久久久久黑人| 久久免费精品| 国产日韩第一页| 久国产精品韩国三级视频| 91香蕉国产视频| 欧美私人免费视频| www.视频在线.com| 卡一卡二国产精品| 一色道久久88加勒比一| 欧美日韩裸体免费视频| 蜜桃视频久久一区免费观看入口| 久久91亚洲精品中文字幕奶水| 国产剧情一区二区在线观看| 日韩视频在线免费播放| 久久电影网电视剧免费观看| 女教师淫辱の教室蜜臀av软件| 欧美无乱码久久久免费午夜一区| 九九在线视频| 国产精品欧美亚洲777777| 青青草91久久久久久久久| 91蝌蚪视频在线观看| 国产欧美日韩另类一区| 中文字幕人妻色偷偷久久| 最新91在线视频| 高清在线一区二区| 久久这里只有精品8| 风间由美性色一区二区三区 | 亚洲毛片播放| 蜜桃传媒一区二区亚洲av| 色婷婷亚洲综合| 92国产在线视频| 国产在线视频2019最新视频| 天天综合网91| 日本成人在线免费| 香蕉av福利精品导航| 男女污污视频在线观看| 国产精品免费一区豆花| 91精品啪在线观看国产18| 91传媒理伦片在线观看| 欧美日韩中国免费专区在线看| 欧美美女搞黄| 国产综合香蕉五月婷在线| 欧美在线二区| av网站免费在线播放| 欧美性受xxxx黑人xyx| av理论在线观看| 久久精品人人做人人爽电影| 日本网站在线观看一区二区三区| 在线日韩国产网站| 亚洲成色777777在线观看影院| 欧美xx视频| 欧美少妇一区二区三区| 91毛片在线观看| 一级片视频网站| 亚洲**2019国产| 久久综合av| 国产老熟女伦老熟妇露脸| 欧美日韩国产综合一区二区| 高清电影在线观看免费| 日韩高清专区| 粉嫩av亚洲一区二区图片| 337p粉嫩色噜噜噜大肥臀| 久久伊人精品视频| 久久av超碰| av av在线| 欧美日韩在线不卡| 9999精品成人免费毛片在线看| 欧美成ee人免费视频| 精品中文字幕一区二区| 黑人一级大毛片| 欧美人交a欧美精品| 精品久久久久久久久久久下田 | 国产精品初高中害羞小美女文| 人妻视频一区二区三区|