精品欧美一区二区三区在线观看 _久久久久国色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)

www.日本不卡| 视频一区日韩精品| 国产精品视频一二三区 | 37p粉嫩大胆色噜噜噜| 中文字幕21页在线看| 久久午夜色播影院免费高清| 精品无人码麻豆乱码1区2区| 精品免费99久久| 久久久免费视频网站| 第九色区av在线| 国产一区二区三区四区五区入口 | 日本一区二区在线观看视频| 亚洲天堂电影| 一区免费观看视频| 国产精品视频福利| 欧美一级做a爰片免费视频| 色中色综合网| 亚洲欧美日韩天堂| 少妇被狂c下部羞羞漫画| 久久久精品一区二区毛片免费看| 亚洲国产日韩在线一区模特 | 欧美日韩国产在线一区| 亚洲一区www| 日本69式三人交| 精品国产一区二区三区2021| 色狠狠色噜噜噜综合网| 99国产精品白浆在线观看免费| 国产资源在线播放| 9i在线看片成人免费| 91精品婷婷国产综合久久蝌蚪| 伊人久久久久久久久久久久| 亚洲高清毛片| 精品少妇v888av| 天天色天天综合| 国产videos久久| 精品亚洲夜色av98在线观看| 亚洲国产综合av| 精品视频在线播放一区二区三区| 欧洲精品一区二区三区在线观看| 日韩av在线第一页| 国产中文在线播放| 亚洲第一成年网| 人妻无码一区二区三区四区| 黄色片网站在线观看| 中文欧美字幕免费| 午夜精品一区二区三区四区| 毛片网站在线观看| 免费一级在线观看播放网址| 免费高清在线视频一区·| 青草热久免费精品视频| 欧美不卡视频在线观看| 精品不卡视频| 久久乐国产精品| 精品少妇theporn| 黄色亚洲在线| 欧美激情图片区| 久久精品免费在线| 亚洲国产高清一区| 97久久精品在线| 中文字幕亚洲精品一区| 性xx色xx综合久久久xx| 欧美一级免费视频| 做爰无遮挡三级| 蜜臀国产一区二区三区在线播放| 国产精品一区二区三区毛片淫片| 日韩中文字幕高清| 久久成人免费电影| 亚洲japanese制服美女| www黄色网址| 99久久免费视频.com| 免费h精品视频在线播放| 国内精品一区视频| 国产精品久久久久久久久图文区| 亚洲精蜜桃久在线| 精品美女在线观看视频在线观看 | 波多野结衣 久久| 久久香蕉精品| 91免费国产视频| 国产成人三级在线观看视频| 99免费精品视频| 欧美亚洲另类在线一区二区三区| av在线免费观看网| 一区二区三区日韩精品视频| 无码中文字幕色专区| 欧美色网一区| 91.麻豆视频| 午夜男人的天堂| 郴州新闻综合频道在线直播| 欧美成人全部免费| 国产日韩欧美综合| 中文字幕第四页| 久久99国产精品久久99果冻传媒| 成人永久免费| 国模吧精品人体gogo| 亚洲视频在线一区二区| www插插插无码视频网站| 日韩电影免费观| 91精品国产麻豆国产自产在线| 99热超碰在线| 日韩综合一区| 97国产suv精品一区二区62| 五月激情丁香网| 丁香激情综合国产| 亚洲欧美日韩精品综合在线观看| 日韩123区| 欧美午夜一区二区| 中文在线观看免费视频| 日韩欧美电影| 欧美一级大片在线免费观看| 国产视频一区二区三| 91网上在线视频| 在线不卡视频一区二区| 无码小电影在线观看网站免费| 欧美三级乱人伦电影| 亚洲麻豆一区二区三区| 午夜激情久久| 国产精品久久久久77777| www夜片内射视频日韩精品成人| 久久精品夜色噜噜亚洲a∨| 黄黄视频在线观看| 国产福利91精品一区二区| 精品成人私密视频| 婷婷在线精品视频| 美腿丝袜亚洲综合| 欧美精品一区在线| 亚洲天堂av在线| 亚洲国产免费av| 黄色一级视频免费| 国内欧美视频一区二区| 亚洲视频在线观看日本a| 小h片在线观看| 亚洲国产精品久久久久秋霞蜜臀| 日本一级二级视频| 麻豆专区一区二区三区四区五区| 欧美日韩一区二区视频在线观看| xxxx成人| 成人黄色在线看| www日韩中文字幕在线看| 精品无码人妻一区二区三区品| 久久国产人妖系列| 亚洲日本无吗高清不卡| 成人国产一区| 在线播放国产一区中文字幕剧情欧美 | 日本黄大片一区二区三区| 91精品入口| 欧美成人精品在线播放| 精品黑人一区二区三区在线观看 | 成人综合婷婷国产精品久久蜜臀 | 久久国产尿小便嘘嘘| 日韩av电影免费在线观看| 亚洲精品永久免费视频| 亚洲美女在线看| 国产亚洲欧美日韩高清| 久久久99免费| 牛夜精品久久久久久久| 欧美综合一区| 成人国产精品色哟哟| 成人在线观看亚洲| 日韩欧美国产成人一区二区| 国产一级一片免费播放| 波多野结衣在线一区| 1024精品视频| 欧美精品一区二区久久| 国产精品视频网| 岛国成人毛片| 亚洲第一中文字幕| 天天操夜夜操视频| 中文字幕制服丝袜一区二区三区| 五月天av在线播放| 欧美日韩中文| 国产在线精品一区二区中文| 伊人久久综合一区二区| 在线观看日韩www视频免费| 91激情在线观看| 亚洲综合色噜噜狠狠| 日本黄色片在线播放| 日韩精品电影一区亚洲| 小说区视频区图片区| 日韩最新av| 成人小视频免费在线观看| 日韩少妇中文字幕| 久久视频免费| 青草成人免费视频| 黄色网在线免费看| 日韩成人中文电影| 一级黄色小视频| 婷婷开心激情综合| 国产毛片欧美毛片久久久| 国产精品99久久久| 麻豆av免费在线| 午夜激情久久| 久久久福利视频| 精品中文在线| 欧美专区中文字幕| 婷婷色在线播放| 亚洲日本中文字幕| 精品人妻午夜一区二区三区四区 | 欧美另类高清videos的特点| 亚洲视频一区在线| 亚洲综合色一区| 国产一区视频网站| 任你操这里只有精品| 欧美激情四色| 视频一区二区三区免费观看| 97se亚洲| 国产在线不卡精品| 成人福利av| 久久久久久久久久亚洲| sese在线视频| 日韩av影视在线| 国产高中女学生第一次| 欧美探花视频资源| 国产在线观看黄色| 一区二区三区鲁丝不卡| 黄色片网站在线播放| 99re热视频精品| 日本特黄在线观看| 免费一区二区视频| 日av中文字幕| 亚洲一区黄色| 国产精品国三级国产av| 久久久久久久久久久妇女| 日韩av电影在线观看| 天海翼精品一区二区三区| av成人综合网| av在线播放一区二区| 国产精品99久久99久久久二8| 欧美一级鲁丝片| 久久久久久久久综合| 91亚洲天堂| 久久成人人人人精品欧| 看女生喷水的网站在线观看| 一本一道久久a久久精品逆3p| 日本天堂影院在线视频| 亚洲国产成人在线播放| 性生交生活影碟片| 婷婷综合激情| 国产精品一区二区不卡视频| 欧美在线在线| 亚洲字幕一区二区| 久久综合偷偷噜噜噜色| 91日韩在线播放| 国产一区 二区| 91传媒视频免费| 99ri日韩精品视频| 国产精品一区二区a| 国产精品xxxav免费视频| 国产私拍一区| 日韩激情网站| 日韩国产一区久久| 青青草成人影院| 欧美性视频在线播放| 久久久久免费av| 久久久久久av无码免费网站下载| 欧美一区二区三区久久精品| 看全色黄大色大片| 在线国产日韩| 美女av免费在线观看| 日日夜夜免费精品视频| 国产喷水theporn| 国产在线播精品第三| 亚洲精品久久久久久| 不卡一卡二卡三乱码免费网站| 日本国产在线视频| 久久久久青草大香线综合精品| 久久久久久久毛片| 中文字幕永久在线不卡| 男女免费视频网站| 欧美日韩亚洲一区二区| 中文字幕第三页| 91精品婷婷国产综合久久竹菊| 国产激情久久久久久熟女老人av| 亚洲国产精品va在线观看黑人| 三级毛片在线免费看| 中文字幕在线看视频国产欧美在线看完整| 欧洲不卡视频| 久久免费福利视频| 午夜精品成人av| 亚洲一区二区中文字幕| 老司机成人在线| 亚洲日本无吗高清不卡| 欧美激情亚洲| 欧美两根一起进3p做受视频| 久久99精品国产.久久久久| wwwxx日本| 欧美韩国日本不卡| 18精品爽视频在线观看| 欧美综合一区二区| 国内毛片毛片毛片毛片| 亚洲欧美日韩综合| 成人影院www在线观看| 欧美尤物巨大精品爽| 国产精品日韩精品在线播放| 精品久久久久久一区二区里番| 欧美精品乱码| 热99这里只有精品| 国内成+人亚洲+欧美+综合在线| 在线天堂www在线国语对白| 国产精品嫩草影院com| 日韩高清精品免费观看| 欧美另类高清zo欧美| 国产午夜大地久久| 91欧美在线| 免费观看精品视频| 国产精品99久| 国产黄色片在线| 欧美日韩视频免费播放| 国产免费一区二区三区最新不卡| 亚洲精品一区二区在线| 18视频在线观看| 国产精品视频自在线| 欧美一区二区三区红桃小说| 黄色小视频大全| 日韩成人午夜电影| 国产精品无码电影| 亚洲精品v日韩精品| 在线观看xxxx| 亚洲午夜女主播在线直播| 福利在线免费视频| 99re在线| 亚洲欧美在线专区| 亚洲另类第一页| 欧美高清在线视频| 欧产日产国产69| 日韩黄色av网站| 538在线精品| 国产伦精品一区二区三区照片 | 国产91精品入| 欧美a级黄色大片| 久久精品国产亚洲高清剧情介绍| 国产三级av在线播放| 欧美性xxxxx| 香港三日本三级少妇66| 97久久精品国产| 精品久久ai电影| 欧美啪啪免费视频| 99精品热视频| 日韩黄色在线视频| 亚洲国产日韩欧美在线动漫| 韩国日本一区| 超碰国产精品久久国产精品99| 一区二区三区四区电影| 国内精品国产三级国产aⅴ久| 成人欧美一区二区三区视频网页| 91成年人视频| 麻豆乱码国产一区二区三区| 亚洲欧美在线人成swag| 美国av在线播放| 国产精品一区二区在线播放| 黄色一级片在线免费观看| 精品少妇一区二区三区视频免付费 | 久久久久亚洲av成人无码电影 | 91在线公开视频| 久久精品91久久久久久再现| 深夜日韩欧美| 欧美日韩中文字幕在线播放| 国产精品一区二区91| 国产一级片播放| 日韩电影第一页| www成人在线视频| 一区二区三视频| 国产精品99久久久久久有的能看 | xxxx日本免费| 欧美性大战久久久| 国产原创在线观看| 国产v亚洲v天堂无码| 国产欧美另类| 手机av在线不卡| 日韩一区二区在线免费观看| 国产网红在线观看| 欧美日韩在线观看一区| 六月丁香婷婷色狠狠久久| 男人与禽猛交狂配| 亚洲福利精品在线| 秋霞国产精品| 免费成人深夜夜行网站视频| 成人免费黄色在线| 波多野结衣视频观看| 欧美大成色www永久网站婷| 美女av一区| 中文字幕成人免费视频| 亚洲成在线观看| 中文字幕日本在线观看| av免费观看久久| 日本欧美韩国一区三区| 免费毛片在线播放免费| 亚洲欧美综合精品久久成人| 婷婷久久免费视频| 精品中文字幕av| 亚洲欧美日韩一区二区三区在线观看| 蜜桃视频污在线观看| 国产精品精品一区二区三区午夜版| 91精品国产91久久久久久黑人| 女同性恋一区二区三区| 欧美日韩精品免费观看视频 | 国产精品日韩久久久久| 在线欧美福利| 九九热视频在线免费观看| 亚洲精品一区二区久| 亚洲日本va|