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

Java服務(wù)限流算法

開(kāi)發(fā) 前端
其實(shí)這幾種算法,不能說(shuō)哪一個(gè)是最好的,只能說(shuō)是要的業(yè)務(wù)邏輯是什么樣的,選擇合適的限流算法來(lái)滿足自己的業(yè)務(wù)實(shí)現(xiàn),沒(méi)有最優(yōu),只有最合適。

一、概述

限流其實(shí)就是對(duì)服務(wù)的請(qǐng)求做一下QPS的控制,對(duì)于有些免登錄的接口需要做一下訪問(wèn)的限制,不能無(wú)限制的去請(qǐng)求接口,不然的話會(huì)給服務(wù)器造成很大的壓力,而且我們也希望一些接口做一下控制,控制請(qǐng)求量,這樣我們就可以做一個(gè)plugin對(duì)服務(wù)做限流操作,超出限流就返回請(qǐng)求失敗,保證系統(tǒng)的穩(wěn)定運(yùn)行。主要概念就是閾值以及拒絕策略,實(shí)際中需要用到限流的的比如,驗(yàn)證碼,白名單,當(dāng)然也有容器的限流,比如nginx就是比較常用的,可以做一下簡(jiǎn)單的處理。

二、限流算法類(lèi)型

幾種算法的使用,一些基礎(chǔ)代碼如下

限流代碼基礎(chǔ)類(lèi)

@RequestLimiter

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface RequestLimiter {
/**
* 限流類(lèi)型 ,具體見(jiàn)枚舉類(lèi) RequestLimitType
*/
RequestLimitType type() default RequestLimitType.TOKEN;

/**
* 限流訪問(wèn)數(shù)
*/
int limitCount() default 100;

/**
* 限流時(shí)間段
*/
long time() default 60;

/**
* 限流時(shí)間段 時(shí)間單位
*/
TimeUnit unit() default TimeUnit.SECONDS;

/**
* 漏出或者生成令牌時(shí)間間隔,單位 毫秒 (當(dāng)type為T(mén)OKEN、LEAKY_BUCKET時(shí)生效)
*/
long period() default 1000;

/**
* 每次生成令牌數(shù)或者漏出水滴數(shù) (當(dāng)type為T(mén)OKEN、LEAKY_BUCKET時(shí)生效)
*/
int limitPeriodCount() default 10;

}

LimitKeyConstant

public class LimitKeyConstant {
/**
* 令牌桶鍵名
*/
public static final String QPS_TOKEN = "request:limit:qps:tokenBucket:";

/**
* 漏桶鍵名
*/
public static final String QPS_LEAKY_BUCKET = "request:limit:qps:leakyBucket:";

/**
* 固定窗口鍵名
*/
public static final String QPS_FIXED_WINDOW = "request:limit:qps:fixedWindow:";

/**
* 滑動(dòng)窗口鍵名
*/
public static final String QPS_SLIDE_WINDOW = "request:limit:qps:slideWindow:";
}

RequestLimitType

public enum RequestLimitType {
/**
* 令牌算法
*/
TOKEN(1, "令牌算法"),
/**
* 漏桶算法
*/
LEAKY_BUCKET(2, "漏桶算法"),

/**
* 固定窗口
*/
FIXED_WINDOW(3, "固定窗口"),
/**
* 滑動(dòng)窗口
*/
SLIDE_WINDOW(4, "滑動(dòng)窗口");

private Integer type;
private String desc;

RequestLimitType(Integer type, String desc) {
this.type = type;
this.desc = desc;
}

public Integer getType() {
return type;
}

public String getDesc() {
return desc;
}
}

RequestLimitAspect

@Slf4j
@Aspect
@Component
public class RequestLimitAspect {
@Autowired
private RequestLimitFactory factory;


/**
* 切入點(diǎn)
*/
@Pointcut(value = "@annotation(com.common.limit.annotation.RequestLimiter)")
public void requestLimit(){
// 切入點(diǎn)方法
}

/**
* 前置切點(diǎn)
*
* @param
@Before("requestLimit()")
public void doBefore(JoinPoint joinPoint){
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
RequestLimiter limiter = targetMethod.getAnnotation(RequestLimiter.class);
RequestLimitService service = factory.build(limiter.type());
if (service != null) {
RequestLimitParam param = new RequestLimitParam();
param.setLimiter(limiter);
param.setKey(signature.getName());
if (service.checkRequestLimit(param)) {
throw new LimitException("請(qǐng)求過(guò)于頻繁,請(qǐng)稍后再重試!");
}
}
}
}

RequestLimitFactory

@Slf4j
@Component
public class RequestLimitFactory implements ApplicationContextAware {
private static final Map<RequestLimitType, RequestLimitService> MAP = new ConcurrentHashMap<>();

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
try {
applicationContext.getBeansOfType(RequestLimitService.class).values().forEach(service -> MAP.put(service.getType(), service));
} catch (Exception e) {
log.error("初始化限流策略異常", e);
}
}

/**
* 構(gòu)建service
*
* @param type 限流類(lèi)型
* @return
public RequestLimitService build(RequestLimitType type){
return MAP.get(type);
}
}

RequestLimitService

public interface RequestLimitService {
/**
* 檢測(cè)是否限流
*
* @param param 限流參數(shù)
* @return
boolean checkRequestLimit(RequestLimitParam param);

/**
* 獲取當(dāng)前限流類(lèi)型
*
* @return
RequestLimitType getType();

/**
* 獲取帶注解方法列表
*
* @param resourcePatternResolver 資源查詢
* @param limitType 注解類(lèi)型
* @param scanPackage 掃描包路徑
* @return
default List<RequestLimitParam> getTokenLimitList(ResourcePatternResolver resourcePatternResolver, RequestLimitType limitType,
String scanPackage){
try {
List<RequestLimitParam> list = new ArrayList<>();
Resource[] resources = resourcePatternResolver.getResources(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + scanPackage +
"/**/*.class");
MetadataReaderFactory metaReader = new CachingMetadataReaderFactory();
for (Resource resource : resources) {
MetadataReader reader = metaReader.getMetadataReader(resource);
AnnotationMetadata annotationMetadata = reader.getAnnotationMetadata();

Set<MethodMetadata> annotatedMethods = annotationMetadata.getAnnotatedMethods(RequestLimiter.class.getCanonicalName());
annotatedMethods.forEach(methodMetadata -> {
RequestLimiter limiter = methodMetadata.getAnnotations().get(RequestLimiter.class).synthesize();
if (!limitType.equals(limiter.type())) {
return;
}
RequestLimitParam param = new RequestLimitParam();
param.setKey(methodMetadata.getMethodName());
param.setLimiter(limiter);
list.add(param);
});
}
return list;
} catch (IOException e) {
return Collections.emptyList();
}
}
}

固定時(shí)間窗口算法

圖解

介紹

其實(shí)就是原子計(jì)數(shù)法,就是在固定時(shí)間內(nèi),允許請(qǐng)求量是多少,每次請(qǐng)求就在計(jì)數(shù)器上加1,設(shè)置計(jì)數(shù)器的過(guò)期時(shí)間,當(dāng)計(jì)數(shù)器的閾值達(dá)到限流配置的數(shù)時(shí)候,就執(zhí)行拒絕策略,超過(guò)了時(shí)間,計(jì)數(shù)器就會(huì)重新歸0。

比如上圖中,會(huì)限制在每秒限制請(qǐng)求數(shù)為2,就是在每秒的時(shí)間會(huì)限制請(qǐng)求為2,但是會(huì)出現(xiàn)極端的情況,比如在前一個(gè)時(shí)間段中的前500ms和后500ms,請(qǐng)求數(shù)都是2,這樣就會(huì)看到在這一秒內(nèi)是有4個(gè)請(qǐng)求的,這就是會(huì)出現(xiàn)請(qǐng)求的問(wèn)題,當(dāng)然這也是最簡(jiǎn)單的限流算法。

代碼

@Slf4j
@Service
public class FixedWindowRateLimitServiceImpl implements RequestLimitService {

@Autowired
private RedisConnectionFactory factory;

@Override
public boolean checkRequestLimit(RequestLimitParam param){
String key = LimitKeyConstant.QPS_FIXED_WINDOW + param.getKey();
RequestLimiter limiter = param.getLimiter();
RedisAtomicInteger atomicCount = new RedisAtomicInteger(key, factory);
int count = atomicCount.getAndIncrement();
if (count == 0) {
atomicCount.expire(limiter.time(), limiter.unit());
}
log.info("FixedWindowRateLimitServiceImpl time:{} unit:{} allow visit {} ", limiter.time(), limiter.unit(), limiter.limitCount());
// 檢測(cè)是否到達(dá)限流值
if (count >= limiter.limitCount()) {
log.info("FixedWindowRateLimitServiceImpl limit controller key:{},time:{},name:{} to visit :{}", key, limiter.time(),
limiter.unit().name(), limiter.limitCount());
return true;
} else {
return false;
}
}

@Override
public RequestLimitType getType(){
return RequestLimitType.FIXED_WINDOW;
}
}

滑動(dòng)時(shí)間窗口算法

圖解

介紹

滑動(dòng)時(shí)間窗口算法,其實(shí)就是對(duì)固定窗口的改進(jìn),知道了固定時(shí)間窗口會(huì)出現(xiàn)極端的情況,那滑動(dòng)就在下一個(gè)臨界的時(shí)候,進(jìn)行處理時(shí)間,其實(shí)就是在某一段時(shí)間進(jìn)行處理時(shí)間。

比如上圖中每 500ms 滑動(dòng)一次窗口,可以發(fā)現(xiàn)窗口滑動(dòng)的間隔越短,時(shí)間窗口的臨界突變問(wèn)題發(fā)生的概率也就越小,不過(guò)只要有時(shí)間窗口的存在,還是有可能發(fā)生時(shí)間窗口的臨界突變問(wèn)題。

這個(gè)是記錄下所有的請(qǐng)求時(shí)間點(diǎn),新請(qǐng)求先判斷最近指定時(shí)間范圍內(nèi)的請(qǐng)求數(shù)量是否超過(guò)指定閾值,來(lái)確定是否達(dá)到限流,雖然沒(méi)有時(shí)間窗口突變的問(wèn)題,限流比較準(zhǔn)確,但是要記錄下每次請(qǐng)求的時(shí)間點(diǎn),所以占用的內(nèi)存較多。

代碼

@Slf4j
@Service
public class SlideWindowRateLimitServiceImpl implements RequestLimitService {
@Autowired
private RedisService redisService;

@Override
public boolean checkRequestLimit(RequestLimitParam param){
String key = LimitKeyConstant.QPS_SLIDE_WINDOW + param.getKey();
RequestLimiter limiter = param.getLimiter();
long current = System.currentTimeMillis();
long duringTime = limiter.unit().toMillis(limiter.time());
Long count = redisService.setCount(key, current - duringTime, current);
// 清除有效期外的數(shù)據(jù)
redisService.setRemoveRangeByScore(key, 0, current - duringTime - 1f);

log.info("SlideWindowRateLimitServiceImpl time:{} unit:{} allow visit {}", limiter.time(), limiter.unit(), limiter.limitCount());
// 檢測(cè)是否到達(dá)限流值
if (count != null && count >= limiter.limitCount()) {
log.info("SlideWindowRateLimitServiceImpl limit controller key:{},time:{},name:{} to visit :{}", key, limiter.time(),
limiter.unit().name(), limiter.limitCount());
return true;
} else {
redisService.setAdd(key, UUID.randomUUID().toString(), current);
return false;
}
}

@Override
public RequestLimitType getType(){
return RequestLimitType.SLIDE_WINDOW;
}
}

漏桶算法

圖解

介紹

此算法就是定義一個(gè)桶的容量,然后每次的請(qǐng)求過(guò)來(lái)都放在桶里面,一直等到桶滿了以后就會(huì)執(zhí)行拒絕策略,然后在桶不滿的情況下,會(huì)按照固定的速率去執(zhí)行請(qǐng)求,其實(shí)就是按照固定流速去執(zhí)行請(qǐng)求,保證單位時(shí)間內(nèi)的執(zhí)行請(qǐng)求量是固定的。

漏桶就是按照某一個(gè)請(qǐng)求的穩(wěn)定的速度處理發(fā)來(lái)的請(qǐng)求數(shù)量,可以很好地保證系統(tǒng)的穩(wěn)定運(yùn)行,只能平穩(wěn)處理請(qǐng)求,這也是他的一個(gè)缺點(diǎn),不能處理面對(duì)突然來(lái)的高的請(qǐng)求量,會(huì)導(dǎo)致請(qǐng)求一直處于哎隊(duì)列等待中,不能面對(duì)高并發(fā)下的請(qǐng)求處理,比較保守的處理邏輯

代碼

@Slf4j
@Service
public class LeakyBucketRateLimitServiceImpl implements RequestLimitService {
@Autowired
private ResourcePatternResolver resourcePatternResolver;

@Autowired
private RedisService redisService;

@Resource(name = Constants.THREAD_POOL_TASK_BEAN_NAME)
private ThreadPoolTaskScheduler executor;

@Value("${limit.scan.package}")
private String scanPackage;

@Override
public boolean checkRequestLimit(RequestLimitParam requestLimitParam) {
String key = LimitKeyConstant.QPS_LEAKY_BUCKET + requestLimitParam.getKey();
Long size = redisService.listSize(key);
if (size != null && size >= requestLimitParam.getLimiter().limitCount()) {
log.info("LeakyBucketRateLimitServiceImpl limit key:{}", requestLimitParam.getKey());
return true;
} else {
log.info("LeakyBucketRateLimitServiceImpl not full,limit key:{} ,current size:{},total size:{}", requestLimitParam.getKey(),
size, requestLimitParam.getLimiter().limitCount());
redisService.listLeftPush(key, UUID.randomUUID().toString());
return false;
}
}

/**
* 定數(shù)流出令牌
*/
@PostConstruct
public void init() {
List<RequestLimitParam> list = this.getTokenLimitList(resourcePatternResolver, RequestLimitType.LEAKY_BUCKET, scanPackage);
if (list.isEmpty()) {
log.info("LeakyBucketRateLimitServiceImpl annotation is empty,end current task pool");
return;
}
list.forEach(requestLimitDTO -> {
executor.scheduleAtFixedRate(() -> {
String key = LimitKeyConstant.QPS_LEAKY_BUCKET + requestLimitDTO.getKey();
//截取List在start和end之間的元素處key列表
redisService.listTrim(key, requestLimitDTO.getLimiter().limitPeriodCount(), -1);
log.info("LeakyBucketRateLimitServiceImpl limit key:{},limitPeriodCount:{}", key,
requestLimitDTO.getLimiter().limitPeriodCount());
}, requestLimitDTO.getLimiter().period());
});
}

@Override
public RequestLimitType getType() {
return RequestLimitType.LEAKY_BUCKET;
}
}

令牌算法

圖解

介紹

此算法也是對(duì)于漏桶的算法的改進(jìn),這個(gè)邏輯是桶里面有一個(gè)閾值,按照一定的速率進(jìn)行在桶里面存放令牌,直到令牌滿了,就不在新增令牌,然后請(qǐng)求每次來(lái)就去桶中獲取令牌,獲取到了,就進(jìn)行處理,沒(méi)有令牌則執(zhí)行拒絕策略

這個(gè)算法其實(shí)原理類(lèi)似于生產(chǎn)者,消費(fèi)者的模型,生產(chǎn)者按照一定的速度生成令牌,消費(fèi)者可以消費(fèi)數(shù)據(jù),相對(duì)來(lái)說(shuō),這個(gè)是比較好用的

代碼

@Slf4j
@Service
public class TokenBucketRateLimitServiceImpl implements RequestLimitService {
@Autowired
private ResourcePatternResolver resourcePatternResolver;

@Autowired
private RedisService redisService;

@Resource(name = Constants.THREAD_POOL_TASK_BEAN_NAME)
private ThreadPoolTaskScheduler executor;

@Value("${limit.scan.package}")
private String scanPackage;


@Override
public boolean checkRequestLimit(RequestLimitParam param){
Object pop = redisService.listRightPop(LimitKeyConstant.QPS_TOKEN + param.getKey());
RequestLimiter limiter = param.getLimiter();
log.info("TokenBucketRateLimitServiceImpl limit period {} ms create {} total token,max token num is:{}", limiter.period(),
limiter.limitPeriodCount(), limiter.limitCount());
if (pop == null) {
log.info("TokenBucketRateLimitServiceImpl limit is empty key:{}", param.getKey());
return true;
} else {
return false;
}
}

@PostConstruct
public void init(){
// 掃描出所有使用了自定義注解并且限流類(lèi)型為令牌算法的方法信息
List<RequestLimitParam> list = this.getTokenLimitList(resourcePatternResolver, RequestLimitType.TOKEN, scanPackage);
if (list.isEmpty()) {
log.info("TokenBucketRateLimitServiceImpl annotation is empty,end current task pool");
return;
}
// 每個(gè)接口方法更具注解配置信息提交定時(shí)任務(wù),生成令牌進(jìn)令牌桶
list.forEach(limit -> executor.scheduleAtFixedRate(() -> {
String key = LimitKeyConstant.QPS_TOKEN + limit.getKey();
Long tokenSize = redisService.listSize(key);
int size = tokenSize == null ? 0 : tokenSize.intValue();
if (size >= limit.getLimiter().limitCount()) {
return;
}
// 判斷添加令牌數(shù)量
int addSize = Math.min(limit.getLimiter().limitPeriodCount(), limit.getLimiter().limitCount() - size);
List<String> addList = new ArrayList<>(addSize);
for (int index = 0; index < addSize; index++) {
addList.add(UUID.randomUUID().toString());
}
redisService.listLeftPushAll(key, addList);
}, limit.getLimiter().period()));
}

@Override
public RequestLimitType getType(){
return RequestLimitType.TOKEN;
}
}

三,總結(jié)

其實(shí)這幾種算法,不能說(shuō)哪一個(gè)是最好的,只能說(shuō)是要的業(yè)務(wù)邏輯是什么樣的,選擇合適的限流算法來(lái)滿足自己的業(yè)務(wù)實(shí)現(xiàn),沒(méi)有最優(yōu),只有最合適。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2020-09-08 06:48:07

微服務(wù)算法限流

2025-04-10 08:00:00

服務(wù)限流開(kāi)發(fā)高并發(fā)

2024-07-05 16:47:46

2024-06-05 10:07:00

限流微服務(wù)算法

2024-11-29 16:02:17

2022-03-18 14:33:22

限流算法微服務(wù)

2023-02-20 08:08:48

限流算法計(jì)數(shù)器算法令牌桶算法

2023-11-28 09:19:12

2020-08-03 08:04:04

限流算法Sentinel

2025-03-26 00:58:14

2018-04-10 10:15:48

微服務(wù)架構(gòu)Nginx

2022-05-19 14:14:26

go語(yǔ)言限流算法

2021-05-31 07:01:46

限流算法令牌

2023-09-06 15:22:26

限流Java

2021-03-16 08:31:59

微服務(wù)Sentinel雪崩效應(yīng)

2024-04-19 00:00:00

計(jì)數(shù)器算法限流算法

2024-02-28 09:22:03

限流算法數(shù)量

2019-08-13 15:36:57

限流算法令牌桶

2023-11-15 07:40:40

2023-07-11 10:24:00

分布式限流算法
點(diǎn)贊
收藏

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

国产乱人乱偷精品视频a人人澡| 中国美女乱淫免费看视频| 日本中文字幕视频在线| 精品在线亚洲视频| 欧美高清videos高潮hd| 人妻熟女aⅴ一区二区三区汇编| 日韩欧美一区二区三区在线观看 | 亚洲a v网站| 巨大黑人极品videos精品| 一区二区三区在线观看视频| 久久免费99精品久久久久久| 亚洲图片视频小说| 国产精品综合| 久久国产精品电影| 免费看黄色的视频| 亚洲精品视频一二三区| 91成人国产精品| 日韩免费在线观看av| 成人在线免费公开观看视频| 成人综合在线视频| 成人高清视频观看www| 国产又黄又爽又色| 欧美日韩国产综合网| 伊人久久五月天| 欧美一级片黄色| 精品国产亚洲日本| 欧美性xxxxxxxx| 黄色动漫网站入口| 青春草免费在线视频| 中文在线资源观看网站视频免费不卡| 国产有色视频色综合| 国产xxxx在线观看| 毛片一区二区三区| 日韩免费视频在线观看| 亚洲国产精一区二区三区性色| 婷婷激情综合| 最近2019中文字幕第三页视频| 一级性生活大片| 果冻天美麻豆一区二区国产| 日韩女优av电影在线观看| 亚洲妇熟xx妇色黄蜜桃| 久久精品国产福利| 欧美在线一区二区| 男女污污的视频| 中文在线а√在线8| 欧美日韩中文字幕综合视频| 欧美黑人经典片免费观看| 97超碰在线公开在线看免费| 亚洲视频香蕉人妖| 亚洲精品影院| eeuss影院在线观看| 国产欧美一区二区三区在线看蜜臀 | 国产精品女上位| 日韩欧美电影一区二区| 国产综合在线观看| 国产欧美精品一区aⅴ影院| 欧美日韩精品久久| 麻豆导航在线观看| 国产视频911| 亚洲国产日韩综合一区| 在线免费看黄网站| 国产精品女上位| 婷婷视频在线播放| 色呦呦呦在线观看| 亚洲国产sm捆绑调教视频 | 亚洲第一男人天堂| 日韩aaaaa| 最近国产精品视频| 国产一区二区三区在线观看视频 | 野花社区视频在线观看| 亚洲成a人片77777在线播放| 精品在线欧美视频| 国产三级黄色片| 我不卡伦不卡影院| 久久久久久久999精品视频| 懂色av.com| 日韩av在线发布| 成人精品一区二区三区电影免费 | 精品亚洲国产视频| 第一次破处视频| 久久久久久久久久久妇女| 欧美精品免费播放| 中文字幕激情小说| 三级不卡在线观看| 91在线视频免费| 日本黄色三级视频| 国产色91在线| 女女百合国产免费网站| 免费一二一二在线视频| 国产一级一片免费播放| 久久精品成人| 亚洲在线www| 人成在线免费视频| 亚洲黄色性网站| aⅴ在线免费观看| 韩国三级成人在线| 亚洲三级av在线| 久久久久无码精品国产| 日韩av网站免费在线| 超碰97在线播放| 91在线视频| 精品久久久久久电影| 国产精品嫩草影院8vv8| 老司机精品视频在线播放| 色老头一区二区三区| 国产对白videos麻豆高潮| 久久av资源网| 蜜桃日韩视频| 图片区小说区亚洲| 欧美视频一区二区在线观看| 日本在线不卡一区二区| 亚洲激情五月| 国产精品黄页免费高清在线观看| 精品女同一区二区三区| 中文字幕va一区二区三区| 一二三四视频社区在线| 四虎国产精品免费久久5151| 日韩av在线一区二区| 欧美黑吊大战白妞| 看片网站欧美日韩| 欧美一区二区三区在线免费观看| 丁香花在线高清完整版视频| 欧美日本在线观看| 日韩在线免费观看av| 狠狠入ady亚洲精品| 91色在线观看| 欧美性videos| 欧美性色欧美a在线播放| 37p粉嫩大胆色噜噜噜| 亚洲精一区二区三区| 不卡视频一区二区| 深夜国产在线播放| 日韩视频永久免费| 裸体武打性艳史| 精品一区二区在线看| 视频一区二区三区在线观看| 日韩精品专区| 日韩精品中文字幕视频在线| 国产奶水涨喷在线播放| 成人午夜av在线| 国产精品无码免费专区午夜| 国产美女视频一区二区| 精品国偷自产在线视频99| 中文字幕 视频一区| 欧美国产日韩一二三区| 国产精品第12页| 少妇精品久久久一区二区| 欧美一区二区三区艳史| 日本中文字幕电影在线观看| 欧美视频一区二区三区…| 男生裸体视频网站| 久久精品动漫| 亚洲激情一区二区| 亚洲一区导航| 欧美成人久久久| 亚洲精品成人电影| 亚洲成人在线观看视频| 深田咏美中文字幕| 久久不射中文字幕| 日本在线免费观看一区| 日本美女久久| 日韩亚洲第一页| 国产极品999| 亚洲成av人片一区二区三区| 日韩精品一区二区三区高清免费| 免费久久99精品国产自在现线| 欧美深深色噜噜狠狠yyy| 欧美日韩尤物久久| 久久视频中文字幕| 六月婷婷中文字幕| 欧美日韩综合视频网址| 午夜国产福利视频| 国产iv一区二区三区| 精品欧美一区免费观看α√| 精品久久影院| 亚洲一区二区三区四区在线播放 | 国产精品高潮呻吟久久av黑人| 亚洲s色大片| 精品久久五月天| 久久久久久久久久成人| 亚洲女同女同女同女同女同69| 欧美熟妇精品一区二区| 久久精品一区二区国产| 一区二区三区av在线| 97一区二区国产好的精华液| 青青久久av北条麻妃黑人| 巨大荫蒂视频欧美另类大| 亚洲精品在线网站| 国产情侣呻吟对白高潮| 一区二区三区精密机械公司| 亚洲一区二区三区四区五区六区| 日本成人在线一区| 黄色片网址在线观看| 日韩欧美视频专区| 国产在线精品一区二区三区》| 高清亚洲高清| 欧洲日韩成人av| 日韩经典av| 最近2019好看的中文字幕免费| 欧美视频一二区| 欧美精品乱码久久久久久按摩 | 国产精品三上| 潘金莲一级淫片aaaaa免费看| 神马午夜久久| 99r国产精品视频| 日韩美女在线| 欧美一级在线播放| 深夜国产在线播放| 最新亚洲国产精品| 久久精品色图| 精品1区2区在线观看| 国产一区二区视频免费观看| 狠狠爱在线视频一区| 国产97免费视频| 亚洲国产高清aⅴ视频| 中文字幕第3页| 国产一区二区女| 久久国产精品国产精品| 国产亚洲午夜| 国产综合中文字幕| 欧美a级片网站| 中文字幕一区二区三区精彩视频 | 欧美成年网站| 国产欧美最新羞羞视频在线观看| 欧美xxx视频| 26uuu亚洲伊人春色| 性网站在线观看| 久久亚洲精品一区| av资源种子在线观看| 亚洲欧美日韩精品久久| 无码国精品一区二区免费蜜桃| 日韩亚洲国产中文字幕欧美| 国产精品福利电影| 欧美视频一区二| 国产精品免费无遮挡无码永久视频| 午夜av电影一区| 国产一级特黄a高潮片| 亚洲一区视频在线| 欧美日韩在线视频免费| 亚洲人吸女人奶水| 顶级黑人搡bbw搡bbbb搡| 欧美高清在线视频| 国产不卡在线观看视频| 中文字幕免费在线观看视频一区| 亚洲国产日韩一区无码精品久久久| 91色视频在线| 精品夜夜澡人妻无码av| 久久久www免费人成精品| 亚洲av无码国产精品久久| 久久夜色精品一区| 亚洲人成人无码网www国产| 国产亚洲一区二区三区| 男人操女人动态图| 中文字幕免费不卡在线| 男人天堂资源网| 日韩毛片一二三区| 久久久久久久极品内射| 亚洲成人av在线电影| 久草国产精品视频| 日本久久一区二区| 中文字幕一区二区三区四区免费看| 欧美日韩视频在线第一区 | 亚洲国产精品福利| 在线观看xxx| 亚洲一区二区久久| 免费a级在线播放| 欧美乱人伦中文字幕在线| 国产在线xxx| 欧美最猛性xxxxx免费| 成人1区2区| 91传媒视频免费| 性欧美lx╳lx╳| 亚洲图片都市激情| 韩日精品在线| 男人亚洲天堂网| 精品亚洲成a人在线观看 | 久久97精品| 日韩中文字幕一区二区| 中文字幕一区二区三区在线视频| 日本欧美视频在线观看| 日韩电影在线一区| 少妇熟女视频一区二区三区| 久久亚洲综合色| 日本午夜在线观看| 精品久久久久久久久久国产| 中文字幕二区三区| 亚洲第一免费播放区| 亚乱亚乱亚洲乱妇| 97在线视频精品| 91麻豆精品一二三区在线| 国产日韩欧美综合精品| 久久亚洲专区| 亚洲人成色77777| 国产精品亚洲视频| 日本爱爱爱视频| 亚洲国产一区视频| 亚洲一卡二卡在线| 亚洲精品福利视频| 成人影院在线观看| 日本成人黄色片| www.神马久久| 在线不卡视频一区二区| 国产视频一区欧美| www.久久com| 国产精品国产三级国产aⅴ中文| 九九九国产视频| 91精品国产综合久久福利软件 | 欧美重口另类videos人妖| 2019中文亚洲字幕| 日产国产精品精品a∨| 亚洲激情不卡| 99国产精品免费视频| 国产精品久久久久久久久动漫| 亚洲黄色激情视频| 精品美女一区二区| 欧美18hd| 国产精品偷伦免费视频观看的| 日韩精品免费一区二区三区竹菊| 黄色网络在线观看| 开心九九激情九九欧美日韩精美视频电影 | 蜜臀久久99精品久久久无需会员| 色成人免费网站| 久久综合中文色婷婷| 在线播放日韩| 国产人妖在线观看| 亚洲综合成人在线视频| 国产免费一区二区三区免费视频| 尤物九九久久国产精品的分类 | 亚洲在线第一页| 国产精品久久久久蜜臀| 一路向西2在线观看| 国产亚洲短视频| 一级黄色av片| 一区二区三区日韩在线| 免费电影日韩网站| 欧美日韩精品免费观看视一区二区| 最新亚洲一区| 亚洲の无码国产の无码步美| 五月天国产精品| 天天综合在线视频| 欧美在线日韩在线| 一道本一区二区三区| 日韩中文字幕三区| 久久午夜羞羞影院免费观看| 一二三区免费视频| 亚洲天堂日韩电影| 亚洲mmav| 国产高潮呻吟久久久| 国产精品一区久久久久| 91麻豆免费视频网站| 欧美一区欧美二区| 日本精品600av| 国内精品视频在线播放| 国产精品毛片在线看| 9.1成人看片免费版| 91久久久免费一区二区| 91xxx在线观看| 成人黄色av播放免费| 欧美国产三区| 91丨porny丨对白| 岛国av午夜精品| 啊v视频在线| 91免费国产网站| 精品电影一区| 3d动漫精品啪啪一区二区下载| 在线观看成人小视频| 欧美黄色激情| 国产精品二区三区四区| 99在线|亚洲一区二区| 国产精品无码久久久久久| 欧洲国产伦久久久久久久| 欧美成人视屏| 国产精品视频一区二区三区经| 噜噜噜91成人网| 天堂а√在线中文在线鲁大师| 日韩欧美一区电影| 91福利在线免费| 亚洲v欧美v另类v综合v日韩v| 国产一区二三区好的| 日韩免费在线视频观看| 国产一区二区三区在线免费观看| 亚洲男人在线| xxxx18hd亚洲hd捆绑| 中文字幕av不卡| 成人精品在线播放| 日本精品在线视频| 亚洲中无吗在线| 熟女少妇一区二区三区| 欧美日韩精品欧美日韩精品一综合| 在线看三级电影| 茄子视频成人在线观看| 国产呦萝稀缺另类资源| 影音先锋亚洲天堂| 日韩中文字幕在线视频播放| 国产主播性色av福利精品一区| 亚洲欧美久久久久| 性感美女极品91精品| 老司机福利在线视频| 老司机精品福利在线观看| 激情五月激情综合网|