精品欧美一区二区三区在线观看 _久久久久国色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免费版黄色| 久久夜色精品亚洲| 国产亚洲一区二区三区啪| 欧美日韩亚洲丝袜制服| 欧美一级爱爱视频| 黄色在线网站| 国产一区日韩二区欧美三区| 国内精品久久久久| 大胸美女被爆操| 国产精品黄网站| 欧美少妇一区二区| 国产精品12345| 快射视频在线观看| 91影院在线观看| 成人激情春色网| 特级做a爱片免费69| 88国产精品视频一区二区三区| 亚洲成人精品久久| 午夜精品免费看| 在线观看爽视频| 亚洲精品你懂的| 97久久人人超碰caoprom欧美| 无码人妻av免费一区二区三区| 亚洲在线久久| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 欧美成人三级在线| 成人免费毛片播放| a级片在线免费| 亚洲少妇屁股交4| 欧美日韩日本网| 一级黄色a毛片| 久久久亚洲人| 91国在线精品国内播放| 欧美一级片在线视频| 精品在线观看入口| 日韩高清有码在线| 一区二区在线免费观看视频| 婷婷成人av| 欧美日韩和欧美的一区二区| 99精品免费在线观看| 538视频在线| 亚洲国产一区二区三区| 国产日产欧美一区二区| 看黄网站在线观看| 国产精品国产自产拍高清av王其| 日韩不卡av| 国自产拍在线网站网址视频| 久久综合九色综合欧美就去吻| 国产日韩亚洲精品| 手机在线不卡av| 成人小视频在线观看| 91麻豆精品秘密入口| 国产高中女学生第一次| 国产精品影音先锋| 99久久久精品免费观看国产| 精品国产乱码一区二区三| 国产老女人精品毛片久久| 91在线观看免费高清| 99精品在线视频观看| 国产精品一级片在线观看| 91在线观看免费| www.色亚洲| 成人av一区二区三区| 国产亚洲一区二区三区在线播放 | 亚洲跨种族黑人xxx| 日本高清www| 国内精品久久久久久久影视简单| 亚洲天堂影视av| av在线免费播放网址| 亚洲国产精品91| 欧美日韩国产va另类| 日本网站免费观看| 先锋影音久久久| 国产精品久久久久久久久久久不卡| 中文字幕永久免费视频| 国产在线播放一区二区三区| 国产精品jizz视频| 日本一区高清| 国产精品传媒在线| 日本免费a视频| 在线最新版中文在线| 日本高清成人免费播放| 爽爽爽在线观看| 免费看久久久| 最近2019年日本中文免费字幕| 亚洲熟女毛茸茸| 亚洲成人在线| 国产精品成人一区| 99久久夜色精品国产亚洲| 成人av网在线| 亚洲欧洲精品在线| 国产一线二线在线观看 | 另类图片亚洲另类| 亚洲日本视频在线观看| 成人观看免费视频| 婷婷激情综合| 91tv亚洲精品香蕉国产一区7ujn| 最近中文字幕在线观看视频| 国产福利91精品一区| 欧美日韩在线观看一区二区三区 | 91热门视频在线观看| 亚洲精品久久区二区三区蜜桃臀| 秋霞在线午夜| 欧美三区在线观看| 中国一级特黄录像播放| 999国产精品视频| 欧美综合在线观看| www日本视频| 国产精品色噜噜| 人妻少妇精品无码专区二区| 国产美女精品视频免费播放软件| 亚洲美女喷白浆| 久久久久久久蜜桃| 久久99精品一区二区三区三区| 国产一区二区三区四区hd| 麻豆传媒在线完整视频| 欧洲另类一二三四区| 国产xxxx视频| 欧美日本一区二区视频在线观看| 国产精品入口免费视频一| 污污视频在线观看网站| 一区二区三区视频在线看| 中文字幕在线综合| 国产传媒欧美日韩成人精品大片| 久久琪琪电影院| 99久久精品无免国产免费| 国产精品久久久久久久裸模| 亚洲精品中文字幕无码蜜桃| 欧美黑人做爰爽爽爽| 久久久久久久久久国产精品| 国产麻豆免费视频| 国产精品视频观看| 天天干在线影院| 国产精品入口久久| 欧美影院在线播放| 午夜福利理论片在线观看| 亚洲一区二区三区四区在线观看 | 欧美一区二区三区久久久| 99视频国产精品| 青青青青草视频| 高清精品视频| 78色国产精品| 日本一二三区在线视频| 天天综合色天天综合色h| 黑人玩弄人妻一区二区三区| 国产精品v欧美精品v日本精品动漫| 成人女保姆的销魂服务| 日本福利专区在线观看| 9191久久久久久久久久久| 午夜国产福利视频| 久久91精品国产91久久小草| 黄色一级片网址| 国产精品视频首页| 久久99久久久久久久噜噜| 韩国av免费在线| 精品国产精品三级精品av网址| 黄色工厂在线观看| 日韩专区中文字幕一区二区| 五月天色一区| 未满十八勿进黄网站一区不卡| 欧美xxxx18国产| 亚洲成人77777| 午夜精品国产更新| 插吧插吧综合网| 日韩福利电影在线观看| 中文字幕中文字幕在线中心一区| 激情视频亚洲| 国模私拍视频一区| 国产三级视频在线看| 欧美日韩dvd在线观看| 欧美日韩黄色网| 成人av资源站| 男人搞女人网站| 亚洲国产精品91| 久久99久久99精品蜜柚传媒| 成人在线网站| 久久五月天色综合| 色婷婷在线视频| 欧美三级三级三级| 久草福利资源在线观看| 久久久激情视频| 亚洲图片 自拍偷拍| 激情综合自拍| 日韩中文一区二区三区| 亚洲网一区二区三区| 欧美中文在线字幕| 黄色免费网站在线观看| 亚洲国产97在线精品一区| 波多野结衣视频在线看| 一区二区三区不卡视频| 日本xxxxxxxxx18| 国产成人精品一区二区三区网站观看 | 欧美与欧洲交xxxx免费观看 | 欧美三级理论片| 欧美精品18| 日本一区免费| 99re8这里有精品热视频8在线| 国产成人精品在线观看| 日本无删减在线| 在线播放日韩欧美| 手机在线精品视频| 91精品国产入口| 男人的天堂av网站| 亚洲精品国产成人久久av盗摄| 黄色a一级视频| 国产一区二区美女诱惑| 国产免费成人在线| 激情国产一区| 黄色网络在线观看| 欧美特黄一级大片| 久久精彩视频| 亚洲精品一区二区三区在线| 国产99久久精品一区二区 夜夜躁日日躁 | 亚洲欧美国产视频| 成人午夜免费福利| 欧美精品视频www在线观看| 天堂网中文字幕| 亚洲国产cao| 欧美人禽zoz0强交| 国产免费成人在线视频| 中文字幕一区三区久久女搜查官| 国产一区日韩二区欧美三区| 九色91popny| 美女国产精品| 日本一道本久久| 影音国产精品| 欧美极品少妇无套实战| 亚洲乱码电影| 亚洲免费视频播放| 日韩一区自拍| 亚洲精品一区二区三区蜜桃久| 日本一道高清一区二区三区| 成人动漫在线观看视频| 国产区一区二| 成人字幕网zmw| 色综合.com| 国产男女猛烈无遮挡91| 精品久久久网| 国产精品一区二区久久国产| 韩国精品主播一区二区在线观看 | 精品午夜av| 国产日韩精品一区二区| 激情开心成人网| 日韩美女视频免费在线观看| 成人片免费看| 青青精品视频播放| 日韩性xxx| 国产精品日韩欧美大师| 韩国理伦片久久电影网| 国产免费一区视频观看免费| 亚洲精品一区av| 91夜夜未满十八勿入爽爽影院| 九九九九九九精品任你躁 | 麻豆一区一区三区四区| 国产一区二区黄色| 欧美人成在线观看ccc36| 久久超碰亚洲| 久久不见久久见国语| 日韩视频专区| 99精品一区| 欧美 日韩 国产精品| 亚洲午夜电影| 久久精品午夜福利| 精品一区二区三区欧美| 特级特黄刘亦菲aaa级| 99久久综合精品| 性欧美一区二区| 亚洲三级免费电影| 精品无码人妻一区二区三区| 黑人巨大精品欧美一区二区一视频| www.com亚洲| 51久久夜色精品国产麻豆| 午夜美女福利视频| 亚洲免费视频观看| 免费观看在线黄色网| 欧美激情免费在线| 欧洲一级精品| 91在线观看免费高清| 啪啪激情综合网| 亚洲精品在线免费看| 欧美日一区二区三区在线观看国产免| 久久久亚洲精品无码| 日韩精品一级中文字幕精品视频免费观看 | 久久人人爽人人爽人人片| 欧美国产欧美亚州国产日韩mv天天看完整 | 精品人妻人人做人人爽| 久久久精品五月天| 香蕉网在线视频| 久久麻豆一区二区| 99国产精品免费| 午夜精品aaa| 一本到在线视频| 日韩av在线电影网| 黄色av电影在线观看| 欧美一级淫片videoshd| 3d动漫一区二区三区在线观看| 精品国产乱码久久久久软件| 国产精品成久久久久| 欧美色图色综合| 国产不卡视频在线播放| 黄色国产在线播放| 欧美日韩免费在线观看| 国产黄色片网站| 伊人久久精品视频| av电影免费在线看| 亚洲a级在线观看| 国产精品亚洲二区| 久无码久无码av无码| 久久精品国产在热久久| 色欲av无码一区二区三区| 亚洲自拍偷拍麻豆| 91tv国产成人福利| 亚洲色图15p| 手机在线观看av网站| 91成人理论电影| 亚洲成人av| 99sesese| 国产精品污www在线观看| 欧产日产国产69| 欧美刺激脚交jootjob| 欧洲不卡av| 国产精品日韩欧美大师| 国产精品一区二区av交换| 国产美女网站在线观看| 国产超碰在线一区| 草视频在线观看| 欧美一区二区三区在线观看视频| 91最新在线| 国产精品福利观看| 欧洲毛片在线视频免费观看| 免费无码av片在线观看| 成人av网址在线| 91精品国产乱码久久久张津瑜| 日韩美女视频在线| 最新国产露脸在线观看| 92裸体在线视频网站| 久久久久久久久丰满| 午夜大片在线观看| 亚洲人成网站在线| 国产精品欧美激情在线| 精品国内亚洲在观看18黄| 久久亚洲国产精品尤物| 在线精品日韩| 国产一区在线观看视频| 欧美毛片在线观看| 精品国产乱码久久久久久1区2区| 国产在线拍揄自揄拍视频| 精品国产一区二区三区麻豆小说 | 李宗瑞91在线正在播放| 色综合欧美在线视频区| 国产一区二区影视| 国产精品网站大全| 羞羞色午夜精品一区二区三区| 6080国产精品| 亚洲曰韩产成在线| 日韩一级片免费观看| 欧美伊久线香蕉线新在线| 国产欧美日韩影院| 亚洲精品www.| 一区二区三区欧美日| 天天干视频在线| 日韩免费在线视频| 国产精品不卡| 又黄又爽的网站| 欧洲视频一区二区| а√天堂官网中文在线| 高清av免费一区中文字幕| 在线视频日韩| 国产又粗又黄又猛| 日韩一卡二卡三卡四卡| 成入视频在线观看| 污视频在线免费观看一区二区三区| 国内一区二区视频| 日韩成人免费在线视频| 在线不卡国产精品| 亚洲精品一区国产| 日韩无套无码精品| 亚洲麻豆国产自偷在线| 亚洲欧美日韩动漫| 国产免费一区视频观看免费 | 天天操精品视频| 狠狠躁夜夜躁人人爽天天天天97| 成年人视频在线观看免费| 亚洲综合日韩在线| 奶水喷射视频一区| 欧美黑人猛猛猛| 亚洲欧洲偷拍精品| 美女精品久久| 国产日韩一区二区在线观看| 亚洲日本在线a| 日韩porn| 亚洲最大福利视频网站| 天堂午夜影视日韩欧美一区二区| 欧美丰满熟妇bbbbbb| 亚洲欧美综合图区| 91亚洲无吗| 国产无遮挡猛进猛出免费软件 | 九九热最新视频//这里只有精品|