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

限流,永遠都不是一件簡單的事!

網絡 通信技術
隨著微服務的流行,服務之間的穩定性變得越發重要,往往我們會花很多經歷在維護服務的穩定性上,限流和熔斷降級是我們最常用的兩個手段。前段時間在群里有些小伙伴對限流的使用些疑問,再加上最近公司大促也做了限流相關的事,所以在這里總結一下寫寫自己對限流的一些看法。

[[354146]]

本文轉載自微信公眾號「 咖啡拿鐵」,作者 咖啡拿鐵。轉載本文請聯系 咖啡拿鐵公眾號。

 背景

隨著微服務的流行,服務之間的穩定性變得越發重要,往往我們會花很多經歷在維護服務的穩定性上,限流和熔斷降級是我們最常用的兩個手段。前段時間在群里有些小伙伴對限流的使用些疑問,再加上最近公司大促也做了限流相關的事,所以在這里總結一下寫寫自己對限流的一些看法。

剛才說了限流是我們保證服務穩定性的手段之一,但是他并不是所有場景的穩定性都能保證,和他名字一樣他只能在大流量或者突發流量的場景下才能發揮出自己的作用。比如我們的系統最高支持100QPS,但是突然有1000QPS請求打了進來,可能這個時候系統就會直接掛掉,導致后面一個請求都處理不了,但是如果我們有限流的手段,無論他有多大的QPS,我們都只處理100QPS的請求,其他請求都直接拒絕掉,雖然有900的QPS的請求我們拒絕掉了,但是我們的系統沒有掛掉,我們系統仍然可以不斷的處理后續的請求,這個是我們所期望的。有同學可能會說,現在都上的云了,服務的動態伸縮應該是特別簡單的吧,如果我們發現流量特別大的時候,自動擴容機器到可以支撐目標QPS那不就不需要限流了嗎?其實有這個想法的同學應該還挺多的,有些同學可能被一些吹牛的文章給唬到了,所以才會這么想,這個想法在特別理想化的時候是可以實現的,但是在現實中其實有下面幾個問題:

  • 擴容是需要時間。擴容簡單來說就是搞一個新的機器,然后重新發布代碼,做java的同學應該是知道發布成功一個代碼的時間一般不是以秒級計算,而是以分鐘級別計算,有時候你擴容完成,說不定流量尖峰都過去了。
  • 擴容到多少是個特別復雜的問題。擴容幾臺機器這個是比較復雜的,需要大量的壓測計算,以及整條鏈路上的一個擴容,如果擴容了你這邊的機器之后,其他團隊的機器沒有擴容可能最后還是有瓶頸這個也是一個問題。

所以單純的擴容是解決不了這個問題的,限流仍然是我們必須掌握的技能!

基本原理

想要掌握好限流,就需要先掌握他的一些基本算法,限流的算法基本上分為三種,計數器,漏斗,令牌桶,其他的一些都是在這些基礎上進行演變而來。

計數器算法

首先我們來說一下計數器算法,這個算法比較簡單粗暴,我們只需要一個累加變量,然后每隔一秒鐘去刷新這個累加變量,然后再判斷這個累加變量是否大于我們的最大QPS。

  1. int curQps = 0; 
  2.     long lastTime = System.currentTimeMillis(); 
  3.     int maxQps = 100; 
  4.     Object lock = new Object(); 
  5.     boolean check(){ 
  6.         synchronized (lock){ 
  7.             long now = System.currentTimeMillis(); 
  8.             if (now - lastTime > 1000){ 
  9.                 lastTime = now; 
  10.                 curQps = 0; 
  11.             } 
  12.             curQps++; 
  13.             if (curQps > maxQps){ 
  14.                 return false
  15.             } 
  16.         } 
  17.         return true
  18.     } 

這個代碼比較簡單,我們定義了當前的qps,以及上一次刷新累加變量的時間,還有我們的最大qps和我們的lock鎖,我們每次檢查的時候,都需要判斷是否需要刷新,如果需要刷新那么需要把時間和qps都進行重置,然后再進行qps的累加判斷。

這個算法因為太簡單了所以帶來的問題也是特別明顯,如果我們最大的qps是100,在0.99秒的時候來了100個請求,然后在1.01秒的時候又來了100個請求,這個是可以通過我們的程序的,但是我們其實在0.03秒之內通過了200個請求,這個肯定不符合我們的預期,因為很有可能這200個請求直接就會將我們機器給打掛。

滑動窗口計數器

為了解決上面的臨界的問題,我們這里可以使用滑動窗口來解決這個問題:

如上圖所示,我們將1s的普通計數器,分成了5個200ms,我們統計的當前qps都需要統計最近的5個窗口的所有qps,再回到剛才的問題,0.99秒和1.01秒其實都在我們的最近5個窗口之內,所以這里不會出現剛才的臨界的突刺問題。

其實換個角度想,我們普通的計數器其實就是窗口數量為1的滑動窗口計數器,只要我們分的窗口越多,我們使用計數器方案的時候統計就會越精確,但是相對來說維護的窗口的成本就會增加,等會我們介紹sentinel的時候會詳細介紹他是怎么實現滑動窗口計數的。

漏斗算法

解決計數器中臨界的突刺問題也可以通過漏斗算法來實現,如下圖所示:

在漏斗算法中我們需要關注漏桶和勻速流出,不論流量有多大都會先到漏桶中,然后以均勻的速度流出。如何在代碼中實現這個勻速呢?比如我們想讓勻速為100q/s,那么我們可以得到每流出一個流量需要消耗10ms,類似一個隊列,每隔10ms從隊列頭部取出流量進行放行,而我們的隊列也就是漏桶,當流量大于隊列的長度的時候,我們就可以拒絕超出的部分。

漏斗算法同樣的也有一定的缺點:無法應對突發流量(和上面的臨界突刺不一樣,不要混淆)。比如一瞬間來了100個請求,在漏桶算法中只能一個一個的過去,當最后一個請求流出的時候時間已經過了一秒了,所以漏斗算法比較適合請求到達比較均勻,需要嚴格控制請求速率的場景。

令牌桶算法

為了解決突發流量情況,我們可以使用令牌桶算法,如下圖所示:

這個圖上需要關注三個階段:

  • 生產令牌:我們在這里同樣的還是假設最大qps是100,那么我們從漏斗的每10ms過一個流量轉化成每10ms生產一個令牌,直到達到最大令牌。
  • 消耗令牌:我們每一個流量都會消耗令牌桶,這里的消耗的規則可以多變,既可以是簡單的每個流量消耗一個令牌,又可以是根據不同的流量數據包大小或者流量類型來進行不同的消耗規則,比如查詢的流量消耗1個令牌,寫入的流量消耗2個令牌。
  • 判斷是否通過:如果令牌桶足夠那么我們就允許流量通過,如果不足夠可以等待或者直接拒絕,這個就可以采用漏斗那種用隊列來控制。

單機限流

上面我們已經介紹了限流的一些基本算法,我們把這些算法應用到我們的分布式服務中又可以分為兩種,一個是單機限流,一個是集群限流。單機限流指的是每臺機器各自做自己的限流,互不影響。我們接下來看看單機限流怎么去實現呢?

guava

guava是谷歌開源的java核心工具庫,里面包括集合,緩存,并發等好用的工具,當然也提供了我們這里所需要的的限流的工具,核心類就是RateLimiter。

  1. //  RateLimiter rateLimiter = RateLimiter.create(100, 500, TimeUnit.MILLISECONDS); 預熱的rateLimit 
  2.     RateLimiter rateLimiter = RateLimiter.create(100); // 簡單的rateLimit 
  3.     boolean limitResult = rateLimiter.tryAcquire(); 

使用方式比較簡單,如上面代碼所示,我們只需要構建一個RateLimiter,然后再調用tryAcquire方法,如果返回為true代表我們此時流量通過,相反則被限流。在guava中RateLimiter也分為兩種,一個是普通的令牌桶算法的實現,還有一個是帶有預熱的RateLimiter,可以讓我們令牌桶的釋放速度逐步增加直到最大,這個帶有預熱的在sentinel也有,這個可以在一些冷系統中比如數據庫連接池沒有完全填滿,還在不斷初始化的場景下使用。

在這里只簡單的介紹一下guava的令牌桶怎么去實現的:

普通的令牌桶創建了一個SmoothBursty的類,這個類也就是我們實現限流的關鍵,具體怎么做限流的在我們的tryAcquire中:

這里分為四步:

  • Step1: 加上一個同步鎖,需要注意一下這里在sentinel中并沒有加鎖這個環節,在guava中是有這個的,后續也會將sentinel的一些問題。
  • Step2: 判斷是否能申請令牌桶,如果桶內沒有足夠的令牌并且等待時間超過我們的timeout,這里我們就不進行申請了。
  • Step3: 申請令牌并獲取等待時間,在我們tryAcquire中的timeout參數就是就是我們的最大等待時間,如果我們只是調用tryAcquire(),不會出現等待,第二步的時候已經快速失敗了。
  • Step4: sleep等待的時間。

扣除令牌的方法具體在reserverEarliestAvailable方法中:

這里雖然看起來過程比較多,但是如果我們只是調用tryAcquire(),就只需要關注兩個紅框:

  • Step1: 根據當前最新時間發放token,在guava中沒有采用使用其他線程異步發放token的方式,把token的更新放在了我們每次調用限流方法中,這個設計可以值得學習一下,很多時候不一定需要異步線程去執行也可以達到我們想要的目的,并且也沒有異步線程的復雜。
  • Step2: 扣除令牌,這里我們已經在canAcquire中校驗過了,令牌一定能扣除成功。

guava的限流目前就提供了這兩種方式的限流,很多中間件或者業務服務都把guava的限流作為自己的工具,但是guava的方式比較局限,動態改變限流,以及更多策略的限流都不支持,所以我們接下來介紹一下sentinel。

sentinel

sentinel是阿里巴巴開源的分布式服務框架的輕量級流量控制框架,承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,他的核心是流量控制但是不局限于流量控制,還支持熔斷降級,監控等等。

使用sentinel的限流稍微比guava復雜很多,下面寫了一個最簡單的代碼:

  1. String KEY = "test"
  2.         // ============== 初始化規則 ========= 
  3.         List<FlowRule> rules = new ArrayList<FlowRule>(); 
  4.         FlowRule rule1 = new FlowRule(); 
  5.         rule1.setResource(KEY); 
  6.         // set limit qps to 20 
  7.         rule1.setCount(20); 
  8.         rule1.setGrade(RuleConstant.FLOW_GRADE_QPS); 
  9.         rule1.setLimitApp("default"); 
  10.         rules.add(rule1); 
  11.         rule1.setControlBehavior(CONTROL_BEHAVIOR_DEFAULT); 
  12.         FlowRuleManager.loadRules(rules); 
  13.         // ================ 限流判定 =========== 
  14.         Entry entry = null
  15.  
  16.         try { 
  17.             entry = SphU.entry(KEY); 
  18.             // do something 
  19.  
  20.         } catch (BlockException e1) { 
  21.             // 限流會拋出BlockException 異常 
  22.         }finally { 
  23.             if (entry != null) { 
  24.                 entry.exit(); 
  25.             } 
  26.         } 
  • Step1:在sentinel中比較強調Resource這個概念,我們所保護的或者說所作用于都是基于Resource來說,所以我們首先需要確定我們的Resource的key,這里我們簡單的設置為test了。
  • Step2:然后我們初始化我們這個Resource的一個限流規則,我們這里選擇的是針對QPS限流并且策略選擇的是默認,這里默認的話就是使用的滑動窗口版的計數器,然后加載到全局的規則管理器里面,整個規則的設置和guava的差別比較大。
  • Step3: 在sentinel第二個比較重要的概念就是Entry,Entry表示一次資源操作,內部會保存當前invocation信息,在finally的時候需要對entry進行退出。我們執行限流判定的時候實際上也就是獲取Entry,SphU.entry也就是我們執行我們上面限流規則的關鍵,這里和guava不一樣如果被限流了,就會拋出BlockException,我們在進行限流的處理。

雖然sentinel的使用整體比guava復雜很多,但是算法的可選比guava的限流也多一點。

基于并發數(線程數)

我們之前介紹的都是基于QPS的,在sentinel中提供了基于并發數的策略,效果類似于信號量隔離,當我們需要讓業務線程池不被慢調用耗盡,我們就可以使用這種模式。

通常來說我們同一個服務提供的http接口都是使用的一個線程池,比如我們使用的tomcat-web服務器那么我們就會有個tomcat的業務線程池,如果在http中有兩個方法A和B,B的速度相對來說比較快,A的速度相對來說比較慢,如果大量的調用A這個方法,由于A的速度太慢,線程得不到釋放,有可能導致線程池被耗盡,另一個方法B就得不到線程。這個場景我們之前有遇到過直接導致整個服務所接收的請求全部被拒絕。有的同學說限制A的QPS不是就可以了嗎,要注意的是QPS是每秒的,如果我們這個A接口的耗時大于1s,那么下一波A來了之后QPS是要重新計算的。

基于這個就提供了基于并發數的限流,我們設置Grade為FLOW_GRADE_THREAD,就可以實現這個限流模式。

基于QPS

基于QPS的限流sentinel也提供了4種策略:

  • 默認策略:設置Behavior為CONTROL_BEHAVIOR_DEFAULT,這個模式是滑動窗口計數器模式。這種方式適用于對系統處理能力確切已知的情況下,比如通過壓測確定了系統的準確水位時。
  • Warm Up:設置為Behavior為CONTROL_BEHAVIOR_WARM_UP,類似之前guava中介紹的warmup。預熱啟動方式。當系統長期處于低水位的情況下,當流量突然增加時,直接把系統拉升到高水位可能瞬間把系統壓垮。這個模式下QPS的曲線圖如下:

  • 勻速排隊:設置Behavior為CONTROL_BEHAVIOR_RATE_LIMITER,這個模式其實就是漏斗算法,優缺點之前也講解過了
  • Warm Up + 勻速排隊:設置Behavior為CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER,之前warm up到高水位之后使用的是滑動窗口的算法限流,這個模式下繼續使用勻速排隊的算法。

基于調用關系

sentinel提供了更為復雜的一種限流,可以基于調用關系去做更為靈活的限流:

  • 根據調用方限流:調用方的限流使用比較復雜,需要調用ContextUtil.enter(resourceName, origin),origin就是我們的調用方標識,然后在我們的rule設置參數的時候,對limitApp進行設置就可以進行對調用方的限流:
    • 設置為default,默認對所有調用方都限流。
    • 設置為{some_origin_name},代表對特定的調用者才限流。
    • 設置為other,會對配置的一個referResource參數代表的調用者除外的進行限流。

關聯流量控制:在sentinel中也支持,兩個有關聯的資源可以互相影響流量控制,比如有兩個接口都使用的是同一個資源,一個接口比較重要,另外一個接口不是那么重要,我們可以設置一個規則當重要的接口大量訪問的時候,就可以對另外一個不重要接口進行限流,防止這個接口突然出現流量影響重要的接口。

sentinel的一些問題

sentinel雖然提供了這么多算法,但是也有一些問題:

  • 首先來說sentinel上手比較難,對比guava的兩行代碼來說,使用sentinel需要了解一些名詞,然后針對這些名詞再來使用,雖然sentinel提供了一些注解來幫助我們簡化使用,但是整體來說還是比guava要復雜。
  • sentinel有一定的運維成本,sentinel的使用往往需要搭建sentinel的server后臺,對比guava的開箱即用來說,有一定的運維成本。
  • sentinel的限流統計有一定的并發問題,在sentinel的源碼中是沒有加鎖的地方的,極端情況下如果qps限制的是10,如果有100個同時過限流的邏輯,這個時候都會通過,而guava不會發生這樣的情況。

這些問題基本上都是和guava的限流來比較的,畢竟sentinel的功能更多,付出的成本相對來說也會更多。

集群限流

之前說的所有限流都是單機限流,但是我們現在都是微服務集群的架構模式,通常一個服務會有多臺機器,比如有一個訂單服務,這個服務有10臺機器,那么我們想做整個集群限流到500QPS,我們應該怎么去做呢?這個很簡單,直接每臺機器都限流50就好了,50*10就是500,但是在現實環境中會出現負載不均衡的情況,在微服務調用的時候負載均衡的算法多種多樣,比如同機房優先,輪訓,隨機等算法,這些算法都有可能導致我們的負載不是特別的均衡,就會導致我們整個集群的QPS可能有沒有500,甚至在400的時候就被限流了,這個是我們真實場景中所遇到過的。既然單機限流有問題,那么我們應該設計一個更加完善的集群限流的方案

Redis

這個方案不依賴限流的框架,我們整個集群使用同一個redis即可,需要自己封裝一下限流的邏輯,這里我們使用最簡單的計數器去設計,我們將我們的系統時間以秒為單位作為key,設置到redis里面(可以設置一定的過期時間用于空間清理),利用redis的int原子加法,每來一個請求都進行+1,然后再判斷當前值是否超過我們限流的最大值。

redis的方案實現起來整體來說比較簡單,但是強依賴我們的系統時間,如果不同機器之間的系統時間有偏差限流就有可能不準確。

sentinel

在sentinel中提供了集群的解決方案,這個對比其他的一些限流框架是比較有特色的。在sentinel中提供了兩種模式:

  • 獨立模式:限流服務作為單獨的server進行部署,如下圖所示,所有的應用都向單獨部署的token-server進行獲取token,這種模式適用于跨服務之間的全局限流,比如下面圖中,A和B都會去token-server去拿,這個場景一般來說比較少,更多的還是服務內集群的限流比較多。
  • 內嵌模式:在內嵌模式下,我們會把server部署到我們應用實例中,我們也可以通過接口轉換我們的server-client身份,當然我們可以自己引入一些zk的一些邏輯設置讓我們的leader去當server,機器掛了也可以自動切換。這種比較適合同一個服務集群之間的限流,靈活性比較好,但是要注意的是大量的token-server的訪問也有可能影響我們自己的機器。

當然sentinel也有一些兜底的策略,如果token-server掛了我們可以退化成我們單機限流的模式,不會影響我們正常的服務。

實戰

我們上面已經介紹了很多限流的工具,但是很多同學對怎么去限流仍然比較迷惑。我們如果對一個場景或者一個資源做限流的話有下面幾個點需要確認一下:

  • 什么地方去做限流
  • 限多少流
  • 怎么去選擇工具

什么地方去做限流

這個問題比較復雜,很多公司以及很多團隊的做法都不相同,在美團的時候搞了一波SOA,那個時候我記得所有的服務所有的接口都需要做限流,叫每個團隊去給接口評估一個合理的QPS上限,這樣做理論上來說是對的,我們每個接口都應該給與一個上限,防止把整體系統拖垮,但是這樣做的成本是非常之高的,所以大部分公司還是選擇性的去做限流。

首先我們需要確定一些核心的接口,比如電商系統中的下單,支付,如果流量過大那么電商系統中的路徑就有問題,比如像對賬這種邊緣的接口(不影響核心路徑),我們可以不設置限流。

其次我們不一定只在接口層才做限流,很多時候我們直接在網關層把限流做了,防止流量進一步滲透到核心系統中。當然前端也能做限流,當前端捕獲到限流的錯誤碼之后,前端可以提示等待信息,這個其實也算是限流的一部分。其實當限流越在下游觸發我們的資源的浪費就越大,因為在下游限流之前上游已經做了很多工作了,如果這時候觸發限流那么之前的工作就會白費,如果涉及到一些回滾的工作還會加大我們的負擔,所以對于限流來說應該是越上層觸發越好。

限多少流

限多少流這個問題大部分的時候可能就是一個歷史經驗值,我們可以通過日常的qps監控圖,然后再在這個接觸上加一點冗余的QPS可能這個就是我們的限流了。但是有一個場景需要注意,那就是大促(這里指的是電商系統里面的場景,其他系統類比流量較高的場景)的時候,我們系統的流量就會突增,再也不是我們日常的QPS了,這種情況下,往往需要我們在大促之前給我們系統進行全鏈路壓測,壓測出一個合理的上限,然后限流就基于這個上限去設置。

怎么去選擇工具

一般來說大一點的互聯網公司都有自己的統一限流的工具這里直接采用就好。對于其他情況的話,如果沒有集群限流或者熔斷這些需求,我個人覺得選擇RateLimter是一個比較不錯的選擇,應該其使用比較簡單,基本沒有學習成本,如果有其他的一些需求我個人覺得選擇sentinel,至于hytrix的話我個人不推薦使用,因為這個已經不再維護了。

總結

限流雖然只有兩個字,但是真正要理解限流,做好限流,是一件非常不容易的事,對于我個人而已,這篇文章也只是一些淺薄的見識,如果大家有什么更好的意見可以關注我的公眾號留言進行討論。 

 

責任編輯:武曉燕 來源: 咖啡拿鐵
相關推薦

2024-12-10 08:34:28

2015-06-12 10:01:25

程序員代碼

2010-09-13 11:04:03

編程

2021-05-17 10:27:42

地址虛擬邏輯

2013-05-30 08:48:30

團隊

2021-05-16 15:49:12

數字化轉型IT技術

2020-11-18 14:13:48

手機iPhone三星

2021-04-29 16:00:54

數字化信息化IT項目

2016-01-22 11:51:36

測試浪費時間

2019-11-14 19:03:51

人工智能設計無人駕駛

2011-10-14 19:58:04

C語言

2015-11-13 11:15:40

SELinuxFedoraLinux

2014-10-29 15:04:05

觸控科技陳昊芝

2025-10-31 10:00:54

2025-10-11 06:05:00

2022-06-08 12:29:24

編程語言JavaPython

2020-04-06 14:09:36

存儲閃存技術

2022-04-28 23:19:58

元宇宙NFT數字資產

2020-01-10 14:56:54

存儲技術容器

2017-08-14 15:34:14

廣州
點贊
收藏

51CTO技術棧公眾號

久久这里有精品视频| 色狠狠色狠狠综合| 国产精品日韩一区二区免费视频| 黄色小视频在线免费看| 亚洲免费观看高清完整版在线观| 色久综合一二码| 中文字幕久久综合| 欧美一区二区三区激情| 久久精品毛片| 欧美猛少妇色xxxxx| 欧美 变态 另类 人妖| 成人在线视频观看| 亚洲成人自拍网| 亚洲电影网站| 后入内射欧美99二区视频| 玖玖精品视频| 欧美激情在线狂野欧美精品| 真实乱视频国产免费观看| 激情不卡一区二区三区视频在线| 天天免费综合色| 超碰97免费观看| 日本一区二区三区在线观看视频| 精品系列免费在线观看| 欧美野外猛男的大粗鳮| 国产精品成人免费观看| 欧美码中文字幕在线| 日韩欧美一区中文| 国产日韩欧美久久| 97成人资源| 亚洲国产精品精华液网站| 椎名由奈jux491在线播放| 午夜成人鲁丝片午夜精品| 国产精品一区专区| 国产美女精品视频| 在线观看黄网站| 国语精品一区| 欧美大片va欧美在线播放| 亚洲黄色网址大全| 亚洲精品播放| 亚洲国产免费av| 国产精品91av| 国产亚洲久久| 在线观看91av| 欧美成人三级在线播放| 成人国产二区| 色综合天天综合狠狠| aa视频在线播放| 日本动漫理论片在线观看网站 | 红桃视频欧美| 精品国产一区二区三区久久久狼 | 亚洲mv大片欧洲mv大片精品| 强开小嫩苞一区二区三区网站| 91.xxx.高清在线| 中文字幕免费一区| 日韩欧美精品在线不卡| 国产人成在线视频| 国产亚洲欧美日韩日本| 欧美综合激情| 中文字幕日本在线| 国产精品少妇自拍| 在线视频91| gogo在线观看| 一区二区三区在线观看动漫| 国产精品国三级国产av| 福利小视频在线| 亚洲超碰97人人做人人爱| 日本a视频在线观看| 国产黄色大片在线观看| 亚洲 欧美综合在线网络| 久久久久久久中文| 国产精品高清乱码在线观看| 欧美影院一区二区| 天堂中文av在线| 看亚洲a级一级毛片| 欧美成人精精品一区二区频| 中文字幕在线视频播放| 四虎884aa成人精品最新| 亚洲欧洲xxxx| 日韩av网站在线播放| 女生裸体视频一区二区三区| 国产69精品久久久久99| 特级做a爱片免费69| 日韩av成人高清| 91夜夜未满十八勿入爽爽影院| 亚洲av无码一区二区三区性色| 成人av网站在线| 日韩精品国内| 怡红院在线观看| 狠狠色香婷婷久久亚洲精品| 91网址在线播放| 国产一区二区三区亚洲综合| 精品国产精品一区二区夜夜嗨 | 中文字幕日韩精品一区| 加勒比海盗1在线观看免费国语版| 不卡的av影片| 欧美性生活影院| 男人女人拔萝卜视频| 色爱av综合网| 萌白酱国产一区二区| 日本三级一区二区| 蜜桃久久av一区| 国产精品yjizz| av影片在线看| 亚洲成a人v欧美综合天堂下载| 校园春色 亚洲色图| www.成人网| 色哟哟亚洲精品一区二区| 精品无码人妻一区二区三区品| 天堂午夜影视日韩欧美一区二区| 91精品综合久久久久久五月天| 五月婷婷丁香网| **性色生活片久久毛片| 国产亚洲天堂网| 亚洲天堂av资源在线观看| 亚洲人成免费电影| 久久久久97国产| 精品综合免费视频观看| 久久精品99| 中国av在线播放| 欧美日韩一级大片网址| 日韩网站在线播放| 精品1区2区3区4区| 91色精品视频在线| 成a人v在线播放| 色欧美片视频在线观看在线视频| 国产精品成人免费一区久久羞羞| 欧美电影《睫毛膏》| 日韩美女视频免费在线观看| 欧美一级特黄aaaaaa大片在线观看| 国产精品不卡在线| 国产精品无码一本二本三本色| 黄色美女久久久| 欧美黄色片在线观看| 国产视频www| 国产精品国产精品国产专区不蜜 | 精品国产亚洲一区二区三区在线 | 亚洲国产精品视频一区| av日韩亚洲| 国产视频欧美视频| 天天爽夜夜爽夜夜爽精品| 成人激情综合网站| 国产毛片久久久久久国产毛片| 精品国产亚洲一区二区三区在线| 久久久999精品视频| 国产精品久久777777换脸| 欧美激情综合网| 在线免费视频a| 精品一区二区三区的国产在线观看| 青草成人免费视频| 黄色电影免费在线看| 日本高清不卡一区| 日韩一区二区a片免费观看| 久久激情久久| 欧美一区观看| 精品三区视频| 日韩中文字幕免费看| 亚洲综合精品在线| 最新欧美精品一区二区三区| 日韩成人精品视频在线观看| 欧美成人milf| 91九色对白| 草美女在线观看| 日韩精品丝袜在线| 麻豆成人免费视频| 中文字幕欧美国产| 激情久久综合网| 精品动漫3d一区二区三区免费版 | 精品一区二区视频在线观看| 一本一道久久综合狠狠老精东影业| 精品国产乱码久久久久| 超碰一区二区| 最近日韩中文字幕中文| 国产精品视频一二区| 亚洲一区二区三区在线看| 一级特级黄色片| 葵司免费一区二区三区四区五区| 亚洲电影网站| aaa国产精品| 青青精品视频播放| 嫩草在线视频| 亚洲福利小视频| 久久亚洲精品石原莉奈| 最新日韩av在线| 捆绑裸体绳奴bdsm亚洲| 男男视频亚洲欧美| 国内少妇毛片视频| sdde在线播放一区二区| 97超级碰碰| 欧美舌奴丨vk视频| 米奇精品一区二区三区在线观看| 亚洲欧美自偷自拍| 欧美区一区二区三区| 久久综合色综合| 国产偷v国产偷v亚洲高清| 天天色天天综合网| 久久精品麻豆| 男人的天堂视频在线| 国产精品午夜一区二区三区| 亚洲精品日韩av| 神马久久资源| 欧美激情在线观看视频| 91电影在线播放| 亚洲国产精品人人爽夜夜爽| 在线视频欧美亚洲| 欧美午夜精品久久久久久浪潮| 人人干在线观看| 久久噜噜亚洲综合| 精品国产免费久久久久久婷婷| 日韩vs国产vs欧美| 国产自产在线视频| 亚洲精品成人影院| 区一区二区三区中文字幕| 超碰一区二区三区| 亚洲va久久久噜噜噜| 亚洲欧美在线成人| 国语自产精品视频在线看| 蜜芽在线免费观看| 亚洲系列中文字幕| 人妻夜夜爽天天爽| 日韩午夜电影在线观看| 中文字幕日本人妻久久久免费| 午夜激情综合网| 久久久久97国产| 亚洲另类一区二区| 天堂网av2018| 国产欧美日韩另类一区| 性欧美成人播放77777| 国产91丝袜在线播放| 国产传媒免费观看| 精品综合免费视频观看| 中文字幕有码av| 日韩中文字幕亚洲一区二区va在线| 日本a在线免费观看| 国产精品www.| 日本福利视频在线观看| 日韩在线综合| 亚洲精品成人a8198a| 精品盗摄女厕tp美女嘘嘘| 欧美极品一区二区| 天美av一区二区三区久久| 国产综合av一区二区三区| 午夜视频在线观看精品中文| 成人妇女淫片aaaa视频| 欧美日韩卡一| 国产日本欧美一区二区三区| 黄页免费欧美| 91精品国产综合久久香蕉的用户体验| 国产综合色在线观看| 国产欧美久久久久久| 国产成+人+综合+亚洲欧美| 国产精品高潮在线| 成人国产一区| 国产精品丝袜白浆摸在线| 日韩av黄色| 91视频免费网站| 亚洲综合影院| 久久精品国产美女| 国产欧美一区| 亚洲成人网上| 中出一区二区| 人人妻人人做人人爽| 国产欧美亚洲一区| 久久国产色av免费观看| 日韩国产精品91| 国产aⅴ爽av久久久久| 国产一区二区不卡老阿姨| 免费国偷自产拍精品视频| 国产不卡在线视频| 亚洲一区二区三区四区av| 99国产一区二区三精品乱码| 亚洲av成人无码一二三在线观看| 久久久久久久网| 五月婷婷六月香| 亚洲欧美日韩一区二区三区在线观看| 欧美三级日本三级| 欧美日韩性视频| 中文字字幕在线中文乱码| 日韩视频中午一区| 五月婷婷免费视频| 日韩一区二区三区国产| 手机在线免费av| 欧美在线视频a| 亚洲综合资源| 黄色小网站91| 久久高清免费| 久无码久无码av无码| 国产麻豆综合| 欧美成人手机在线视频| 成人白浆超碰人人人人| 无码人妻aⅴ一区二区三区69岛| 中文字幕亚洲一区二区av在线| 婷婷色中文字幕| 色综合久久中文字幕| 国产偷拍一区二区| 日韩精品一区二区三区第95| 黄色片网站在线观看| 韩国欧美亚洲国产| 视频91a欧美| 久久久水蜜桃| 欧美激情日韩| 日本a√在线观看| 国产成人av一区二区| 毛片aaaaaa| 婷婷综合久久一区二区三区| 中文字幕在线观看视频一区| 亚洲国产高清高潮精品美女| 拍真实国产伦偷精品| 97在线视频国产| 国产在线不卡一区二区三区| 秋霞在线观看一区二区三区| 1000部精品久久久久久久久| 色婷婷.com| 国产午夜亚洲精品午夜鲁丝片| 精品处破女学生| 911精品产国品一二三产区| 欧美伦理影视网| 午夜精品一区二区三区在线| 久久伊人影院| 中文字幕精品一区日韩| 奇米一区二区三区| 超碰97人人干| 疯狂欧美牲乱大交777| 亚洲精品国产精品国| 精品国产一区av| 国产精品传媒麻豆hd| 日韩精品欧美专区| 亚洲欧美久久久| 李丽珍裸体午夜理伦片| 亚洲夂夂婷婷色拍ww47| 国产喷水吹潮视频www| 中文字幕一区日韩电影| 韩国久久久久久| 久久av免费一区| 国产欧美三级| 男生裸体视频网站| 黄色成人在线播放| 天天操天天舔天天干| 欧美日本国产在线| 国产精品777777在线播放| 中文字幕在线观看一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 成人在线手机视频| 欧美综合欧美视频| 四虎久久免费| 91精品免费看| 一区二区三区在线| 中文字幕在线观看视频www| 亚洲免费看黄网站| 亚洲av色香蕉一区二区三区| 欧美肥婆姓交大片| 亚洲国产视频二区| 国产精品69久久久| 99久久精品国产精品久久| 日韩污视频在线观看| 日韩精品www| 超级碰碰久久| 亚洲一卡二卡区| 国产一区二区三区不卡在线观看| 懂色av懂色av粉嫩av| 精品国产乱码久久久久久久| 97人澡人人添人人爽欧美| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 亚洲春色在线| 国产在线一区观看| 国产一级做a爱免费视频| 日韩福利视频在线观看| 成人mm视频在线观看| 中文字幕欧美人与畜| 高清成人免费视频| 中日韩黄色大片| 中文字幕国产亚洲| 国产精品一区二区精品视频观看| 8x8ⅹ国产精品一区二区二区| 成人国产精品免费网站| 中文字幕亚洲乱码熟女1区2区| 一色桃子一区二区| 国产精品一区二区精品| a√天堂在线观看| 国产欧美精品国产国产专区| 国产精品女人久久久| 久久久久久久久久久91| 国产欧美日韩免费观看| www.午夜av| 欧美日韩在线影院| 里番在线观看网站| 好看的日韩精品视频在线| 日本视频一区二区| 免费一级片在线观看| 亚洲天堂免费视频| 日韩精品一区国产| 欧美少妇性生活视频| 亚洲美女免费在线| 麻豆影视在线| 成人xxxxx色| 男女男精品视频| 亚洲视频免费播放| 日韩在线观看成人| 天天做夜夜做人人爱精品 | 久久91精品国产91久久跳| 亚洲午夜久久|