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

Retry & Fallback 是利器還是魔咒?

開發(fā) 前端
Retry 就是在調(diào)用遠程接口失敗時,Client 主動發(fā)起重試請求,以期待獲得最終結(jié)果,從而完成整個流程。

1. 概覽

在分布式場景中,Retry 和 Fallback 是最常見的容災方案。

  • Retry 就是在調(diào)用遠程接口失敗時,Client 主動發(fā)起重試請求,以期待獲得最終結(jié)果,從而完成整個流程
  • Fallback 是在調(diào)用遠程接口失敗時,Client 不進行重試而是調(diào)用一個特殊的 fallback 方法,從這個方法中獲取結(jié)果,使流程能夠繼續(xù)下去

那 Retry 和 Fallback 該怎么抉擇呢?

1.1. 背景

首先,先看下 Retry 和 Fallback 都是怎么幫助流程進行自我恢復的。

1.1.1. Retry

現(xiàn)在有一個生產(chǎn)流程:

核心流程如下:

  • 從商品服務中獲取商品信息
  • 根據(jù)商品信息創(chuàng)建訂單
  • 將訂單保存到數(shù)據(jù)庫

如果發(fā)生網(wǎng)絡抖動,將導致生產(chǎn)失敗。

  • 在調(diào)用商品服務獲取商品時,由于網(wǎng)絡異常,接口調(diào)用失敗
  • 由于無法獲取商品信息,生產(chǎn)流程被異常中斷

由于上產(chǎn)流程太過重要,系統(tǒng)需盡最大努力保障用戶能夠完成下單操作,那針對網(wǎng)絡抖動這個問題,可以通過 Retry 進行修復。

image

  • 在第一次獲取商品信息時,由于網(wǎng)絡問題導致獲取失敗
  • 系統(tǒng)不會直接拋出異常,而是在等待一段時間后,重新發(fā)起第二次請求,也就是 Retry 操作
  • 網(wǎng)絡恢復,第二次請求成功獲取商品信息
  • 流程繼續(xù)運行,最終完成用戶生產(chǎn)

Retry 機制非常適合服務短時間不可用,或某個服務節(jié)點異常 這類場景。

1.1.2. Fallback

一個生產(chǎn)驗證接口,主流程如下:

  • 調(diào)用商品服務的接口獲取商品信息
  • 根據(jù)商品和用戶信息判斷用戶是否能夠購買該商品

同樣,假設在訪問商品服務時出現(xiàn)網(wǎng)絡異常:

由于無法獲取商品信息,從而導致整個驗證流程被異常中斷,用戶操作被迫終止。

聰明的你估計會說那就使用 Retry 呀,是的:

如果是短時不可用,通過 Retry 機制便可以恢復流程。

但,如果是商品服務壓力過大,響應時間過長呢?比如,商品服務流量激增,導致 DB CPU 飆升,出現(xiàn)大量的慢 SQL,這時觸發(fā)了系統(tǒng)的 Retry 會是怎樣?

image

  • 在獲取商品失敗后,系統(tǒng)自動觸發(fā) Retry 機制
  • 由于是商品服務本身出了問題,第二次請求仍舊失敗
  • 服務又觸發(fā)了第三次請求,仍未獲取結(jié)果
  • 達到最大重試次數(shù),仍舊無法獲取商品,只能通過異常中斷用戶請求

通過 Retry 機制未能將流程從異常中恢復過來,也給下游的 商品服務 造成了巨大傷害。

  • 商品服務壓力大,響應時間長
  • 上游系統(tǒng)由于超時觸發(fā)自動重試
  • 自動重試增大了對商品服務的調(diào)用
  • 商品服務請求量更大,更難以從故障中恢復

這就是常說的“讀放大”,假設用戶驗證是否能夠購買請求的請求量為 n,那極端情況下 商品服務的請求量為 3n (其中 2n 是由 Retry 機制造成)

此時,Retry 就不是一個好的方案。我們先退回業(yè)務場景進行思考,如果無法獲取商品,驗證接口是否可以直接放行,先讓用戶完成購買?

如果,這個業(yè)務假設能夠接受的話,那就到了 Fallback 上場的時候了。

  • 調(diào)用商品服務獲取商品信息失敗
  • 系統(tǒng)不會進行重試,而是觸發(fā) fallback 機制
  • fallback 會調(diào)用指定的一個方法,并將返回值作為遠程接口的返回值
  • 接下來的流程使用 fallback 方法的返回值完成業(yè)務邏輯

1.1.3. 場景思考

同樣是對商品服務接口(同一個接口)的調(diào)用,在不同的場景需要使用不同的策略用以恢復業(yè)務流程,通常情況下:

  1. Command 場景優(yōu)先使用 Retry
  2. 這種流量極為重要,最好能保障流程的完整性
  3. 通常寫流量比較小,小范圍 Retry 不會對下游系統(tǒng)造成巨大影響
  4. Query 場景優(yōu)選使用 Fallabck
  5. 大多數(shù)展示場景,哪怕部分信息沒有獲取到對整體的影響也比較小
  6. 通常讀場景流量較高,Retry 對下游系統(tǒng)的傷害不容忽視

那面對一個遠程接口被多個場景使用,我們該怎么處理呢?

  1. 提供兩組接口,一個具有 Retry 能力,一個具有 Fallback 能力,由使用方根據(jù)業(yè)務場景進行選擇?
  2. 還是…

1.2. 目標

  1. 遠程接口具備 Retry 和 Fallback 能力
  2. 能夠根據(jù)上下文不同場景,在發(fā)生調(diào)用異常時動態(tài)選擇 Retry 或 Fallback 進行流程恢復

2. 快速入門

2.1. 準備環(huán)境

項目主要依賴 spring retry 和 lego starter
首先,引入 spring-retry 依賴

<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

此次,引入 lego-starter 依賴

<dependency>
<groupId>com.geekhalo.lego</groupId>
<artifactId>lego-starter</artifactId>
<version>0.1.17</version>
</dependency>

最后新建 RetryConfiguration 以開啟 Retry 能力

@EnableRetry
@Configuration
public class RetryConfiguration {
}

2.2. 構(gòu)建 ActionTypeProvider

在完成基本配置后,需要準備一個 ActionTypeProvider 用以提供上下文信息。
ActionTypeProvider 接口定義如下:

public interface ActionTypeProvider {
ActionType get();
}
public enum ActionType {
COMMAND, QUERY
}

通常情況下,我們會使用 ThreadLocal 組件將 ActionType 存儲于線程上下文,在使用時從上下中獲取相關信息。

public class ActionContext {
private static final ThreadLocal<ActionType> ACTION_TYPE_THREAD_LOCAL = new ThreadLocal<>();
public static void set(ActionType actionType){
ACTION_TYPE_THREAD_LOCAL.set(actionType);
}
public static ActionType get(){
return ACTION_TYPE_THREAD_LOCAL.get();
}
public static void clear(){
ACTION_TYPE_THREAD_LOCAL.remove();
}
}

有了上下文之后,
ActionBasedActionTypeProvider 直接從 Context 中獲取 ActionType 具體如下

@Component
public class ActionBasedActionTypeProvider implements ActionTypeProvider {
@Override
public ActionType get(){
return ActionContext.get();
}
}

上下文中的 ActionType 又是怎么進行管理的呢,包括信息綁定和信息清理?
最常用的方式便是:

  • 提供一個注解,在方法上添加注解用于對 ActionType 的配置;
  • 提供一個攔截器,對方法調(diào)用進行攔截。方法調(diào)用前,從注解中獲取配置信息并綁定到上下文;方法調(diào)用后,主動清理上下文信息;

核心實現(xiàn)為:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Action {
ActionType type();
}
@Aspect
@Component
@Order(Integer.MIN_VALUE)
public class ActionAspect {
@Pointcut("@annotation(com.geekhalo.lego.faultrecovery.smart.Action)")
public void pointcut() {
}
@Around(value = "pointcut()")
public Object action(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Action annotation = methodSignature.getMethod().getAnnotation(Action.class);
ActionContext.set(annotation.type());
try {
return joinPoint.proceed();
}finally {
ActionContext.clear();
}
}
}

在這些組件的幫助下,我們只需在方法上基于 @Action 注解進行標記,便能夠?qū)?ActionType 綁定到上下文。

2.3. 使用 @SmartFault

在將 ActionType 綁定到上下文之后,接下來要做的便是對 遠程接口 進行配置。遠程接口的配置工作主要由 @SmartFault 來完成。
其核心配置項包括:

配置項

含義

默認配置

recover

fallback 方法名稱


maxRetry

最大重試次數(shù)

3

include

觸發(fā)重試的異常類型


exclude

不需要重新的異常類型


接下來,看一個 demo

@Service
@Slf4j
@Getter
public class RetryService3 {
private int count = 0;
private int retryCount = 0;
private int fallbackCount = 0;
private int recoverCount = 0;
public void clean(){
this.retryCount = 0;
this.fallbackCount = 0;
this.recoverCount = 0;
}
/**
* Command 請求,啟動重試機制
*/
@Action(type = ActionType.COMMAND)
@SmartFault(recover = "recover")
public Long retry(Long input) throws Throwable{
this.retryCount ++;
return doSomething(input);
}
/**
* Query 請求,啟動Fallback機制
*/
@Action(type = ActionType.QUERY)
@SmartFault(recover = "recover")
public Long fallback(Long input) throws Throwable{
this.fallbackCount ++;
return doSomething(input);
}
@Recover
public Long recover(Throwable e, Long input){
this.recoverCount ++;
log.info("recover-{}", input);
return input;
}
private Long doSomething(Long input) {
// 偶數(shù)拋出異常
if (count ++ % 2 == 0){
log.info("Error-{}", input);
throw new RuntimeException();
}
log.info("Success-{}", input);
return input;
}
}

測試代碼如下:

@SpringBootTest(classes = DemoApplication.class)
public class RetryService3Test {
@Autowired
private RetryService3 retryService;
@BeforeEach
public void setup(){
retryService.clean();
}
@Test
public void retry() throws Throwable{
for (int i = 0; i < 100; i++){
retryService.retry(i + 0L);
}
Assertions.assertTrue(retryService.getRetryCount() > 0);
Assertions.assertTrue(retryService.getRecoverCount() == 0);
Assertions.assertTrue(retryService.getFallbackCount() == 0);
}
@Test
public void fallback() throws Throwable{
for (int i = 0; i < 100; i++){
retryService.fallback(i + 0L);
}
Assertions.assertTrue(retryService.getRetryCount() == 0);
Assertions.assertTrue(retryService.getRecoverCount() > 0);
Assertions.assertTrue(retryService.getFallbackCount() > 0);
}
}

運行 retry 測試,日志如下:

[main] c.g.l.c.f.smart.SmartFaultExecutor       : action type is COMMAND
[main] c.g.l.faultrecovery.smart.RetryService3 : Error-0
[main] c.g.l.c.f.smart.SmartFaultExecutor : Retry method public java.lang.Long com.geekhalo.lego.faultrecovery.smart.RetryService3.retry(java.lang.Long) throws java.lang.Throwable use [0]
[main] c.g.l.faultrecovery.smart.RetryService3 : Success-0

可見,當 action type 為 COMMAND 時:

  • 第一次調(diào)用時,觸發(fā)異常,打印: Error-0
  • 此時 SmartFaultExecutor 主動進行重試,打印: Retry method xxxx
  • 方法重試成功,RetryService3 打印: Success-0

方法主動進行重試,流程從異常中恢復,處理過程和效果符合預期。

運行 fallback 測試,日志如下:

[main] c.g.l.c.f.smart.SmartFaultExecutor       : action type is QUERY
[main] c.g.l.faultrecovery.smart.RetryService3 : Error-0
[main] c.g.l.c.f.smart.SmartFaultExecutor : recover From ERROR for method ReflectiveMethodInvocation: public java.lang.Long com.geekhalo.lego.faultrecovery.smart.RetryService3.fallback(java.lang.Long) throws java.lang.Throwable; target is of class [com.geekhalo.lego.faultrecovery.smart.RetryService3]
[main] c.g.l.faultrecovery.smart.RetryService3 : recover-0

可見,當 action type 為 QUERY 時:

  • 第一次調(diào)用時,觸發(fā)異常,打印: Error-0
  • SmartFaultExecutor 執(zhí)行 Fallback 策略,打印:recover From ERROR for method xxxx
  • 調(diào)用RetryService3的 recover 方法,獲取最終返回值。RetryService3 打印:recover-0

異常后自動執(zhí)行 fallback,將流程從異常中恢復過來,處理過程和效果符合預期。

3. 設計&擴展

3.1 核心設計

image

整體流程如下:

  • ActionAspect 從 @Action 中讀取配置信息,將請求類型綁定到線程上下文
  • 然后執(zhí)行正常業(yè)務邏輯
  • 當調(diào)用 @SmartFault 注解的方法時,會被 SmartFaultMethodInterceptor 攔截器攔截
  1. 攔截器通過 ActionTypeProvider 獲取當前的 ActionType
  2. 根據(jù) ActionType 對請求進行路由
  3. 如果是 COMMAND 操作,將使用 RetryTemplate 執(zhí)行請求,在發(fā)生異常時,通過重試配置進行請求重發(fā),從而最大限度的獲得遠程結(jié)果
  4. 如果是 QUERY 操作,將使用 FallbackTemplate(重試次數(shù)為0的 RetryTemplate)執(zhí)行請求,當發(fā)生異常時,調(diào)用 fallback 方法,執(zhí)行配置的 recover 方法,直接使用返回結(jié)果
  • 獲取遠程結(jié)果后,執(zhí)行后續(xù)的業(yè)務邏輯
  • 最后,ActionAspect 將 ActionType 從線程上下文中移除

4. 項目信息

項目倉庫地址:https://gitee.com/litao851025/lego

項目文檔地址:https://gitee.com/litao851025/lego/wikis/support/smart-fault

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2012-10-09 09:14:47

2013-03-06 16:06:31

2021-07-14 15:27:27

論文神器數(shù)據(jù)

2020-09-21 06:53:41

NoSQL高并發(fā)面試

2009-01-15 09:43:00

網(wǎng)絡病毒斷網(wǎng)

2012-09-24 15:26:56

云計算XTools

2012-05-22 11:20:07

虛擬化VDI

2024-02-04 08:05:48

DataX阿里云開源

2020-06-16 09:45:59

CIO上系統(tǒng)IT管理

2012-06-18 15:12:58

云存儲

2012-06-20 09:22:14

云存儲

2018-11-15 15:03:59

安全運營中心SOC數(shù)據(jù)泄露

2020-03-21 16:10:00

物聯(lián)網(wǎng)IoT風險

2013-08-22 10:10:31

2011-07-01 12:16:41

移動ERP

2011-07-29 14:19:12

2024-09-30 11:32:06

2011-08-12 09:35:27

Java 7

2013-07-15 13:42:34

手機游戲生命周期

2015-04-29 14:34:10

曙光刀片服務器整機柜
點贊
收藏

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

欧美综合在线视频| 久久久久亚洲综合| 欧美激情按摩在线| 无码一区二区精品| 97欧美成人| 一区二区三区美女| 日本亚洲自拍| 国产剧情久久久| 一区二区毛片| 精品国产网站地址| 波多野结衣影院| 日韩成人一区| 欧美性xxxx极品hd满灌| 一区二区三区日韩视频| 天天综合在线视频| 麻豆精品国产传媒mv男同| 久99九色视频在线观看| 变态另类ts人妖一区二区| 日韩激情综合| 色婷婷久久综合| 日韩成人手机在线| 亚洲乱亚洲乱妇| 97se亚洲国产综合在线| 亚洲va欧美va国产综合久久| 久草视频一区二区| 国模一区二区三区| 久久精品青青大伊人av| 搡老熟女老女人一区二区| 国产精品日本一区二区三区在线| 欧美色欧美亚洲高清在线视频| 精品嫩模一区二区三区| av在线中文| 99精品久久只有精品| 91亚洲永久免费精品| 在线免费观看国产精品| 亚洲美女视频在线免费观看| 久久亚洲一区二区三区四区五区高 | 黄色av网站在线看| av亚洲精华国产精华| 91亚洲一区精品| 亚洲综合网av| 蜜桃传媒麻豆第一区在线观看| 欧美一级在线亚洲天堂| 久久精品视频久久| 欧美视频网站| 欧美成人中文字幕| 一级片黄色录像| 激情综合网五月| 亚洲人成电影网站| 性高潮久久久久久久| 精品一区三区| 国产亚洲精品久久久久久| 精品人妻一区二区三区视频| 另类图片第一页| 亚洲国产精品va在看黑人| 四虎精品一区二区| 老司机凹凸av亚洲导航| 日韩精品中文字幕在线| 中文字幕一区二区人妻在线不卡| 日韩aaa久久蜜桃av| 亚洲精品久久久久国产| 李丽珍裸体午夜理伦片| 国偷自产av一区二区三区| 亚洲黄色成人网| 黄色免费视频网站| 日韩精品福利一区二区三区| 亚洲免费影视第一页| 特级西西www444人体聚色| 精品视频亚洲| 久久精品国产亚洲7777| 成熟的女同志hd| 激情视频一区| 欧洲s码亚洲m码精品一区| 一本一道无码中文字幕精品热| 美女精品在线| 91情侣偷在线精品国产| 亚洲国产福利视频| 91免费国产在线观看| 午夜老司机精品| 国产在线免费观看| 亚洲视频在线一区观看| 久久国产午夜精品理论片最新版本| 亚洲美女尤物影院| 欧美日韩久久久一区| 伦伦影院午夜理论片| 青青视频一区二区| 中文字幕亚洲精品| 久草资源在线视频| 久久久久久网| 91久久精品国产91久久性色tv| 污视频在线免费观看| 国产精品人人做人人爽人人添 | 99re热久久这里只有精品34| ...av二区三区久久精品| 国产精品入口芒果| 国产三级一区| 亚洲国内精品视频| 午夜精品久久久久99蜜桃最新版| 国产精品a久久久久| 国产91免费看片| 成人黄色在线观看视频| 国产亚洲精品久| 成人一级生活片| 精品裸体bbb| 亚洲精品美女久久久| 熟女少妇a性色生活片毛片| 亚洲美女少妇无套啪啪呻吟| 成人性生交xxxxx网站| 欧美视频综合| 亚洲一区二区视频在线观看| 色婷婷狠狠18| 日韩极品在线| 国内精品美女av在线播放| 亚洲一级片免费看| 久久日一线二线三线suv| 久久最新免费视频| 成人在线网站| 亚洲精品电影网| 久久久久无码精品国产| 美女免费视频一区二区| 你懂的网址一区二区三区| 影音先锋中文在线视频| 欧美另类变人与禽xxxxx| 精品少妇一区二区三区免费观| 欧美三区美女| 91视频免费网站| 婷婷免费在线视频| 在线影院国内精品| 国产美女精品久久| 亚洲精品乱码| 国产一区视频观看| 欧美韩日亚洲| 日韩欧美视频一区| 爱爱视频免费在线观看| 久久超碰97中文字幕| 日本一区二区三区视频在线观看| 蜜桃av在线播放| 亚洲国产小视频在线观看| 免费三片在线播放| 国产精品88av| 久久久国内精品| 精品一区91| 福利片一区二区| 91麻豆精品久久久久蜜臀 | 欧美高清一级片在线观看| 波多野结衣之无限发射| 99久久香蕉| 欧美激情区在线播放| 丰满熟女一区二区三区| 亚洲一区二区三区四区中文字幕 | 91在线观看污| 777久久久精品一区二区三区 | 日韩电影大片中文字幕| 日本中文字幕网| av不卡免费电影| 99re在线视频免费观看| 不卡在线一区| 国产一区香蕉久久| 成人黄视频在线观看| 日韩欧美中文字幕公布| 久久久久成人片免费观看蜜芽 | 日韩视频在线观看免费视频| 喷水一区二区三区| 中文字幕在线亚洲精品 | 欧美一区二视频| 精品无码人妻一区二区三区| 成人午夜免费电影| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 天天干,天天干| 国产精品欧美综合在线| 欧美国产日韩在线视频| 欧美三级第一页| 久久国产精品免费一区| 欧美va视频| 欧美成人在线网站| 五月激情婷婷综合| 欧美偷拍一区二区| 中文字幕在线有码| 91视频你懂的| 国内自拍第二页| 亚洲人人精品| 一区二区三区四区五区精品| 大奶一区二区三区| 国产精品18久久久久久首页狼| 色影院视频在线| 精品国精品国产尤物美女| 激情五月婷婷网| 亚洲精品视频在线| 久久久亚洲av波多野结衣| 韩国欧美国产一区| 国产资源在线视频| 99re66热这里只有精品8| 国产精品久久亚洲7777| 亚州一区二区三区| 欧美精品videosex性欧美| 国产视频二区在线观看| 精品少妇一区二区三区在线视频| 91视频久久久| 香港成人在线视频| 国产麻豆视频在线观看| 久久久久久久综合色一本| 制服下的诱惑暮生| 日本人妖一区二区| 成人午夜免费在线| 亚洲欧洲中文字幕| 日本精品一区二区| 国产精品一线| 亚洲一区美女视频在线观看免费| 另类图片综合电影| 97国产精品免费视频| 成人影院在线看| 尤物九九久久国产精品的特点 | 国产精品狼人久久影院观看方式| 强迫凌虐淫辱の牝奴在线观看| 国精产品一区一区三区mba桃花| 久久精品免费一区二区| 亚洲一级特黄| 免费看黄色a级片| 99精品全国免费观看视频软件| 久久精品午夜一区二区福利| ccyy激情综合| 91福利视频导航| 在线免费成人| 国产精品久久久久久久久久东京| 嗯~啊~轻一点视频日本在线观看| 久久黄色av网站| 最新电影电视剧在线观看免费观看| 日韩精品一区二区视频| 无码精品一区二区三区在线| 亚洲精品一线二线三线| 国产高清在线免费| 911精品国产一区二区在线| 这里只有精品国产| 欧洲激情一区二区| 国产精品第六页| 在线看国产一区二区| 国产午夜麻豆影院在线观看| 色综合av在线| 亚洲天堂视频在线播放| 日本韩国精品在线| 波多野结衣大片| 欧美在线观看一二区| 免费在线观看av的网站| 欧美影院午夜播放| 在线视频 中文字幕| 欧美亚洲动漫另类| 中文字幕日日夜夜| 欧美在线不卡一区| 中文字幕在线观看第二页| 欧美综合一区二区三区| 亚洲av综合一区| 欧美手机在线视频| 国产精品视频久久久久久| 欧美一区二区私人影院日本| www.97av| 亚洲精品二三区| 青青草在线免费观看| 亚洲片在线资源| 日本高清视频在线播放| 欧美成人精品h版在线观看| 青青青草视频在线| 国内精品一区二区三区| 亚洲色图官网| 国产女人精品视频| 亚洲成人五区| 久久久久成人精品免费播放动漫| 欧美人与物videos另类xxxxx| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 夜夜精品视频一区二区| 日本一级淫片色费放| 在线观看成人免费视频| 99久久久国产精品无码免费| 精品免费国产二区三区| 人成在线免费视频| 最近2019中文字幕在线高清| 污污视频在线看| 欧美亚洲另类在线| 久久人体av| 丁香五月网久久综合| 亚洲三级网址| 中文字幕乱码一区二区三区| 精品电影一区| 亚洲 欧美 日韩系列| 国产精品99久久久久久久vr| av直播在线观看| 日韩美女视频一区二区| 国产成人愉拍精品久久| 欧美少妇bbb| 你懂的网站在线| 色噜噜狠狠狠综合曰曰曰88av | 国产精品麻豆va在线播放| 96sao精品免费视频观看| 久久99国产精品99久久| 91日韩免费| 国产特级黄色大片| 韩国v欧美v亚洲v日本v| 人妻丰满熟妇aⅴ无码| 亚洲人成网站色在线观看| 中文字幕精品无码一区二区| 欧美丰满高潮xxxx喷水动漫| 青草久久伊人| 欧美激情亚洲综合一区| 日韩成人一区| 欧美日韩三区四区| 国色天香一区二区| 在线免费视频一区| 99视频在线观看一区三区| 亚洲 欧美 变态 另类 综合| 色综合色狠狠综合色| 性一交一乱一色一视频麻豆| 中文字幕最新精品| 周于希免费高清在线观看 | 亚洲丝袜啪啪| 日本wwwcom| 国产美女精品一区二区三区| 日本少妇xxxxx| 欧美日韩免费网站| 国产91麻豆视频| 精品中文字幕视频| 国产精品伦一区二区| 蜜桃麻豆www久久国产精品| 欧美日韩爆操| 激情 小说 亚洲 图片: 伦| 久久欧美一区二区| 99久在线精品99re8热| 日韩欧美电影一区| 69成人在线| 91免费国产视频| 国产精品久久久久久久久久10秀| 青青青国产在线视频| 久久综合九色综合97_久久久 | 色婷婷久久久亚洲一区二区三区 | 99精品欧美一区二区三区综合在线| 午夜免费激情视频| 7777精品伊人久久久大香线蕉经典版下载 | 三级精品视频| 每日在线更新av| 99re这里只有精品视频首页| 日本少妇激情舌吻| 亚洲国产小视频在线观看| 大桥未久在线视频| 免费影院在线观看一区| 久久一区视频| 51妺嘿嘿午夜福利| 欧美制服丝袜第一页| 超碰国产在线观看| 国产精品久久久久秋霞鲁丝| 欧美偷拍自拍| 日本中文字幕影院| 国产精品国产三级国产普通话99 | 欧美亚洲日本一区二区三区| 成人一级片网址| 中国一级免费毛片| 亚洲日本欧美中文幕| 先锋欧美三级| 中国一级黄色录像| 国产精品91xxx| 国产精品xxxx喷水欧美| 国产丝袜精品第一页| 欧美日韩视频免费观看| 亚洲一区三区在线观看| 国产一区二区三区av电影| 国产亚洲欧美久久久久| 日韩精品久久久久| 成人自拍av| 中文一区一区三区免费| 成人一区二区三区视频| 国产午夜性春猛交ⅹxxx| 亚洲精品一区二区久| av在线播放一区| 青青视频免费在线观看| 91性感美女视频| 中文字幕av片| 欧美激情精品久久久| 亚洲人和日本人hd| 国产美女视频免费看| 性做久久久久久| 国产精品四虎| 亚洲综合中文字幕在线| 国产日韩高清一区二区三区在线| 欧美人与性囗牲恔配| 69精品人人人人| 僵尸再翻生在线观看免费国语| 日本一区二区精品视频| 国产成人小视频| 国产精品高清无码| 欧美大秀在线观看| 精品一区二区三区中文字幕老牛| 成人高清在线观看视频| 日本道色综合久久| 欧美草逼视频| 亚洲精品日韩精品| bt欧美亚洲午夜电影天堂| 中文字字幕在线中文乱码| 久久久久久久激情视频| 波多野结衣一区| 亚洲欧美日韩偷拍| 欧美群妇大交群的观看方式| 日本三级一区| 欧美国产视频一区|