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

久草视频福利在线| 成年丰满熟妇午夜免费视频| 国语对白做受69按摩| 成人精品影院| 日韩一卡二卡三卡国产欧美| 日本免费a视频| 神马电影在线观看| 久久精品99久久久| 北条麻妃久久精品| 欧美性生交xxxxx| 日韩av中字| 中文字幕亚洲区| 国产精品免费一区二区| 亚洲精品91天天久久人人| 天天操综合网| 亚洲欧美国产一本综合首页| 亚洲制服中文字幕| 国产传媒在线观看| 最新国产成人在线观看| 精品91免费| 一本色道久久综合熟妇| 日韩香蕉视频| 久久亚洲精品一区| 一区二区三区伦理片| 中文字幕久久精品一区二区| 在线观看视频欧美| 日韩一级性生活片| 九色porny在线| 91麻豆精品秘密| 999国产在线| 国产情侣免费视频| 日韩午夜电影| 欧美国产在线视频| 国产精品夜夜夜爽阿娇| 九色成人国产蝌蚪91| 日韩美女视频在线| 波多野结衣国产精品| 粉嫩一区二区| 亚洲大片在线观看| 伊人久久在线观看| 一本一道波多野毛片中文在线| 99视频一区二区| 99久久一区三区四区免费| 中文字幕+乱码+中文乱码91| 亚洲一区激情| 98精品在线视频| 国产一级片免费| 亚洲国产精品成人| 日韩有码片在线观看| 成人黄色a级片| 蜜桃tv一区二区三区| 亚洲精品美女在线观看播放| av天堂一区二区| 视频精品一区二区三区| 欧美一区二区视频在线观看2022| 天堂在线资源视频| 四虎成人在线| 欧美自拍偷拍一区| 亚洲性生活网站| 欧美magnet| 色综合一区二区| 激情综合在线观看| 性xxxxfreexxxxx欧美丶| 精品国产乱码久久久久久婷婷| 欧妇女乱妇女乱视频| 中文字幕中文字幕在线十八区| 亚洲欧美日韩一区| 日本黄网站色大片免费观看| 伊人电影在线观看| 一区二区三区国产豹纹内裤在线| 国产免费内射又粗又爽密桃视频| gogogogo高清视频在线| 一区二区三区中文字幕电影| 精品国偷自产一区二区三区| av老司机在线观看| 日韩欧美999| 网站一区二区三区| 伊人久久大香| 精品少妇一区二区| av在线播放网址| 亚洲伊人春色| 亚洲最大在线视频| 亚洲 欧美 变态 另类 综合| 欧美一区网站| 91av在线影院| 亚洲av综合一区| 国产一区在线视频| 精品久久久久久乱码天堂| 秋霞av在线| 中文在线一区二区| 成人短视频在线观看免费| 92久久精品| 在线观看免费成人| 中文字幕55页| 精品综合久久88少妇激情| 亚洲欧洲第一视频| 国产成人综合在线视频| 亚洲黑丝一区二区| 国产精品久久久久久久9999 | 欧美日韩国产专区| 手机在线免费观看毛片| 日韩一二三区| 亚洲人成在线观看| 国产福利久久久| 日本亚洲视频在线| 国产视频在线观看一区| 337p日本欧洲亚洲大胆鲁鲁| 亚洲福利视频三区| 尤物国产在线观看| 欧美黄色录像| 久久人人爽人人爽爽久久| 亚洲国产成人精品激情在线| 久久99热国产| 欧美精品免费观看二区| 黄色免费在线看| 日本道精品一区二区三区| 韩国av中国字幕| 日韩久久精品网| 2019中文字幕免费视频| 99国产精品一区二区三区| 国产亚洲欧美在线| 激情五月宗合网| 精品国产三区在线| 在线观看成人黄色| 久久久精品福利| 成人ar影院免费观看视频| 一区二区三区四区欧美日韩| gay欧美网站| 亚洲第一精品福利| 一区二区成人免费视频| 免费观看在线综合| 久久99精品久久久久久秒播放器| 羞羞的视频在线看| 欧美乱妇15p| 国产亚洲精品熟女国产成人| 男人的天堂亚洲| 国产女主播一区二区三区| 91最新在线视频| 6080yy午夜一二三区久久| 无码人妻丰满熟妇啪啪欧美| 国产精品人人爽人人做我的可爱 | 日韩美女毛片| 国产69精品久久久久9999| 亚洲第一第二区| 亚洲人成网站在线| 91网址在线观看精品| 久久国产成人午夜av影院宅| 国产精品高潮呻吟久久av野狼| 日韩av视屏| 欧美视频在线免费看| 超碰男人的天堂| 在线精品亚洲| 国产美女99p| 国产高清自产拍av在线| 亚洲第一精品夜夜躁人人躁 | 日本韩国精品一区二区在线观看| 内射中出日韩无国产剧情| 99在线精品免费视频九九视| 精品一区二区三区日本| 性爽视频在线| 亚洲色图欧美制服丝袜另类第一页| 一级片在线观看免费| 久久久五月婷婷| 99视频在线免费| 成人情趣视频| 成人午夜在线观看| 99热国产在线| 亚洲国产成人精品久久| 欧美videossex极品| 久久婷婷国产综合国色天香| 91网址在线播放| 日本精品三区| 91精品视频网站| 青春草视频在线| 日韩成人网免费视频| 中文字幕国产在线观看| 国产视频一区二区在线观看| 成人黄色一级大片| 欧美三区在线| 久久人人97超碰人人澡爱香蕉| 自拍偷自拍亚洲精品被多人伦好爽| 国产一区二区动漫| 国产绳艺sm调教室论坛| 亚洲大片在线观看| 亚洲精品91在线| 国产一区二区三区蝌蚪| 欧美成人高潮一二区在线看| 国产成人精品免费视| 成人欧美一区二区三区黑人孕妇| 亚洲综合影视| 亚洲码在线观看| 96日本xxxxxⅹxxx17| 亚洲国产精品一区二区www| 免费看污黄网站在线观看| 老司机精品视频一区二区三区| 日韩精品手机在线观看| 亚洲激情播播| 91最新国产视频| 制服丝袜专区在线| 久久成人免费视频| 男男电影完整版在线观看| 欧美日本一道本在线视频| 久草视频精品在线| 国产精品久久久久久久久久免费看| 日批视频免费看| 日本午夜精品视频在线观看| 成人精品视频在线播放| 色综合久久网| 久久久久久久久久码影片| www一区二区三区| 日本精品久久中文字幕佐佐木| а√中文在线8| 一本色道久久88综合亚洲精品ⅰ | 欧美电影免费观看| 欧美日韩高清在线观看| 91caoporm在线视频| 日韩av在线最新| 999av视频| 欧美在线免费视屏| www成人在线| 一区二区三区精品| 日韩在线视频免费看| 久久久国产精品麻豆| 黑人玩弄人妻一区二区三区| 精品一区二区三区在线观看| 欧美两根一起进3p做受视频| 日韩午夜高潮| 青青青在线视频播放| 久久久久久影院| 午夜欧美性电影| 亚欧日韩另类中文欧美| 国产麻豆日韩| 国产伦精品一区二区三区免费优势 | 欧美污视频久久久| 免费福利视频一区| 风间由美一区二区三区| 欧美视频二区欧美影视| 成人黄色免费网站在线观看| 欧美一级二级视频| 国产精品久久99久久| 韩日成人影院| 日本一本a高清免费不卡| yellow字幕网在线| 久久久亚洲天堂| 成人高潮aa毛片免费| 欧美日韩国产第一页| 污污影院在线观看| 久久99亚洲热视| 在线观看男女av免费网址| 久久天天躁狠狠躁夜夜av| 欧美激情午夜| 日韩中文在线视频| 欧美人xxx| 久久久精品网站| 超碰caoporn久久| 欧美大秀在线观看| 欧美xxxx视频| 久久久视频在线| 欧产日产国产精品视频| 庆余年2免费日韩剧观看大牛| 亚洲女色av| 国产精品久久久精品| 国产91欧美| 亚洲r级在线观看| 一区二区三区在线免费看| 国产精品美女xx| 日韩伦理一区二区三区| 日韩免费av一区二区三区| 色爱综合网欧美| 男人j进女人j| 亚洲视频精品| 国产网站免费在线观看| 老司机午夜精品视频| 日本肉体xxxx裸体xxx免费| 国产在线国偷精品产拍免费yy| 一级全黄裸体片| 久久久综合视频| 韩国一级黄色录像| 亚洲第一福利一区| 色婷婷久久综合中文久久蜜桃av| 欧美精品自拍偷拍动漫精品| 亚洲黄色小说网址| 亚洲欧美在线x视频| 日本福利专区在线观看| 欧美激情综合亚洲一二区| 亚洲欧洲高清| 91系列在线观看| 欧美挤奶吃奶水xxxxx| 午夜老司机精品| 亚洲国产第一| xx欧美撒尿嘘撒尿xx| 成人福利电影精品一区二区在线观看| 亚洲精品成人无码熟妇在线| 亚洲色图另类专区| 久久久久女人精品毛片九一 | 天天操天天干天天做| 成人福利电影精品一区二区在线观看| 中文字幕av久久爽一区| 亚洲一区二区三区美女| 老熟妇一区二区三区啪啪| 日韩亚洲欧美成人一区| 精品美女视频在线观看免费软件| 久久影院在线观看| av高清一区| 国产精品免费在线| 久久人体视频| 男人揉女人奶房视频60分| 国产曰批免费观看久久久| 白白色免费视频| 亚洲尤物视频在线| 亚洲在线视频播放| 亚洲精品美女久久| 成人ww免费完整版在线观看| 国产97人人超碰caoprom| 澳门精品久久国产| 美女黄色片网站| 免费高清在线视频一区·| 久久久久麻豆v国产精华液好用吗| 亚洲日本在线看| 国产污视频网站| 日韩精品在线观看一区| 亚洲男同gay网站| 国产欧美精品一区二区三区介绍| 亚洲人成精品久久久| 国产精品www在线观看| 国产精品一级片| 亚洲不卡在线播放| 欧美视频完全免费看| 欧美91精品久久久久国产性生爱| 性色av一区二区三区红粉影视| 精品国产不卡一区二区| 婷婷视频在线播放| 另类专区欧美蜜桃臀第一页| 极品人妻videosss人妻| 色一情一乱一乱一91av| 视频在线不卡| 欧美在线视频一区二区| 日韩精选在线| 久久精品.com| 99re8在线精品视频免费播放| 国产精品23p| 欧美成人性福生活免费看| 91cn在线观看| 91观看网站| 国产精品mm| 91精品人妻一区二区三区四区| 亚洲精品中文在线| www.五月婷婷| 国内精品小视频在线观看| 加勒比色老久久爱综合网| 丰满少妇久久久| 91麻豆国产福利精品| 日韩欧美三级视频| 亚洲天堂2020| 国产资源一区| 精品国产三级a∨在线| 国产精品伊人色| 国产一级视频在线| 日韩成人在线视频网站| 日韩精品极品| 日韩激情久久| 久久精品国产网站| 草视频在线观看| 亚洲精品一区二区三区福利| 日韩伦理精品| 色噜噜狠狠一区二区三区| 久久精品国产精品亚洲综合| 日本高清不卡免费| 亚洲国产成人精品一区二区 | 中文字幕在线视频播放| 欧美日韩国产专区| sese一区| 不卡一区二区三区四区五区| 99日韩精品| 影音先锋制服丝袜| 日韩一区二区影院| 色是在线视频| 日本成人看片网址| 狠狠色丁香九九婷婷综合五月| 国产性生活网站| 亚洲欧美一区二区三区四区 | 黄色网页在线免费看| 国产青春久久久国产毛片| 日韩中文字幕麻豆| 日本a级片视频| 亚洲国产欧美久久| 人人精品久久| 国产aaa免费视频| 中文字幕乱码一区二区免费| 99国产精品久久久久久久成人 | 国产亚洲欧美日韩精品一区二区三区| 久久国产精品免费观看| 2024国产精品| 99riav国产| 国产精品wwww| 欧美日韩亚洲国产精品| 阿v天堂2014| 亚洲国产福利在线| 日韩午夜视频在线| 欧美在线观看成人|