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

永久av免费网站| www插插插无码免费视频网站| 亚洲男人天堂网址| 爽成人777777婷婷| 欧美白人最猛性xxxxx69交| 大j8黑人w巨大888a片| 最新国产在线观看| 高清av一区二区| 国产精品久久久久免费a∨| 欧美激情一区二区视频| 欧美极品中文字幕| 精品国产免费一区二区三区四区| 无码人妻丰满熟妇区五十路百度| 在线观看av的网站| www.欧美亚洲| 91色视频在线观看| 亚洲毛片一区二区三区| 国产精品二区影院| zzjj国产精品一区二区| 久久精品国产亚洲AV熟女| 日韩免费成人| 欧美日韩色综合| 欧美私人情侣网站| 国产蜜臀av在线播放| 国产精品久久看| 久久久精品国产一区二区三区| 国产精品无码在线播放| 三级一区在线视频先锋| 91精品国产91久久久久久不卡| 中国1级黄色片| 国产剧情在线观看一区| 亚洲国产精品久久91精品| 亚洲一区二区福利视频| 日韩成人影音| 一本色道a无线码一区v| 99久久国产综合精品五月天喷水| 99热国产在线| 日韩美女视频19| 亚洲精品国产精品国自产观看 | 成人动漫一区| 亚洲图片欧美一区| 久久男人资源站| а√中文在线8| 中文字幕在线一区免费| 亚洲不卡1区| 成年人在线免费观看| 26uuu亚洲综合色| 精品中文字幕一区| 天天操天天干天天插| 懂色av一区二区夜夜嗨| aa成人免费视频| 亚洲av无码国产综合专区| 国产一区二三区好的| 亚洲aaaaaa| 国产夫妻自拍av| 国产99久久久精品| 国产精品果冻传媒潘| 丰满人妻一区二区三区四区53| 国产大陆精品国产| 都市激情久久久久久久久久久| 亚洲精品国产suv一区| 成人国产精品免费观看| 国产在线一区二区三区欧美| 无码国产色欲xxxx视频| 久久免费视频色| 亚洲国产欧美不卡在线观看 | 国产福利在线免费| 亚洲免费资源| 日韩一区二区三区电影在线观看| 亚洲精品一二三四| 国产精品对白| 亚洲欧美另类在线观看| 91麻豆制片厂| 综合激情一区| 97色伦亚洲国产| 日本一本在线观看| 久久99国产精品久久99| 99伊人久久| 你懂的在线网址| 中文无字幕一区二区三区| 免费看污污视频| www欧美xxxx| 在线精品观看国产| 日韩在线一区视频| 久久国产精品免费精品3p| 亚洲欧洲国产精品| 69av视频在线| 久久av在线| 92看片淫黄大片欧美看国产片| 国精产品一品二品国精品69xx| 26uuu亚洲| 裸体裸乳免费看| 蜜桃视频在线网站| 欧美挠脚心视频网站| 日韩成人av影院| 欧美色爱综合| 久久久久久久一| 中文在线最新版天堂| 国产xxx精品视频大全| 欧美成人蜜桃| 牛牛精品视频在线| 欧美在线短视频| 亚洲精品无码一区二区| 日本欧美肥老太交大片| 97国产成人精品视频| 在线播放精品视频| 26uuu国产电影一区二区| 国产日本欧美在线| 午夜精品成人av| 精品国产乱码久久久久久1区2区 | 91精品视频国产| 色婷婷av一区二区三区丝袜美腿| 久久亚洲影音av资源网| 丰满少妇xoxoxo视频| 国产成人8x视频一区二区| 亚洲国内在线| 黄色综合网址| 亚洲电影免费观看| 日本中文在线视频| 奇米精品一区二区三区在线观看| 国产精品 日韩| av在线网址观看| 欧美日韩一级二级| 国产成人无码精品久久二区三| 在线看片日韩| 亚洲综合中文字幕在线| 在线激情网站| 欧美伊人精品成人久久综合97| 一出一进一爽一粗一大视频| 欧美成人午夜| 亚洲va久久久噜噜噜| 成a人片在线观看www视频| 日韩欧美亚洲成人| 91精品小视频| 在线亚洲伦理| 国内精品视频免费| 草美女在线观看| 精品少妇一区二区三区在线播放| 国产女人被狂躁到高潮小说| 国产在线精品一区二区| 中文字幕不卡每日更新1区2区| 日韩制服诱惑| 中文字幕亚洲激情| 亚洲天堂中文字幕在线| 国产精品污网站| 日韩av片网站| 日韩欧美精品| 成人免费观看a| 国产网站在线免费观看| 欧美高清视频www夜色资源网| 免费精品在线视频| 黄一区二区三区| 天天做天天爱天天高潮| 国产 日韩 欧美| 欧美大片欧美激情性色a∨久久| 国内老熟妇对白hdxxxx| 一区二区三区四区蜜桃| 亚洲视频在线播放免费| 99视频一区| 日本一区二区不卡高清更新| 天然素人一区二区视频| 日韩综合视频在线观看| 国产乱码精品一区二区三区精东| 亚洲欧美激情小说另类| 亚洲国产精品第一页| 亚洲精品护士| 亚洲v国产v| 精品91福利视频| 久久久亚洲福利精品午夜| 日韩有码电影| 欧美色视频一区| 欧美色图一区二区| 久久中文字幕电影| 亚洲 激情 在线| 欧美午夜电影在线观看| 久久久久久久久久久久久9999| 肉色欧美久久久久久久免费看| 中文字幕日韩在线播放| 99国产在线播放| 精品久久久久久电影| 手机看片福利视频| 国产高清精品网站| 免费日韩中文字幕| 91精品国产乱码久久久久久久| 国产在线观看一区| 免费高清视频在线一区| 九色91av视频| 你懂得网站在线| 日韩美女视频在线| 日韩 国产 欧美| 亚洲综合在线视频| 公肉吊粗大爽色翁浪妇视频| 国产黄色精品视频| 性欧美极品xxxx欧美一区二区| 欧美va亚洲va日韩∨a综合色| 你懂的视频在线一区二区| 免费观看性欧美大片无片| 欧美一区二三区| 中文字幕中文字幕在线中高清免费版| 亚洲精品久久久久中文字幕欢迎你 | 日韩毛片久久久| 亚洲高清久久网| 91久久久久久久久久久久| 欧美日韩中文字幕| 五月天丁香激情| 欧美国产一区二区| 国产麻豆xxxvideo实拍| 国产一区二区不卡在线| 亚洲一区二区蜜桃| 亚洲激情二区| 国产制服91一区二区三区制服| 国产免费av一区二区三区| 国产伦精品一区二区三区免| av在线精品| 国产精品一区二区久久久久| gay欧美网站| 国内免费久久久久久久久久久 | 一区二区三区中文免费| 一二三四在线观看视频| 久久这里只有精品6| 亚洲麻豆一区二区三区| 国产精品自产自拍| www.cao超碰| 日韩电影在线免费看| 男人透女人免费视频| 国产精品久久久久毛片大屁完整版| 800av在线免费观看| 91精品国产视频| 一区二区三区日韩视频| 日韩片欧美片| 亚洲欧美丝袜| 欧美成人直播| 一本色道婷婷久久欧美| 日韩国产欧美一区二区| 亚洲三区在线| 久久精品青草| 在线观看视频黄色| 最新精品国产| 丁香色欲久久久久久综合网| 重囗味另类老妇506070| 精品一区二区成人免费视频| 天天操夜夜操国产精品| 在线观看日韩羞羞视频| 91综合久久| 三年中文高清在线观看第6集| 91综合网人人| 日本天堂免费a| 亚洲国产日本| 国内外成人激情视频| 视频一区在线播放| 九色91popny| 狠狠久久亚洲欧美| 免费黄频在线观看| 国产精品影视在线观看| 一边摸一边做爽的视频17国产| fc2成人免费人成在线观看播放 | 夜夜揉揉日日人人青青一国产精品| 欧美日韩成人免费观看| 亚洲成a天堂v人片| 欧美 日韩 精品| 在线观看欧美黄色| 国产美女裸体无遮挡免费视频| 日韩一区二区影院| 性xxxx视频| 亚洲香蕉伊综合在人在线视看 | 欧美精品久久久久久| 亚洲午夜精品久久| 国产精品九九| 91传媒久久久| 免费观看在线综合色| 欧美国产日韩在线视频| 成人一级片网址| 素人fc2av清纯18岁| 国产精品久久网站| 黄色小视频在线免费看| 欧美在线观看禁18| www.蜜桃av.com| 亚洲另类激情图| 国产福利视频在线观看| 97免费视频在线| 在线日韩三级| 欧美精品123| 欧美影视一区| 成人中文字幕av| 国产精品一区免费在线观看| 9.1成人看片免费版| 专区另类欧美日韩| 日韩一级片中文字幕| 欧美一区二区三区白人| 日本韩国一区| 欧美精品在线第一页| 成人在线爆射| 99久热re在线精品视频| re久久精品视频| 成人免费性视频| 免费成人在线视频观看| 在线免费看黄色片| 国产精品传媒视频| 日韩中文字幕在线观看视频| 日韩一级视频免费观看在线| 国产有码在线| 性欧美激情精品| 久久久久久爱| 一本一本久久a久久精品综合妖精| 亚洲青涩在线| 丰满人妻一区二区三区53视频| 国产目拍亚洲精品99久久精品| 日韩污视频在线观看| 91精品国产综合久久蜜臀| 国产日韩精品在线看| 久久久久久久久久久人体| 国产一区二区三区免费在线| 日本在线免费观看一区| 99精品国产一区二区青青牛奶 | 国产午夜亚洲精品午夜鲁丝片 | 在线亚洲成人| 折磨小男生性器羞耻的故事| 亚洲欧美另类久久久精品2019| 中文字幕日本人妻久久久免费| 亚洲精品久久久久国产| 日本电影在线观看| 91在线观看免费| 97精品视频在线看| 五月婷婷丁香综合网| 国产欧美中文在线| 精品国产乱子伦| 亚洲女同精品视频| 欧美日韩国产观看视频| 极品校花啪啪激情久久| 在线精品一区二区| 黄色激情在线观看| 一区二区三区毛片| 亚洲精品福利网站| 欧美激情国产精品| xvideos.蜜桃一区二区| 久久综合亚洲精品| 国产福利一区二区| 日韩黄色免费观看| 欧美一区二区三区系列电影| 黄色小网站在线观看| 成人有码在线视频| 影音先锋日韩精品| 伊人av在线播放| 亚洲一区二区三区激情| 丰满人妻一区二区| 91高清在线免费观看| 精品在线网站观看| 免费高清在线观看免费| 久久久精品影视| 中文字字幕在线中文乱码| 最近2019中文字幕大全第二页| 色猫猫成人app| 在线观看成人av电影| 国产一区二区导航在线播放| 国产性猛交普通话对白| 亚洲精品国产精品乱码不99按摩| 小视频免费在线观看| 欧洲久久久久久| 国内久久精品视频| 国产在线观看你懂的| 精品亚洲aⅴ在线观看| 日韩经典一区| 免费看污污视频| 不卡一区二区在线| 成人免费毛片男人用品| 中文字幕精品网| 欧美久久亚洲| 国产xxxxx在线观看| 国产精品每日更新在线播放网址| 国产女18毛片多18精品| 久久久久久欧美| 精品国产一级毛片| 国产毛片久久久久久| 红桃av永久久久| 天堂中文8资源在线8| 国产精品视频免费一区二区三区 | 国产精品极品尤物在线观看| 99久久精品国产亚洲精品| 亚洲色图欧美另类| 在线一区二区三区| 调教一区二区| 欧美久久久久久| 国产精品综合在线视频| 91九色丨porny丨肉丝| 最近日韩中文字幕中文| 国产亚洲精品美女久久| 一区二区三区韩国| 亚洲成人综合网站| 1024视频在线| 久久国产精品亚洲va麻豆| 久久99精品久久久久久久久久久久 | av资源种子在线观看| 99在线免费观看视频| 日韩福利视频网| 日韩欧美亚洲视频| 日韩视频免费大全中文字幕| 日韩高清影视在线观看| 激情文学亚洲色图| 日本久久电影网| 草莓视频丝瓜在线观看丝瓜18|