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

用Go語言做了一個分布式限流器, 看看實現(xiàn)的方法與步驟

開發(fā) 前端
golang 的官方庫里提供了一個 ratelimiter,就是采用令牌桶的算法。所以這里并沒有重復(fù)造輪子,直接代理了 ratelimiter。
項目中需要對 api 的接口進(jìn)行限流,但是麻煩的是,api 可能有多個節(jié)點,傳統(tǒng)的本地限流無法處理這個問題。限流的算法有很多,比如計數(shù)器法,漏斗法,令牌桶法,等等。各有利弊,相關(guān)博文網(wǎng)上很多,這里不再贅述。

項目的要求主要有以下幾點:

  • 支持本地/分布式限流,接口統(tǒng)一
  • 支持多種限流算法的切換
  • 方便配置,配置方式不確定

go 語言不是很支持 OOP,我在實現(xiàn)的時候是按 Java 的思路走的,所以看起來有點不倫不類,希望能拋磚引玉。

1. 接口定義

package ratelimit

import "time"

// 限流器接口
type Limiter interface {
    Acquire() error
    TryAcquire() bool
}

// 限流定義接口
type Limit interface {
    Name() string
    Key() string
    Period() time.Duration
    Count() int32
    LimitType() LimitType
}

// 支持 burst
type BurstLimit interface {
    Limit
    BurstCount() int32
}

// 分布式定義的 burst
type DistLimit interface {
    Limit
    ClusterNum() int32
}

type LimitType int32
const (
    CUSTOM LimitType = iota
    IP
)

Limiter 接口參考了 Google 的 guava 包里的 Limiter 實現(xiàn)。Acquire 接口是阻塞接口,其實還需要加上 context 來保證調(diào)用鏈安全,因為實際項目中并沒有用到 Acquire 接口,所以沒有實現(xiàn)完善;同理,超時時間的支持也可以通過添加新接口繼承自 Limiter 接口來實現(xiàn)。TryAcquire 會立即返回。

Limit 抽象了一個限流定義,Key() 方法返回這個 Limit 的唯一標(biāo)識,Name() 僅作輔助,Period() 表示周期,單位是秒,Count() 表示周期內(nèi)的最大次數(shù),LimitType()表示根據(jù)什么來做區(qū)分,如 IP,默認(rèn)是 CUSTOM.

BurstLimit 提供突發(fā)的能力,一般是配合令牌桶算法。DistLimit 新增 ClusterNum() 方法,因為 mentor 要求分布式遇到錯誤的時候,需要退化為單機(jī)版本,退化的策略即是:2 節(jié)點總共 100QPS,如果出現(xiàn)分區(qū),每個節(jié)點需要調(diào)整為各 50QPS

2. LocalCounterLimiter

package ratelimit

import (
    "errors"
    "fmt"
    "math"
    "sync"
    "sync/atomic"
    "time"
)

// todo timer 需要 stop
type localCounterLimiter struct {
    limit Limit

    limitCount int32 // 內(nèi)部使用,對 limit.count 做了 <0 時的轉(zhuǎn)換

    ticker *time.Ticker
    quit chan bool

    lock sync.Mutex
    newTerm *sync.Cond
    count int32
}

func (lim *localCounterLimiter) init() {
    lim.newTerm = sync.NewCond(&lim.lock)
    lim.limitCount = lim.limit.Count()

    if lim.limitCount < 0 {
        lim.limitCount = math.MaxInt32 // count 永遠(yuǎn)不會大于 limitCount,后面的寫法保證溢出也沒問題
    } else if lim.limitCount == 0  {
        // 禁止訪問, 會無限阻塞
    } else {
        lim.ticker = time.NewTicker(lim.limit.Period())
        lim.quit = make(chan bool, 1)

        go func() {
            for {
                select {
                case <- lim.ticker.C:
                    fmt.Println("ticker .")
                    atomic.StoreInt32(&lim.count, 0)
                    lim.newTerm.Broadcast()

                    //lim.newTerm.L.Unlock()
                case <- lim.quit:
                    fmt.Println("work well .")
                    lim.ticker.Stop()
                    return
                }
            }
        }()
    }
}

// todo 需要機(jī)制來防止無限阻塞, 不超時也應(yīng)該有個極限時間
func (lim *localCounterLimiter) Acquire() error {
    if lim.limitCount == 0 {
        return errors.New("rate limit is 0, infinity wait")
    }

    lim.newTerm.L.Lock()
    for lim.count >= lim.limitCount {
        // block instead of spinning
        lim.newTerm.Wait()
        //fmt.Println(count, lim.limitCount)
    }
    lim.count++
    lim.newTerm.L.Unlock()

    return nil
}

func (lim *localCounterLimiter) TryAcquire() bool {
    count := atomic.AddInt32(&lim.count, 1)
    if count > lim.limitCount {
        return false
    } else {
        return true
    }
}

代碼很簡單,就不多說了

3. LocalTokenBucketLimitergolang 的官方庫里提供了一個 ratelimiter,就是采用令牌桶的算法。所以這里并沒有重復(fù)造輪子,直接代理了 ratelimiter。

package ratelimit

import (
    "context"
    "golang.org/x/time/rate"
    "math"
)

type localTokenBucketLimiter struct {
    limit Limit

    limiter *rate.Limiter // 直接復(fù)用令牌桶的
}

func (lim *localTokenBucketLimiter) init() {
    burstCount := lim.limit.Count()
    if burstLimit, ok := lim.limit.(BurstLimit); ok {
        burstCount = burstLimit.BurstCount()
    }

    count := lim.limit.Count()
    if count < 0 {
        count = math.MaxInt32
    }

    f := float64(count) / lim.limit.Period().Seconds()
    if f < 0 {
        f = float64(rate.Inf) // 無限
    } else if f == 0 {
        panic("為 0 的時候,底層實現(xiàn)有問題")
    }

    lim.limiter = rate.NewLimiter(rate.Limit(f), int(burstCount))
}

func (lim *localTokenBucketLimiter) Acquire() error {
    err := lim.limiter.Wait(context.TODO())
    return err
}

func (lim *localTokenBucketLimiter) TryAcquire() bool {
    return lim.limiter.Allow()
}

4. RedisCounterLimiter

package ratelimit

import (
    "math"
    "sync"
    "xg-go/log"
    "xg-go/xg/common"
)

type redisCounterLimiter struct {
    limit      DistLimit
    limitCount int32 // 內(nèi)部使用,對 limit.count 做了 <0 時的轉(zhuǎn)換

    redisClient *common.RedisClient

    once sync.Once // 退化為本地計數(shù)器的時候使用
    localLim Limiter

    //script string
}

func (lim *redisCounterLimiter) init() {
    lim.limitCount = lim.limit.Count()
    if lim.limitCount < 0 {
        lim.limitCount = math.MaxInt32
    }

    //lim.script = buildScript()
}

//func buildScript() string {
//  sb := strings.Builder{}
//
//  sb.WriteString("local c")
//  sb.WriteString("\nc = redis.call('get',KEYS[1])")
//  // 調(diào)用不超過最大值,則直接返回
//  sb.WriteString("\nif c and tonumber(c) > tonumber(ARGV[1]) then")
//  sb.WriteString("\nreturn c;")
//  sb.WriteString("\nend")
//  // 執(zhí)行計算器自加
//  sb.WriteString("\nc = redis.call('incr',KEYS[1])")
//  sb.WriteString("\nif tonumber(c) == 1 then")
//  sb.WriteString("\nredis.call('expire',KEYS[1],ARGV[2])")
//  sb.WriteString("\nend")
//  sb.WriteString("\nif tonumber(c) == 1 then")
//  sb.WriteString("\nreturn c;")
//
//  return sb.String()
//}

func (lim *redisCounterLimiter) Acquire() error {
    panic("implement me")
}

func (lim *redisCounterLimiter) TryAcquire() (success bool) {
    defer func() {
        // 一般是 redis 連接斷了,會觸發(fā)空指針
        if err := recover(); err != nil {
            //log.Errorw("TryAcquire err", common.ERR, err)
            //success = lim.degradeTryAcquire()
            //return
            success = true
        }

        // 沒有錯誤,判斷是否開啟了 local 如果開啟了,把它停掉
        //if lim.localLim != nil {
        //  // stop 線程安全
        //  lim.localLim.Stop()
        //}
    }()

    count, err := lim.redisClient.IncrBy(lim.limit.Key(), 1)
    //panic("模擬 redis 出錯")
    if err != nil {
        log.Errorw("TryAcquire err", common.ERR, err)
        panic(err)
    }

    // *2 是為了保留久一點,便于觀察
    err = lim.redisClient.Expire(lim.limit.Key(), int(2 * lim.limit.Period().Seconds()))
    if err != nil {
        log.Errorw("TryAcquire error", common.ERR, err)
        panic(err)
    }

    // 業(yè)務(wù)正確的情況下 確認(rèn)超限
    if int32(count) > lim.limitCount {
        return false
    }

    return true

    //keys := []string{lim.limit.Key()}
    //
    //log.Errorw("TryAcquire ", keys, lim.limit.Count(), lim.limit.Period().Seconds())
    //count, err := lim.redisClient.Eval(lim.script, keys, lim.limit.Count(), lim.limit.Period().Seconds())
    //if err != nil {
    //  log.Errorw("TryAcquire error", common.ERR, err)
    //  return false
    //}
    //
    //
    //typeName := reflect.TypeOf(count).Name()
    //log.Errorw(typeName)
    //
    //if count != nil && count.(int32) <= lim.limitCount {
    //
    //  return true
    //}
    //return false
}

func (lim *redisCounterLimiter) Stop() {
    // 判斷是否開啟了 local 如果開啟了,把它停掉
    if lim.localLim != nil {
        // stop 線程安全
        lim.localLim.Stop()
    }
}

func (lim *redisCounterLimiter) degradeTryAcquire() bool {
    lim.once.Do(func() {
        count := lim.limit.Count() / lim.limit.ClusterNum()
        limit := LocalLimit {
            name: lim.limit.Name(),
            key: lim.limit.Key(),
            count: count,
            period: lim.limit.Period(),
            limitType: lim.limit.LimitType(),
        }

        lim.localLim = NewLimiter(&limit)
    })

    return lim.localLim.TryAcquire()
}

代碼里回退的部分注釋了,因為線上為了穩(wěn)定,實習(xí)生的代碼畢竟,所以先不跑。

本來原有的思路是直接用 lua 腳本在 redis上保證原子操作,但是底層封裝的庫對于直接調(diào) eval 跑的時候,會拋錯,而且 source 是 go-redis 里面,趕 ddl 沒有時間去 debug,所以只能用 incrBy + expire 分開來。

5. RedisTokenBucketLimiter令牌桶的狀態(tài)變量得放在一個 線程安全/一致 的地方,redis 是不二人選。但是令牌桶的算法核心是個延遲計算得到令牌數(shù)量,這個是一個很長的臨界區(qū),所以要么用分布式鎖,要么直接利用 redis 的單線程以原子方式跑。一般業(yè)界是后者,即 lua 腳本維護(hù)令牌桶的狀態(tài)變量、計算令牌。代碼類似這種

local tokens_key = KEYS[1]
local timestamp_key = KEYS[2]
--redis.log(redis.LOG_WARNING, "tokens_key " .. tokens_key)

local rate = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])
local intval = tonumber(ARGV[5])

local fill_time = capacity/rate
local ttl = math.floor(fill_time*2) * intval

local last_tokens = tonumber(redis.call("get", tokens_key))
if last_tokens == nil then
  last_tokens = capacity
end

local last_refreshed = tonumber(redis.call("get", timestamp_key))
if last_refreshed == nil then
  last_refreshed = 0
end

local delta = math.max(0, now-last_refreshed)
local filled_tokens = math.min(capacity, last_tokens+(delta*rate))
local allowed = filled_tokens >= requested
local new_tokens = filled_tokens
if allowed then
  new_tokens = filled_tokens - requested
end

redis.call("setex", tokens_key, ttl, new_tokens)
redis.call("setex", timestamp_key, ttl, now)

return { allowed, new_tokens }

責(zé)任編輯:武曉燕 來源: Go語言圈
相關(guān)推薦

2020-07-30 09:35:09

Redis分布式鎖數(shù)據(jù)庫

2021-12-09 10:45:19

分布式事務(wù)框架

2022-01-12 12:46:32

Go限流保障

2024-04-08 11:04:03

2025-05-23 08:10:00

Go分布式任務(wù)系統(tǒng)語言

2022-04-14 07:56:30

公平鎖Java線程

2021-09-14 13:55:15

Go開發(fā)分布式

2023-09-04 08:45:07

分布式配置中心Zookeeper

2024-04-17 08:42:15

Go語言分布式鎖

2022-12-21 08:40:05

限流器分布式限流

2019-12-27 16:00:56

分布式事務(wù)框架Java

2024-07-15 08:25:07

2021-11-01 12:25:56

Redis分布式

2021-12-15 10:00:21

分布式事務(wù)框架

2025-08-25 06:35:00

分布式鎖Go后端

2024-05-08 10:20:00

Redis分布式

2021-09-07 09:26:13

Python 開發(fā)編程語言

2022-06-27 08:36:27

分布式事務(wù)XA規(guī)范

2022-08-01 08:01:04

ID發(fā)號器系統(tǒng)

2023-07-11 10:24:00

分布式限流算法
點贊
收藏

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

欧美精品黄色| 欧美成人xxxx| 日本一区二区三区四区| 国产精品自拍视频| 欧美日韩在线视频免费播放| 国产精品zjzjzj在线观看| 日韩欧美在线观看| 婷婷视频在线播放| 无码国产色欲xxxx视频| 久久精品国产亚洲一区二区三区| 欧美激情亚洲一区| 成人激情五月天| youjizz欧美| 欧美揉bbbbb揉bbbbb| 激情成人开心网| 麻豆av电影在线观看| 国产剧情在线观看一区二区| 国产成人精品一区二区| 九九热精彩视频| 精品理论电影在线| 亚洲精品国产综合区久久久久久久| 538任你躁在线精品免费| 538视频在线| 亚洲欧洲99久久| 欧美乱偷一区二区三区在线| 亚洲成人av综合| 精品一区二区三区免费毛片爱| 欧美性受xxxx白人性爽| 国产97免费视频| 欧美日一区二区| 久久久人成影片免费观看| 午夜私人影院久久久久| 中文字幕av日韩精品| 婷婷国产在线| 成人手机电影网| 91最新在线免费观看| 亚洲视频一区在线播放| 日韩制服丝袜先锋影音| 97久久久免费福利网址| 国产精品久久久久久久精| 欧美一区三区| 国产一区二区三区在线播放免费观看 | 一区二区三区av电影| 亚洲人成网站在线播放2019| 国产香蕉视频在线看| 91美女视频网站| 国产免费一区二区三区| 国模无码一区二区三区| 国产很黄免费观看久久| 91偷拍精品一区二区三区| 97视频免费在线| 蜜桃av一区二区在线观看| 国产精品白嫩美女在线观看| 蜜臀精品一区二区三区| 亚洲欧美高清| 国产成+人+综合+亚洲欧洲| www.色国产| 久久午夜激情| 国产精品久久久久999| 极品国产91在线网站| 日本午夜一本久久久综合| 国产成人精品久久久| 午夜久久久久久久久久影院| 天堂蜜桃一区二区三区| 国产成人综合久久| 怡红院男人天堂| 精品一区二区在线播放| 亚洲自拍偷拍色片视频| 欧美 日韩 国产 成人 在线 91| 国产不卡一区视频| 精品蜜桃传媒| 高清毛片在线看| 亚洲欧洲国产日本综合| 欧美极品少妇无套实战| а√在线中文网新版地址在线| 岛国av一区二区在线在线观看| 日韩精品一区二区三区久久| 成人福利片在线| 日韩亚洲欧美在线| 国产老熟女伦老熟妇露脸| 国产精品中文字幕亚洲欧美| 日韩在线免费视频| 久久久www成人免费毛片| 亚洲作爱视频| 国产精品一区=区| 国产情侣一区二区| 99re8在线精品视频免费播放| 日韩精品不卡| 尤物在线网址| 色老头久久综合| 在线看免费毛片| 国产精品极品国产中出| 在线看日韩欧美| 老女人性淫交视频| 新67194成人永久网站| 国产精品视频26uuu| 亚洲黄色在线播放| 国产拍揄自揄精品视频麻豆| 麻豆传媒网站在线观看| 成人亚洲欧美| 欧美一区二区三区人| 熟妇高潮精品一区二区三区| 水蜜桃久久夜色精品一区| 97在线免费视频| 一级黄色片在线播放| 99久久久无码国产精品| 一区二区三区四区五区精品| 免费v片在线观看| 正在播放一区二区| 亚洲欧洲久久久| 狠狠干综合网| 成人在线视频网| 免费a在线观看| 亚洲国产中文字幕在线视频综合| 成人性生生活性生交12| 红杏aⅴ成人免费视频| xxav国产精品美女主播| 亚洲s码欧洲m码国产av| 高清shemale亚洲人妖| 亚洲精品在线观看免费| 在线天堂资源www在线污| 欧美mv日韩mv亚洲| 91久久国产综合| 日本三级亚洲精品| 欧美日韩综合久久| 韩国成人二区| 亚洲成人av中文字幕| 日韩欧美综合视频| 欧美xxx在线观看| 国产精品视频一区二区三区综合 | 特黄特色欧美大片| av有声小说一区二区三区| 午夜免费视频在线国产| 丰满人妻一区二区三区免费视频| 亚洲黄色免费观看| 影音先锋男人看片资源| 精品人伦一区二区三电影 | 国产精品高潮呻吟久久av无限 | 国产很黄免费观看久久| 综合久久国产| 日韩欧美激情| 深夜福利一区二区| 伊人网免费视频| 国产精品日韩成人| 亚洲综合欧美激情| 欧洲视频一区| 国产精品视频1区| 色影院视频在线| 欧美日韩在线观看一区二区| 我不卡一区二区| 久久国产精品99国产| 久久久久久久久久久久久久一区| av在线中出| 日韩av最新在线观看| 日韩一区二区视频在线| 91免费精品国自产拍在线不卡| 无码人妻丰满熟妇区96| 国产精品久久久久久久久久白浆| 久久久综合免费视频| 人妻91麻豆一区二区三区| 亚洲成人黄色影院| 色噜噜在线观看| 丝袜a∨在线一区二区三区不卡| 欧美日韩亚洲综合一区二区三区激情在线| 惠美惠精品网| 中文字幕亚洲激情| 中文字幕在线观看精品| 成人免费在线视频观看| 337p日本欧洲亚洲大胆张筱雨| 亚洲高清毛片| 欧美日韩另类丝袜其他| 台湾天天综合人成在线| 久久国产精品电影| 污视频网站在线播放| 色欧美乱欧美15图片| 久久午夜精品视频| 国产成a人无v码亚洲福利| 欧美 日本 亚洲| 精品国产美女| 91偷拍精品一区二区三区| 国产不卡123| 在线免费看av不卡| av网站在线观看免费| 天天综合色天天综合色h| 蜜桃av乱码一区二区三区| 国产精品一区二区久激情瑜伽| 国产二级片在线观看| 欧美亚洲在线日韩| 国产另类第一区| 国产亚洲人成a在线v网站| 欧美精品电影在线| www视频在线观看免费| 欧美成人性战久久| 免费无码国产精品| 亚洲影视在线观看| 精品人妻中文无码av在线| 国产精品88888| 92看片淫黄大片一级| 中文字幕一区二区三三| 欧美在线播放一区| ccyy激情综合| 成人在线激情视频| 久久毛片亚洲| 久久久久久欧美| 午夜免费播放观看在线视频| 亚洲成人久久一区| 国产永久免费视频| 日韩欧美国产中文字幕| 久久久久久久久精| 国产精品美女久久久久久久网站| 中文字幕5566| 粉嫩aⅴ一区二区三区四区| 爱爱爱爱免费视频| 久热国产精品| 天堂…中文在线最新版在线| 国产精品国产三级国产在线观看| 日本黑人久久| 久久97精品| 国产富婆一区二区三区 | 91精品欧美综合在线观看最新| 国产高清中文字幕| 午夜精品福利久久久| 欧美三级在线免费观看| 中文字幕在线视频一区| 亚洲国产天堂av| 久久一留热品黄| 国产a级黄色片| 国产成人自拍高清视频在线免费播放| 亚洲黄色a v| 久久一二三区| 黄色免费福利视频| 亚洲成人中文| 菠萝蜜视频在线观看入口| 亚洲字幕久久| 91香蕉视频网址| 五月天久久网站| 国产a级片免费看| 国产精品久久久久久久免费观看| 日韩av一区二区三区美女毛片| 中文字幕亚洲影视| 久久久久资源| 少妇精品导航| 久久久久久国产精品一区 | 成人午夜免费视频| 不卡的一区二区| 国产成人小视频| 国产情侣久久久久aⅴ免费| 粉嫩av一区二区三区粉嫩| 日本天堂在线播放| 成人精品gif动图一区| 亚洲精品久久一区二区三区777| 国产99久久久精品| 中文字幕a在线观看| 91首页免费视频| 精品少妇人妻一区二区黑料社区 | 国产午夜精品理论片| 国产精品国产三级国产aⅴ原创 | 亚洲经典三级| 欧洲黄色一级视频| 天使萌一区二区三区免费观看| 国产天堂在线播放| 精品制服美女丁香| 超碰人人cao| caoporen国产精品视频| 亚洲乱码国产乱码精品精大量| 国产午夜精品一区二区三区嫩草| 免费观看a级片| 亚洲欧美在线视频| 国产精品成人aaaa在线| 欧美日韩美女视频| 日本丰满少妇做爰爽爽| 欧美日本一道本| 黄色av一区二区三区| 亚洲欧美国内爽妇网| 午夜激情视频在线观看| 欧美日韩成人精品| 国产伦精品一区二区三区视频金莲| 国产精品成人v| 亚洲三级av| 欧美极品一区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国内精品久久影院| 欧美日韩dvd| 亚洲高清电影| 免费看黄色一级大片| 九九国产精品视频| 日韩精品视频一区二区| 国产视频不卡一区| 91日韩中文字幕| 欧美性20hd另类| 国产精品欧美久久久久天天影视| 精品国产乱码久久久久久老虎| 国产三级在线免费观看| 欧美激情精品久久久久久变态| 性爱在线免费视频| 久久久久国产精品麻豆ai换脸 | 夜色77av精品影院| 中文一区一区三区免费| 性欧美长视频| 亚洲区 欧美区| 国产日产欧美精品一区二区三区| 国产欧美精品在线| se69色成人网wwwsex| 亚洲欧美激情在线| 国产精品熟妇一区二区三区四区| 久久品道一品道久久精品| 亚洲国产成人精品综合99| 欧美午夜影院一区| 亚洲av成人精品一区二区三区在线播放| 色老头一区二区三区| 综合日韩av| 国产精品美女诱惑| 亚洲深深色噜噜狠狠爱网站| 中文字幕日韩精品有码视频| 亚洲一级在线播放| 中文字幕亚洲视频| 欧洲精品一区二区三区久久| 奇米一区二区三区| 中文字幕一区二区三区人妻不卡| 一区二区三区欧美日韩| 一起草av在线| 中文字幕免费精品一区| 欧美大片免费高清观看| 国产日韩精品推荐| 欧美三级视频| 北条麻妃亚洲一区| 亚洲欧洲国产专区| 一本到在线视频| 在线国产精品视频| 欧美日韩国产网站| 欧美亚洲精品日韩| 美女日韩在线中文字幕| 在线观看国产三级| 精品久久久久久久久久| 殴美一级特黄aaaaaa| 久久久久久久久久久av| 超碰97成人| 男人天堂av片| 青青草91久久久久久久久| 中文字幕在线观看亚洲| 91精选在线| 亚洲综合自拍一区| 911久久香蕉国产线看观看| 午夜啪啪小视频| 亚洲欧美日韩一区| 精品人妻一区二区三区浪潮在线 | 中文字幕欧美日韩一区二区三区 | 毛片av一区二区三区| 欧美人妻一区二区三区| 欧美在线一区二区三区| av在线第一页| 91精品久久久久久久久| 91成人免费| 免费在线观看日韩av| 亚洲一区二区三区视频在线播放 | 在线观看黄色国产| 久久精视频免费在线久久完整在线看 | 亚洲成人午夜电影| 日韩在线观看视频一区| 57pao成人永久免费视频| 国产videos久久| 亚洲这里只有精品| 伊人婷婷欧美激情| 欧美一级特黄aaaaaa| 亲子乱一区二区三区电影| 欧美一级本道电影免费专区| 在线观看免费不卡av| 一区二区免费看| 色网站在线免费观看| 国产精品久久久久久久久久久久 | 久久亚洲道色| 久久人妻精品白浆国产| 亚洲国产精品成人综合| 国产精品欧美亚洲| 98视频在线噜噜噜国产| 欧美限制电影| 精品人妻二区中文字幕| 日韩欧美国产骚| 69xxx在线| 久久综合九色综合网站| 久久66热re国产| 五月天婷婷丁香| 色琪琪综合男人的天堂aⅴ视频| 伊人久久亚洲| www.xxx亚洲| 亚洲一级在线观看| 国产爆初菊在线观看免费视频网站| 亚洲在线第一页| 久久动漫亚洲| 欧美成欧美va| 中国china体内裑精亚洲片| 亚洲一区电影| 无限资源日本好片| 精品成人乱色一区二区| 天堂аⅴ在线地址8| 久久精品二区| 国产乱码精品一品二品| 日日夜夜狠狠操| 亚洲盗摄视频| 欧美午夜精品久久久久久超碰|