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

SpringBoot與Canal整合,實現金融交易系統的實時數據同步功能

數據庫 其他數據庫
Canal是阿里巴巴開源的一個用于高效抓取 MySQL 數據庫增量變更日志(binlog)并進行處理的中間件。它可以將 MySQL 的 binlog 解析為結構化的 JSON 格式,并提供多種方式將這些數據推送到下游系統。

Canal是阿里巴巴開源的一個用于高效抓取 MySQL 數據庫增量變更日志(binlog)并進行處理的中間件。它可以將 MySQL 的 binlog 解析為結構化的 JSON 格式,并提供多種方式將這些數據推送到下游系統。

我們為什么選擇Canal?

  • 實時性: Canal基于MySQL的binlog機制,能夠在毫秒級內完成數據同步。
  • 批量獲取數據:Canal支持批量獲取數據庫變更數據,減少網絡開銷和處理時間。
  • 多線程處理:Canal可以配置多線程來處理不同的數據變更事件,提高整體吞吐量。
  • 斷點續傳:Canal支持從斷點繼續消費數據,確保數據不會丟失。
  • 持久化存儲:Canal可以將消費進度持久化到ZooKeeper中,保證在故障恢復后能夠繼續正常工作。
  • 容錯機制:Canal內置了多種容錯機制,如重試策略和自動恢復功能,提高了系統的可靠性。
  • 標準協議:Canal使用標準化的binlog協議,易于與其他系統集成。
  • 過濾機制:Canal支持靈活的過濾規則,可以選擇性地訂閱特定的數據庫和表。
  • 動態配置:Canal支持動態配置,可以根據實際需求調整監控范圍和處理邏輯。
  • 自定義處理:Canal允許開發者編寫自定義的處理器,實現復雜的數據處理邏輯。
  • 精確同步:Canal能夠精確地捕獲和同步數據庫的每一行變更,確保數據的一致性。
  • 事務支持:Canal能夠處理復雜的事務場景,確保事務的原子性和完整性。
  • 沖突解決:Canal提供了多種沖突解決策略,避免數據同步過程中的沖突問題。

哪些公司使用了Canal?

  • 阿里巴巴 :Canal 被用于多個業務部門的數據同步需求。
  • 騰訊 :在社交網絡、游戲等業務中使用 Canal 進行數據同步。
  • 美團:在餐飲外賣、酒店預訂等多個業務中使用 Canal 進行數據同步。
  • 小米 :在智能家居、手機銷售等多種業務中使用 Canal 進行數據同步。
  • 滴滴出行:在網約車、共享單車等多種業務中使用 Canal 進行數據同步。
  • 網易:在游戲、音樂等多種業務中使用 Canal 進行數據同步。

代碼實操

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>canal-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>canal-demo</name>
    <description>Demo project for Spring Boot with Canal</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.otter</groupId>
            <artifactId>canal.client</artifactId>
            <version>1.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties

# 數據源配置
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Canal配置
canal.server.ip=127.0.0.1
canal.port=11111
canal.destination=example

交易實體類

package com.example.canaldemo.model;

import lombok.Data;

@Data
public class Transaction {
    private Long id;          // 主鍵ID
    private String transactionId; // 交易ID
    private Double amount;      // 交易金額
    private String status;      // 交易狀態
}

create table

CREATE TABLE transaction (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    transaction_id VARCHAR(50) NOT NULL,
    amount DECIMAL(18, 2) NOT NULL,
    status VARCHAR(20) NOT NULL
);

交易Mapper接口

package com.example.canaldemo.mapper;

import com.example.canaldemo.model.Transaction;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

/**
 * 交易Mapper接口
 */
@Mapper
public interface TransactionMapper {

    /**
     * 插入一條新的交易記錄
     *
     * @param transaction 交易對象
     */
    @Insert("INSERT INTO transaction(transaction_id, amount, status) VALUES(#{transaction.transactionId}, #{transaction.amount}, #{transaction.status})")
    void insert(@Param("transaction") Transaction transaction);

    /**
     * 更新一條交易記錄
     *
     * @param transaction 交易對象
     */
    @Update("UPDATE transaction SET amount=#{transaction.amount}, status=#{transaction.status} WHERE transaction_id=#{transaction.transactionId}")
    void update(@Param("transaction") Transaction transaction);
}

Canal監聽器類

package com.example.canaldemo.listener;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.example.canaldemo.mapper.TransactionMapper;
import com.example.canaldemo.model.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.net.InetSocketAddress;
import java.util.List;

/**
 * Canal監聽器類,用于監聽數據庫的變化并進行相應的處理
 */
@Component
public class CanalListener {

    private final String destination = "example"; // 這個值需要與Canal配置中的destination一致
    private final String serverIp = "127.0.0.1";
    private final int port = 11111;

    @Autowired
    private TransactionMapper transactionMapper;

    /**
     * 在Bean初始化后啟動Canal監聽器
     */
    @PostConstruct
    public void start() {
        // 創建Canal連接器
        CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(serverIp, port), destination, "", "");
        try {
            // 連接到Canal服務器
            connector.connect();
            // 訂閱所有數據庫的所有表
            connector.subscribe(".*\\..*");
            // 回滾到上次中斷的位置
            connector.rollback();

            while (true) {
                // 獲取一批消息,最多100條
                Message message = connector.getWithoutAck(100);
                long batchId = message.getId();
                int size = message.getEntries().size();
                if (batchId == -1 || size == 0) {
                    // 如果沒有消息,則等待1秒
                    Thread.sleep(1000);
                } else {
                    // 處理消息
                    processMessage(message.getEntries());
                }
                // 提交確認
                connector.ack(batchId);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 斷開連接
            connector.disconnect();
        }
    }

    /**
     * 處理Canal發送過來的消息
     *
     * @param entryList 消息列表
     */
    private void processMessage(List<CanalEntry.Entry> entryList) {
        for (CanalEntry.Entry entry : entryList) {
            // 忽略事務開始和結束事件
            if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND) {
                continue;
            }

            CanalEntry.RowChange rowChage;
            try {
                // 解析RowChange數據
                rowChage = CanalEntry.RowChange.parseFrom(entry.getStoreValue());
            } catch (Exception e) {
                throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(), e);
            }

            CanalEntry.EventType eventType = rowChage.getEventType();
            // 打印日志
            System.out.println(String.format("================> binlog[%s:%s] , name[%s,%s] , eventType : %s",
                    entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(),
                    entry.getHeader().getSchemaName(), entry.getHeader().getTableName(),
                    eventType));

            // 處理每一行數據變化
            for (CanalEntry.RowData rowData : rowChage.getRowDatasList()) {
                Transaction transaction = convertToTransaction(rowData.getAfterColumnsList());
                if (eventType == CanalEntry.EventType.DELETE) {
                    // 處理刪除事件(如果需要)
                } elseif (eventType == CanalEntry.EventType.INSERT) {
                    // 插入新記錄
                    transactionMapper.insert(transaction);
                } else {
                    // 更新現有記錄
                    transactionMapper.update(transaction);
                }
            }
        }
    }

    /**
     * 將Canal列數據轉換為Transaction對象
     *
     * @param columns 列數據列表
     * @return 轉換后的Transaction對象
     */
    private Transaction convertToTransaction(List<CanalEntry.Column> columns) {
        Transaction transaction = new Transaction();
        for (CanalEntry.Column column : columns) {
            switch (column.getName()) {
                case"id":
                    transaction.setId(Long.parseLong(column.getValue()));
                    break;
                case"transaction_id":
                    transaction.setTransactionId(column.getValue());
                    break;
                case"amount":
                    transaction.setAmount(Double.parseDouble(column.getValue()));
                    break;
                case"status":
                    transaction.setStatus(column.getValue());
                    break;
            }
        }
        return transaction;
    }
}

Application

package com.example.canaldemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.canaldemo.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

測試

插入一條交易記錄

curl -X POST http://localhost:8080/api/transactions \
-H "Content-Type: application/json" \
-d '{"transactionId": "TX123", "amount": 100.00, "status": "PENDING"}'

更新一條交易記錄

curl -X PUT http://localhost:8080/api/transactions/TX123 \
-H "Content-Type: application/json" \
-d '{"transactionId": "TX123", "amount": 100.00, "status": "COMPLETED"}'

觀察后臺日志

================> binlog[mysql-bin.000001:1234] , name[your_database,transaction] , eventType : INSERT
id : 1    update=true
transaction_id : TX123    update=true
amount : 100.00    update=true
status : PENDING    update=true
================> binlog[mysql-bin.000001:5678] , name[your_database,transaction] , eventType : UPDATE
-------> before
id : 1    update=false
transaction_id : TX123    update=false
amount : 100.00    update=false
status : PENDING    update=false
-------> after
id : 1    update=false
transaction_id : TX123    update=false
amount : 100.00    update=false
status : COMPLETED    update=true
責任編輯:武曉燕 來源: Java知識日歷
相關推薦

2020-06-12 12:49:52

數據

2025-02-20 18:17:41

2020-09-21 11:30:28

CanalMySQL數據庫

2025-03-20 08:57:54

Spring日志存儲系統

2025-07-10 08:46:21

ConnectSpringBoot數據

2025-04-01 08:38:41

2023-09-26 08:11:22

Spring配置MySQL

2024-12-06 11:58:16

2021-11-07 15:01:16

區塊鏈金融技術

2025-05-20 09:00:04

SpringGeoHash派單

2023-05-31 08:56:24

2025-09-26 08:46:30

2024-09-02 09:14:36

SpringRabbitMQ數據

2025-04-25 08:34:52

2011-04-29 14:35:53

惠普工作站

2025-03-11 09:28:34

2025-03-17 08:39:08

SpringApache數據

2017-02-20 20:04:05

系統超輕量日志實現

2025-06-03 02:10:00

SpringInfluxDB數據

2024-10-30 08:15:18

點贊
收藏

51CTO技術棧公眾號

91在线视频播放| 日韩午夜免费视频| 欧美成人精品二区三区99精品| 4444在线观看| 天天操天天舔天天干| 日本欧美一区二区三区| 欧美成人网在线| 黄色录像a级片| 欧美黄色a视频| 亚洲成人动漫av| 日本在线观看不卡| 亚洲国产一二三区| 奇米777欧美一区二区| 欧美肥臀大乳一区二区免费视频| 成年人在线观看av| 在线观看亚洲精品福利片| 亚洲国产视频直播| 亚洲看片网站| 性感美女一级片| 精品一区二区三区免费| 26uuu另类亚洲欧美日本一 | 国产jzjzjz丝袜老师水多| 国产日韩1区| 欧美成年人视频网站欧美| 人人妻人人澡人人爽人人精品| 视频欧美精品| 日本黄色一区二区| 国产69精品久久久久999小说| a天堂中文在线88| 99国产精品视频免费观看| 91在线视频导航| 成人免费毛片视频| 亚洲久久一区二区| 欧美日韩成人在线视频| www成人啪啪18软件| 日韩福利视频一区| 欧美精品一区二区精品网| 国产女同无遮挡互慰高潮91| 欧美一区 二区 三区| 亚洲sss视频在线视频| 青草全福视在线| 思思99re6国产在线播放| 久久久精品一品道一区| 精品国产中文字幕| 人妻无码中文字幕| 国产成人亚洲综合a∨婷婷 | 欧美尺度大的性做爰视频| 精品日韩在线视频| 国产欧美久久一区二区三区| 日韩精品免费在线播放| 欧美性生交xxxxx| 日本免费一区二区视频| 666欧美在线视频| 国产一级片自拍| 欧美日韩va| 欧美久久久影院| 怡红院亚洲色图| 亚洲伊人精品酒店| 在线观看91av| 污免费在线观看| 精品国产亚洲一区二区三区在线 | 激情 小说 亚洲 图片: 伦| 综合久久2023| 欧美亚洲综合色| www.天天射.com| 国产精品美女午夜爽爽| 欧美日韩国产中文| av在线免费看片| 日本99精品| 亚洲精品www久久久| 国产精品探花一区二区在线观看| 美国成人xxx| 精品亚洲一区二区三区| 97在线观看免费视频| 日本欧美肥老太交大片| www.日韩av.com| 欧美精品乱码视频一二专区| 黄页网站一区| 欧美亚洲第一页| 69国产精品视频免费观看| 久久精品日产第一区二区| 国产精品久久久久久久久久小说| 亚洲一级视频在线观看| 国产精品1区2区3区在线观看| 粉嫩av四季av绯色av第一区| 亚洲人成色777777精品音频| 国产人伦精品一区二区| 51xx午夜影福利| 2021中文字幕在线| 91国产免费看| 人妻体体内射精一区二区| 成人在线tv视频| 亚洲色图激情小说| 极品魔鬼身材女神啪啪精品| 国产一区亚洲| 国产精品成人观看视频国产奇米| 97国产成人无码精品久久久| 成人午夜视频福利| 日产精品高清视频免费| av在线播放国产| 日韩欧美国产视频| 亚洲制服中文字幕| 亚洲警察之高压线| www.xxxx欧美| 在线观看日本视频| 国产在线一区观看| 欧美日韩国产一二| 手机av免费在线| 在线观看不卡一区| 99免费观看视频| 色喇叭免费久久综合网| 97视频在线观看亚洲| 国产精品久久久久久久免费| 91丨porny丨中文| 男人的天堂视频在线| 久久精品女人天堂av免费观看| 欧美一区二区三区成人| 亚洲av无码一区二区三区人 | 欧美黄色一级片视频| 亚洲精品高潮| 波霸ol色综合久久| 免费看污视频的网站| av色综合久久天堂av综合| 亚洲欧美日韩国产yyy| 欧美美女日韩| 日韩电影免费在线观看中文字幕 | 99国产精品久久久久老师| 99中文字幕一区| 福利视频一区二区| 五月天丁香社区| 88国产精品视频一区二区三区| 日韩免费观看高清| 天堂网在线播放| 亚洲图片欧美综合| 亚洲精品久久久久久| 99精品国产一区二区三区| 日韩美女免费视频| 欧美大片aaa| 精品日韩视频在线观看| 一级黄色片毛片| 欧美日韩综合| 99re国产视频| 激情图片在线观看高清国产| 日韩欧美第一区| 免费中文字幕在线| 国内精品伊人久久久久av影院| 性欧美精品一区二区三区在线播放 | 老牛精品亚洲成av人片| 久久久久久尹人网香蕉| 亚洲精品一区二区口爆| 亚洲图片欧美色图| 久久久老熟女一区二区三区91| 国产精品黄色| 国产在线欧美日韩| 高清视频在线观看三级| 日韩精品视频免费专区在线播放| 青青操免费在线视频| 99精品视频在线观看| 日本福利视频在线| 亚洲精品亚洲人成在线| 国产成人综合久久| 91在线免费看| 91精品国产色综合久久不卡电影 | 91电影在线播放| 欧美女孩性生活视频| 一区视频免费观看| 成人黄页在线观看| 黄色片久久久久| 欧洲毛片在线视频免费观看| 国产日韩欧美另类| 在线观看免费视频你懂的| 精品国产一区二区三区久久影院| 日本熟妇毛耸耸xxxxxx| 久久精品一区二区三区不卡| 中文字幕第80页| 天天影视综合| 99精品国产高清一区二区| 欧美伦理91| 中文字幕久热精品在线视频| 国产男女猛烈无遮挡| 精品国产鲁一鲁一区二区张丽| 亚洲成人网在线播放| 久久精品国内一区二区三区| 无码人妻精品一区二区三区99v| 99re热精品视频| 国产精品av网站| 菠萝菠萝蜜在线观看| 亚洲国产成人久久综合| 日韩精选在线观看| 亚洲精品免费一二三区| 久久人人爽人人爽人人片 | 老熟女高潮一区二区三区| 国产欧美高清| 在线视频一区观看| 免费成人蒂法| 成人性生交xxxxx网站| 爱情岛亚洲播放路线| 在线精品91av| 日韩在线观看视频一区二区三区| 91国产丝袜在线播放| 久久综合亚洲色hezyo国产| 国产亚洲精品aa| 香蕉久久久久久av成人| 蜜臀久久久99精品久久久久久| 国产精品自拍合集| av中文一区| 精品欧美一区二区在线观看视频 | 91超碰在线| 国产亚洲欧美日韩精品| 日本国产在线观看| 6080亚洲精品一区二区| 天堂免费在线视频| 激情久久av一区av二区av三区| 欧美性生交大片| www国产精品av| 手机在线免费毛片| 日本成人中文字幕| 无码aⅴ精品一区二区三区浪潮| 欧美国产先锋| 亚洲一区二区三区免费观看| 九九视频免费观看视频精品 | av污在线观看| 亚洲一卡久久| 久草热视频在线观看| 欧美色图首页| www.黄色网址.com| 999国产精品永久免费视频app| 欧美日韩精品久久久免费观看| 麻豆成人入口| 国产亚洲精品久久飘花| 91精品啪在线观看国产手机| 91pron在线| 久久国产精品美女| 91精品在线国产| 日本免费成人| 成人精品视频久久久久| 亚洲伦理网站| 91精品久久久久久综合乱菊| 欧美高清xxx| 国产中文日韩欧美| 成人激情久久| 91久久极品少妇xxxxⅹ软件| 日韩区一区二| www.成人av| 国产精品22p| 国产一区二区在线观看免费播放| 麻豆成人入口| 欧美日韩一区二区三区免费| 九九久久电影| 亚洲精品中文字幕在线| 99久久99热这里只有精品| 一区高清视频| 最新精品国产| 国产午夜福利在线播放| 日韩和欧美一区二区三区| 丰满少妇在线观看| 久久99国产精品免费| 三级一区二区三区| 国产成人精品亚洲日本在线桃色 | 日本中文字幕一区二区| 在线观看亚洲区| 91激情在线| 最新国产成人av网站网址麻豆| 日本中文字幕电影在线免费观看| 亚洲伦理中文字幕| 同心难改在线观看| 日韩午夜在线影院| 国产日产亚洲系列最新| 欧美精品一级二级| 一级黄色大毛片| 欧美精品九九99久久| 国产伦精品一区二区三区四区| 6080国产精品一区二区| 国产欧美日韩成人| 日韩精品专区在线影院观看| 国产富婆一级全黄大片| 日韩免费视频一区二区| 免费av网站观看| 亚洲精品美女久久久| 国产精品免费播放| 最近2019年好看中文字幕视频 | 日韩在线观看免费高清| 色呦呦在线资源| 国语对白做受69| a成人v在线| 91蜜桃网站免费观看| 日韩一级淫片| 秋霞在线观看一区二区三区| 日韩精品永久网址| dy888午夜| 西西人体一区二区| 91女神在线观看| 久久综合狠狠综合久久综合88| 99自拍偷拍视频| 亚洲国产精品一区二区久久| 伊人网免费视频| 精品国产凹凸成av人网站| 三级毛片在线免费看| 久久夜精品香蕉| 美女的胸无遮挡在线观看| 国产精品成人播放| 极品束缚调教一区二区网站| 日韩免费电影一区二区三区| 欧美大黑bbbbbbbbb在线| 国产91xxx| 老司机精品视频在线| 中文字幕人妻熟女在线| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩一区二区不卡视频| 91国产丝袜在线播放| 亚洲乱码国产乱码精品精软件| 亚洲欧洲一区二区三区在线观看| 免费污视频在线观看| 国产精品久久久久久久久久| xvideos.蜜桃一区二区| 99热一区二区三区| 国产精品永久| 亚洲精品久久久中文字幕| 久久这里只有精品6| 欧美精品入口蜜桃| 欧美一级高清大全免费观看| 国产免费视频在线| 国色天香2019中文字幕在线观看| 精品一区二区三区中文字幕| 欧美一区二区三区四区在线观看地址| 亚洲最新色图| 另类小说色综合| 久久综合国产精品| 亚洲精品视频在线观看免费视频| 欧美图片一区二区三区| 久草视频视频在线播放| 欧美激情一区二区三区成人| 日韩三级久久| 国产卡一卡二在线| 日本美女视频一区二区| 精品无码在线观看| 欧美日韩中文在线| 黑人精品一区二区| 欧美成人激情图片网| 久久婷婷五月综合色丁香| 亚洲精品免费在线看| 老司机精品久久| www.啪啪.com| 欧美性猛交99久久久久99按摩| 狠狠躁日日躁夜夜躁av| 久久免费视频这里只有精品| 亚洲精品一二三**| 无码人妻aⅴ一区二区三区日本| 国产一区二区在线视频| 国产探花视频在线播放| 欧美日韩一区二区欧美激情| 国产人成在线观看| 日韩av电影院| 久久性感美女视频| 中文字幕国产传媒| 国产精品不卡一区| 在线观看xxxx| 日韩色av导航| 日韩在线精品强乱中文字幕| 欧美日韩亚洲国产成人| 国产成人高清视频| 九九九国产视频| 精品999在线播放| 深夜成人在线| 青青草久久网络| 久久国产精品色| 国产精品三区在线观看| 日韩欧美视频一区| 久色国产在线| 精品国产一区二区三区麻豆小说| 一本色道久久综合亚洲精品不| 中文字幕第4页| 在线观看一区二区视频| а√中文在线8| 国产精品一区二区三区在线观| 在线日韩欧美| 丁香花五月婷婷| 欧美日韩国产影片| av成人影院在线| 国产高清精品一区二区| 国产欧美短视频| 五月婷婷综合在线观看| 欧美亚洲高清一区二区三区不卡| 欧美三级理伦电影| 国产区精品视频| 国产美女精品| 快灬快灬一下爽蜜桃在线观看| 精品国产欧美一区二区| 性爽视频在线| avove在线观看| 91在线免费播放| 亚洲欧美偷拍一区| 欧美精品性视频| 在线一级成人| 女人扒开腿免费视频app| 亚洲va韩国va欧美va| 国产激情视频在线观看| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲欧美视频| 加勒比av在线播放|