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

Springboot如何優雅的實現異常重試機制

開發 架構
新增重試任務成功之后,我們可通過調度平臺(比如:xxlJob),定時查詢重試任務表,然后調用RetryTaskDefinitionEnum中定義的重試的Service(RetryServiceName),這里可以定義一個模板方法,根據RetryServiceName,從Spring中獲取到對應的Bean,執行具體的業務方法,然后更新任務狀態和重試次數即可。

一、概述

微服務之間相互調用,難免會出現形形色色的異常,出現異常時有些情況可能需要先落重試任務表,然后通過任務調度等進行定時重試;通過自定義重試注解@Retryable,減少對核心業務代碼入侵,增強代碼可讀性、可維護性。下面通過實戰,開發自定義重試注解@Retryable。諸位可根據業務需要,稍作改造直接使用。

二、實戰

重試任務表定義(retry_task):

CREATE TABLE `retry_task` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵值',
  `business_type_code` varchar(32) COLLATE NOT NULL DEFAULT '' COMMENT '業務類型編碼',
  `business_type_desc` varchar(100) COLLATE NOT NULL DEFAULT '' COMMENT '業務類型描述',
  `retry_service_name` varchar(100) COLLATE NOT NULL DEFAULT '' COMMENT '重試的service名稱',
  `business_param` text COLLATE NOT NULL DEFAULT '' COMMENT '業務參數',
  `wait_retry_times` int(11) NOT NULL DEFAULT 3 COMMENT '待重試次數',
  `already_retry_times` int(11) NOT NULL DEFAULT 0 COMMENT '已重試次數',
  `retry_result_code` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '重試結果碼',
  `retry_result_msg` varchar(255) COLLATE NOT NULL DEFAULT '' COMMENT '重試結果描述',
  `create_user` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '創建人',
  `create_time` datetime NOT NULL COMMENT '創建時間',
  `update_user` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '更新人',
  `update_time` datetime NOT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_business_type_code` (`business_type_code`)
) COMMENT='重試任務表';

重試任務表實體類(RetryTaskEntity):

@Data
public class RetryTaskEntity implements Serializable {

    private static final long serialVersionUID = -1950778520234119369L;

    /**
     * 主鍵值
     */
    private BigInteger id;

    /**
     * 業務類型編碼
     */
    private String businessTypeCode;

    /**
     * 業務類型描述
     */
    private String businessTypeDesc;

    /**
     * 重試的service名稱
     */
    private String retryServiceName;

    /**
     * 業務參數
     */
    private String businessParam;

    /**
     * 待重試的次數
     */
    private Integer waitRetryTimes;

    /**
     * 已重試的次數
     */
    private Integer alreadyRetryTimes;

    /**
     * 重試結果碼
     */
    private String retryResultCode;

    /**
     * 重試結果描述
     */
    private String retryResultMsg;

    /**
     * 創建人
     */
    private String createUser;

    /**
     * 創建時間
     */
    private Date createTime;

    /**
     * 更新人
     */
    private String updateUser;

    /**
     * 更新時間
     */
    private Date updateTime;
}

重試任務表mapper和對應的xml文件:

public interface RetryTaskMapper {
    int addRetryTask(RetryTaskEntity retryTaskEntity);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.boot.demo.mapper.RetryTaskMapper">

    <insert id="addRetryTask" parameterType="com.boot.demo.pojo.RetryTaskEntity">
        INSERT INTO retry_task(business_type_code,
                               business_type_desc,
                               retry_service_name,
                               business_param,
                               wait_retry_times,
                               already_retry_times,
                               retry_result_code,
                               retry_result_msg,
                               create_user,
                               create_time,
                               update_user,
                               update_time)
        VALUES (#{businessTypeCode},
                #{businessTypeDesc},
                #{retryServiceName},
                #{businessParam},
                #{waitRetryTimes},
                #{alreadyRetryTimes},
                #{retryResultCode},
                #{retryResultMsg},
                #{createUser},
                #{createTime},
                #{updateUser},
                #{updateTime})
    </insert>
</mapper>

重試任務表service和對應的serviceImpl:

public interface RetryTaskService {
    void addRetryTask(RetryTaskEntity retryTaskEntity);
}
@Service
public class RetryTaskServiceImpl implements RetryTaskService {

    @Autowired
    private RetryTaskMapper retryTaskMapper;

    @Override
    public void addRetryTask(RetryTaskEntity retryTaskEntity) {
        retryTaskMapper.addRetryTask(retryTaskEntity);
    }
}

業務類型枚舉類(RetryTaskDefinitionEnum):

/**
 * 重試任務枚舉
 */
public enum RetryTaskDefinitionEnum {

    ADD_STOCK("101", "采購入庫成功后新增庫存異常重試", "purchaseService", 3);

    /**
     * 業務類型編碼
     */
    private final String businessTypeCode;

    /**
     * 業務類型描述
     */
    private final String businessTypeDesc;

    /**
     * 重試的service名稱
     */
    private final String retryServiceName;

    /**
     * 重試次數
     */
    private final Integer retryTimes;

    RetryTaskDefinitionEnum(String businessTypeCode, String businessTypeDesc, String retryServiceName, Integer retryTimes) {
        this.businessTypeCode = businessTypeCode;
        this.businessTypeDesc = businessTypeDesc;
        this.retryServiceName = retryServiceName;
        this.retryTimes = retryTimes;
    }

    public static RetryTaskDefinitionEnum getTaskDefinitionByBusinessTypeCode(String businessTypeCode) {
        if (StringUtils.isBlank(businessTypeCode)) {
            return null;
        }
        for (RetryTaskDefinitionEnum taskDefinition : values()) {
            if (taskDefinition.getBusinessTypeCode().equals(businessTypeCode)) {
                return taskDefinition;
            }
        }
        return null;
    }

    public String getBusinessTypeCode() {
        return businessTypeCode;
    }

    public String getBusinessTypeDesc() {
        return businessTypeDesc;
    }

    public String getRetryServiceName() {
        return retryServiceName;
    }

    public Integer getRetryTimes() {
        return retryTimes;
    }
}

自定義注解(@MyRetryable):

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
@Documented
public @interface MyRetryable {
    RetryTaskDefinitionEnum businessType();
}

自定義注解切面(MyRetryableAspect):

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import com.boot.demo.result.Result;
import com.boot.demo.result.ResultCode;
import com.boot.demo.pojo.RetryTaskEntity;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import com.boot.demo.annotation.MyRetryable;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.ProceedingJoinPoint;
import com.boot.demo.service.RetryTaskService;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import com.boot.demo.annotation.RetryTaskDefinitionEnum;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;

@Slf4j
@Aspect
@Component
public class MyRetryableAspect {

    @Autowired
    private RetryTaskService retryTaskService;

    @Pointcut("@annotation(com.boot.demo.annotation.MyRetryable)")
    public void pointCut() {
    }

    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) {
        Result result = null;
        try {
            // 執行目標方法
            result = (Result) joinPoint.proceed();
            // 目標方法返回:成功結果碼(200),則無需重試
            if (ResultCode.SUCCESS.getCode() == result.getCode()) {
                return result;
            }
            // 目標方法返回:非成功結果碼(非200)則需重試(此次可根據需要判斷什么樣的返回碼需要重試)
            dealAddRetryTask(joinPoint);,
            return result;
        } catch (Throwable e) {
            log.error("myRetryableAspectLog error param: {} result: {} e: ", joinPoint.getArgs(), result, e);
            // 此處捕獲異常之后,也可以根據需要重試,這里就僅輸出異常日志
            return result;
        }
    }

    private void dealAddRetryTask(ProceedingJoinPoint joinPoint) {
        // 獲取重試注解信息
        MyRetryable myRetryableAnnotation = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(MyRetryable.class);
        if (null == myRetryableAnnotation) {
            return;
        }
        // 根據業務類型編碼,獲取枚舉中定義的業務類型描述、重試的service、重試次數等信息
        String businessTypeCode = myRetryableAnnotation.businessType().getBusinessTypeCode();
        RetryTaskDefinitionEnum retryTaskDefinition = RetryTaskDefinitionEnum.getTaskDefinitionByBusinessTypeCode(businessTypeCode);
        if (null == retryTaskDefinition) {
            return;
        }
        RetryTaskEntity retryTaskEntity = new RetryTaskEntity();
        retryTaskEntity.setBusinessTypeCode(businessTypeCode);
        retryTaskEntity.setBusinessTypeDesc(retryTaskDefinition.getBusinessTypeDesc());
        retryTaskEntity.setRetryServiceName(retryTaskDefinition.getRetryServiceName());
        retryTaskEntity.setBusinessParam(JSON.toJSONString(joinPoint.getArgs()[0]));
        retryTaskEntity.setWaitRetryTimes(retryTaskDefinition.getRetryTimes());
        retryTaskEntity.setAlreadyRetryTimes(0);
        retryTaskEntity.setRetryResultCode("");
        retryTaskEntity.setRetryResultMsg("");
        retryTaskEntity.setCreateUser("SYS");
        retryTaskEntity.setCreateTime(new Date());
        retryTaskEntity.setUpdateUser("SYS");
        retryTaskEntity.setUpdateTime(new Date());
        retryTaskService.addRetryTask(retryTaskEntity);
    }
}

基礎類(Result、ResultCode、ResultGenerator)。

Result類:

public class Result {

    private int code;
    private String message;
    private Object data;

    public Result setCode(ResultCode resultCode) {
        this.code = resultCode.getCode();
        return this;
    }

    public int getCode() {
        return code;
    }

    public Result setCode(int code) {
        this.code = code;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public Object getData() {
        return data;
    }

    public Result setData(Object data) {
        this.data = data;
        return this;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Result{");
        sb.append("code=").append(code);
        sb.append(", message='").append(message).append('\'');
        sb.append(", data=").append(data);
        sb.append('}');
        return sb.toString();
    }
}

ResultCode類:

public enum ResultCode {

    SUCCESS(200),
    FAIL(400),
    UNAUTHORIZED(401),
    FORBIDDEN(403),
    NOT_FOUND(404),
    INTERNAL_SERVER_ERROR(500);

    private final int code;

    ResultCode(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

ResultGenerator類:

public class ResultGenerator {

    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";

    private ResultGenerator() {

    }

    public static Result genSuccessResult() {
        return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE);
    }

    public static Result genSuccessResult(Object data) {
        return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE).setData(data);
    }

    public static Result genFailResult(String message) {
        return new Result().setCode(ResultCode.FAIL).setMessage(message);
    }

    public static Result genFailResult(ResultCode code, String message) {
        return new Result().setCode(code).setMessage(message);
    }

    public static Result genFailResult(String message, Object data) {
        return new Result().setCode(ResultCode.FAIL).setMessage(message).setData(data);
    }
}

測試controller(PurchaseController):

@RestController
@RequestMapping("/purchase")
public class PurchaseController {

    @Autowired
    private PurchaseService purchaseService;

    @GetMapping("/test")
    public String test(String param) {
        purchaseService.addStock(param);
        return "success";
    }
}

測試PurchaseService、和PurchaseServiceImpl

public interface PurchaseService {
    Result addStock(String param);
}
@Service("purchaseService")
public class PurchaseServiceImpl implements PurchaseService {

    @Override
    // 在需要重試的業務方法上新增重試注解即可
    @MyRetryable(businessType = RetryTaskDefinitionEnum.ADD_STOCK)
    public Result addStock(String param) {
//     return ResultGenerator.genSuccessResult();
        return ResultGenerator.genFailResult("系統異常...");
    }
}

三、總結

新增重試任務成功之后,我們可通過調度平臺(比如:xxlJob),定時查詢重試任務表,然后調用RetryTaskDefinitionEnum中定義的重試的service(retryServiceName),這里可以定義一個模板方法,根據retryServiceName,從spring中獲取到對應的bean,執行具體的業務方法,然后更新任務狀態和重試次數即可。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-11-14 08:19:59

重試機制Kafka

2025-11-10 07:46:24

2024-09-25 08:32:05

2020-07-19 15:39:37

Python開發工具

2025-02-26 10:49:14

2021-02-20 10:02:22

Spring重試機制Java

2022-05-06 07:44:10

微服務系統設計重試機制

2025-01-03 08:44:37

kafka消息發送策略

2017-07-02 16:50:21

2017-06-16 15:16:15

2025-05-28 01:15:00

Golang重試機制

2025-02-27 09:35:22

2023-11-27 07:44:59

RabbitMQ機制

2019-01-24 16:11:19

前端全局異常數據校驗

2023-11-06 08:00:38

接口高可用機制

2020-08-24 13:35:59

trycatchJava

2024-01-04 18:01:55

高并發SpringBoot

2025-09-30 01:55:00

SpringWebClientHTTP

2023-10-10 13:23:18

空指針異常Java

2022-09-15 07:31:49

Spring攔截器注解
點贊
收藏

51CTO技術棧公眾號

久久久久噜噜噜亚洲熟女综合| 日本xxxxxxx免费视频| 秋霞网一区二区| 视频一区二区中文字幕| 日韩在线www| 欧美大喷水吹潮合集在线观看| av日韩电影| 亚洲婷婷综合色高清在线| 国产高清不卡av| 伊人久久中文字幕| 欧美涩涩网站| 亚洲欧美日韩中文在线制服| 久久精品亚洲天堂| 免费观看欧美大片| 亚洲乱码中文字幕综合| 欧美日韩国产综合在线| av中文字幕在线免费观看| 亚洲一区中文| 欧美富婆性猛交| 手机av在线不卡| 卡通动漫国产精品| 日韩亚洲欧美在线| 中文字幕 日韩 欧美| 欧美aa一级| 一区二区三区丝袜| 一区二区三区国产福利| 男女污污视频在线观看| 懂色av一区二区三区免费看| 国产伦精品免费视频| av大片免费在线观看| 欧美在线二区| 日韩在线视频观看正片免费网站| aaaaa级少妇高潮大片免费看| 日韩一区网站| 7777精品伊人久久久大香线蕉 | 成年人在线看| 99久久综合精品| 成人免费视频视频在| 国产精品久久综合青草亚洲AV| 美女尤物久久精品| 26uuu久久噜噜噜噜| 国产一级久久久| 午夜久久tv| 欧美大荫蒂xxx| 国产一区二区视频在线观看免费| 91视频综合| 中文字幕在线观看亚洲| 国产免费无遮挡吸奶头视频| 九九热爱视频精品视频| 亚洲国产精品va| 69亚洲乱人伦| 国产精品任我爽爆在线播放| 欧美成人a在线| 久草免费资源站| 动漫视频在线一区| 亚洲国产精品电影在线观看| 亚洲av成人片无码| 欧美激情久久久久久久久久久| 亚洲电影第1页| 男男做爰猛烈叫床爽爽小说| 群体交乱之放荡娇妻一区二区 | 91亚洲永久免费精品| 一卡二卡三卡在线观看| 狠狠色丁香久久婷婷综| 亚洲free嫩bbb| www.国产精品视频| 成人激情校园春色| 欧美精品尤物在线| 成人亚洲性情网站www在线观看| 中文字幕av一区二区三区| 亚洲一区二区三区色| 快射av在线播放一区| 亚洲综合色区另类av| 亚洲熟妇国产熟妇肥婆| 户外露出一区二区三区| 欧美日韩国产综合一区二区| 天天色天天综合网| silk一区二区三区精品视频| 日韩大片免费观看视频播放 | 一区二区三区毛片| 久久久久免费看黄a片app| 在线一区av| 欧美日韩成人综合在线一区二区 | 91免费在线看| 亚洲美女网站18| 成年人国产在线观看| 色av一区二区| 免费欧美一级片| 亚州综合一区| 久久精品人人做人人爽| wwwxxx亚洲| 韩国av一区二区三区在线观看| 国产欧美日本在线| av片在线看| 亚洲午夜久久久久中文字幕久| 国产一区二区视频免费在线观看| 清纯唯美激情亚洲| 亚洲精品一区二区网址| 免费在线观看a级片| 99亚洲一区二区| 成人h猎奇视频网站| 人妻一区二区三区免费| 国产精品免费看片| av网站在线观看不卡| 亚洲欧洲日韩精品在线| 日韩精品福利网站| 91精品一区二区三区蜜桃| 亚洲一区二区三区四区五区午夜 | 欧美日韩123| 欧美多人爱爱视频网站| 少妇又紧又色又爽又刺激视频 | 明星裸体视频一区二区| a毛片在线播放| 欧美在线一二三四区| 国产精品亚洲一区二区无码| 99久久.com| 日韩免费视频在线观看| 囯产精品久久久久久| 国产精品卡一卡二| 亚洲中文字幕久久精品无码喷水| 国产成人av毛片| 久久亚洲私人国产精品va| 无码人妻精品一区二区三区不卡 | 亚洲欧美影院| 亚洲播播91| 日韩av一区二区在线观看| 中文字幕在线有码| 狠狠色丁香久久婷婷综| 日韩欧美99| 黄色综合网址| 日韩高清中文字幕| 99免费在线观看| 国产成人在线影院| 无码人妻精品一区二区三区99v| www成人在线视频| 亚洲人成电影网站色| 日韩字幕在线观看| thepron国产精品| 99色这里只有精品| ccyy激情综合| 久久久久久尹人网香蕉| www.污视频| 亚洲国产毛片aaaaa无费看| 在线观看欧美一区二区| 欧美性色综合| 超碰97网站| 欧美videosex性欧美黑吊| 精品久久国产字幕高潮| 久久久夜色精品| 成人免费观看视频| 精品无码一区二区三区在线| jizz国产精品| 欧美亚洲视频一区二区| 香蕉视频国产在线| 色婷婷av一区二区三区之一色屋| 日韩人妻一区二区三区| 久久久人人人| 日韩一区二区三区高清| 成人在线视频免费| 久久精品视频免费播放| av观看在线免费| 午夜视频一区在线观看| 国产精品嫩草av| 久久中文欧美| 中文网丁香综合网| 亚洲天堂av资源在线观看| 海角国产乱辈乱精品视频| 污污的视频网站在线观看| 精品久久久久久久久久久久久久| 男生草女生视频| 久久国产人妖系列| 女人被男人躁得好爽免费视频| 成人自拍在线| 国产97人人超碰caoprom| 色欧美激情视频在线| 欧美成人video| 无码视频在线观看| 日韩美女精品在线| 催眠调教后宫乱淫校园| 日本aⅴ精品一区二区三区| 日本一区二区免费高清视频| 久久porn| 国产精选久久久久久| 黄色成人在线网| 夜夜躁日日躁狠狠久久88av | 国产精品久久久久久久久久齐齐 | 国产福利视频网站| aaa欧美日韩| 手机版av在线| 99pao成人国产永久免费视频| 日韩在线电影一区| 99re91这里只有精品| 国产精品电影久久久久电影网| 2024最新电影免费在线观看| 亚洲精品一二区| 亚洲成人77777| 欧洲精品一区二区三区在线观看| 久久精品一区二区三| 国产日韩欧美亚洲| 制服丝袜av在线| 精品一区二区影视| 欧美日韩亚洲第一| 亚洲无线一线二线三线区别av| 欧美一区视久久| 亚洲一区二区三区中文字幕在线观看| 日本三级久久久| 黄色成人在线网| 精品国产一区二区三区久久| 欧洲亚洲精品视频| 欧美成人午夜电影| 91久久精品国产91性色69| 欧美视频在线观看免费| caoporn91| 国产欧美日韩久久| 国产精品无码永久免费不卡| 国产黑丝在线一区二区三区| 鲁一鲁一鲁一鲁一av| 午夜一区不卡| 国产一区二区网| 欧美精品国产| 麻豆中文字幕在线观看| av一区二区在线观看| 久久婷婷开心| 久久悠悠精品综合网| 成人动漫在线视频| **国产精品| 国产精品亚洲第一区| 日韩免费va| 91成人精品网站| 国产美女精品写真福利视频| 欧美高清videos高潮hd| 在线播放免费av| 久久影视电视剧免费网站清宫辞电视| av小片在线| 中文字幕亚洲欧美日韩在线不卡| 国产在线小视频| 国产午夜精品视频免费不卡69堂| 香蕉视频黄在线观看| 日韩精品视频在线播放| 五月天婷婷视频| 日韩久久精品电影| 激情福利在线| 一本色道久久88精品综合| 高清中文字幕一区二区三区| 亚洲天堂av综合网| 成av人电影在线观看| 在线精品91av| 黄页视频在线播放| 欧美日韩成人网| 啪啪免费视频一区| 午夜精品99久久免费| 亚洲风情在线资源| 国产成人精品日本亚洲| 日韩天堂在线| 国产精品视频区| 国产日韩中文在线中文字幕| 91视频免费在线观看| 亚洲视频精选| 蜜桃视频在线观看成人| 国产一区二区三区网| 亚洲免费不卡| 在线电影一区二区| 黄色www网站| 久久亚洲不卡| 国产精品区在线| 国产福利91精品一区| 人妻av一区二区| 久久精品一区二区| 精品在线观看一区| 亚洲自拍欧美精品| 欧美一区二区三区久久久| 欧美日韩中字一区| 精品人妻一区二区三区浪潮在线 | 巨大荫蒂视频欧美另类大| 欧美另类极品videosbestfree| 999av小视频在线| 国产精品99久久久久久久久| 经典三级久久| 韩日午夜在线资源一区二区| 国产尤物久久久| 老司机午夜网站| 国产日韩一区二区三区在线播放| 五月婷婷六月丁香激情| 国产精品一区二区在线看| 懂色av粉嫩av蜜乳av| 国产精品久久久久久久久久久免费看 | 久久久久久成人| gogo亚洲高清大胆美女人体| 91在线观看免费高清完整版在线观看| 国产精品巨作av| 一级做a爰片久久| av不卡在线| 欧美国产日韩在线视频| 久久久91精品国产一区二区三区| 中文字幕av播放| 91国内精品野花午夜精品| 亚洲av无码一区二区三区dv | 精品亚洲一区二区三区四区五区高| 欧美丝袜丝交足nylons172| 女人被男人躁得好爽免费视频| 日本免费在线视频不卡一不卡二 | av在线免费在线观看| 亚洲色图综合网| 好久没做在线观看| 成人xxxxx| 红桃视频在线观看一区二区| 国产精品视频网站在线观看| 美洲天堂一区二卡三卡四卡视频| 偷偷色噜狠狠狠狠的777米奇| 亚洲欧美偷拍卡通变态| 不卡av电影在线| 亚洲激情中文字幕| 羞羞的视频在线观看| 国产精品一区二区三| 妖精视频一区二区三区免费观看| 成人免费a级片| 狠狠狠色丁香婷婷综合久久五月| 亚洲第一综合网| 偷偷要91色婷婷| 老熟妇高潮一区二区高清视频| 久久久91精品| 国产精品4hu.www| 日韩av一区二区三区美女毛片| 日韩视频三区| 黄色国产在线视频| 亚洲综合一二区| 亚洲av无码国产综合专区| 久久精品色欧美aⅴ一区二区| 久久精品黄色| 亚洲午夜精品国产| 免费人成精品欧美精品| 色欲狠狠躁天天躁无码中文字幕| 狠狠躁18三区二区一区| 少妇人妻偷人精品一区二区| 欧美日本高清视频| 伊人久久噜噜噜躁狠狠躁| 一区二区三区一级片| 国产在线精品一区二区不卡了| 日本美女黄色一级片| 欧美视频中文字幕| 午夜视频在线观看免费视频| 国产美女直播视频一区| 欧美精品久久久久久| 国产wwwxx| 国产精品传媒入口麻豆| 亚洲天堂中文字幕在线| 日日狠狠久久偷偷四色综合免费| 祥仔av免费一区二区三区四区| 亚洲第一页在线视频| 国产精选一区二区三区| 麻豆一区二区三区精品视频| 欧美不卡123| 美女在线视频免费| 欧美一区二区在线| 奇米一区二区三区| 美国一级片在线观看| 日韩一区二区三| 18video性欧美19sex高清| 精品国产91亚洲一区二区三区www| 国产视频一区三区| jizz中文字幕| 6080亚洲精品一区二区| 成人av影院在线观看| 鲁丝一区鲁丝二区鲁丝三区| 免费成人美女在线观看| 五月天av网站| 亚洲精品国产成人| 免费欧美电影| 亚洲小说欧美另类激情| 成人免费的视频| 欧美国产一级片| 欧美成人激情图片网| 欧美美女在线直播| 青青青在线视频免费观看| 亚洲欧美国产三级| 五月婷婷六月丁香综合| 国产精品一区二区久久精品| 欧美日韩一区自拍| 黄色aaa视频| 91精品在线麻豆| 无码小电影在线观看网站免费| 天堂社区 天堂综合网 天堂资源最新版| 久久国产精品99久久久久久老狼| 国产一级做a爱免费视频| 亚洲欧美精品在线| 欧美精品影院| 日日碰狠狠丁香久燥| 亚洲一区在线观看视频| 免费黄色片在线观看| 5g影院天天爽成人免费下载| 久久aⅴ乱码一区二区三区| 久久精品在线观看视频| 亚洲第一页在线| 国产aⅴ精品一区二区四区| www.四虎成人| 亚洲精品大片www| av片在线看| 免费成人av网站| 成人亚洲精品久久久久软件| 亚洲一区二区色|