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

SpringBoot與Eventuate Tram整合,實現銀行轉賬最終一致性系統

開發 架構
Eventuate Tram 是一個用于構建微服務架構的開源框架,提供事件驅動的消息傳遞和最終一致性保證,幫助企業高效地管理和協調分布式系統中的復雜業務邏輯。

Eventuate Tram 是一個用于構建微服務架構的開源框架,提供事件驅動的消息傳遞和最終一致性保證,幫助企業高效地管理和協調分布式系統中的復雜業務邏輯。

我們為什么選擇Eventuate Tram?

  • 解耦和服務獨立性:銀行轉賬系統通常涉及多個服務(如賬戶服務、轉賬服務等)。Eventuate Tram 提供了一種事件驅動的方式來解耦這些服務,使得每個服務可以獨立開發、部署和擴展。
  • 靈活性:隨著業務的發展,新的服務可能會被引入或現有服務需要重構。Eventuate Tram 的事件驅動模型允許這種靈活的變化而不需要大規模的重構。
  • 分布式事務管理:傳統的兩階段提交(2PC)在高并發環境下性能較差且復雜度高。Eventuate Tram 通過事件溯源和補償機制實現了最終一致性,確保即使在分布式環境中也能保持數據的一致性。
  • 冪等性和重試機制:Eventuate Tram 支持冪等處理和自動重試,確保消息傳遞的可靠性,防止重復處理導致的數據不一致問題。
  • 異步通信:Eventuate Tram 使用事件總線進行異步通信,提高了系統的吞吐量和響應速度。這對于實時性強的應用場景尤為重要。
  • 事件存儲:Eventuate Tram 提供了內置的事件存儲機制,記錄所有發生的業務事件。這不僅有助于審計和調試,還能在系統故障后快速恢復狀態。
  • 多種消息代理支持:Eventuate Tram 支持多種消息代理(如 RabbitMQ、Kafka 等),可以根據現有的基礎設施進行選擇和集成。
  • 代碼生成工具:Eventuate 提供了一些代碼生成工具和模板,幫助開發者快速搭建項目結構,減少了樣板代碼的數量。

哪些公司使用Eventuate Tram?

  • Capital One 是一家美國的金融服務公司,以其創新的技術解決方案而聞名。Capital One 使用 Eventuate Tram 來構建其微服務架構,特別是在需要高一致性和可擴展性的金融應用中。
  • CERN (歐洲核子研究組織) 利用 Eventuate Tram 來處理復雜的實驗數據流和實時分析任務,確保數據的一致性和系統的可靠性。
  • Adidas 是世界著名的運動用品品牌。Adidas 在數字化轉型過程中采用了 Eventuate Tram 來構建其電子商務平臺的微服務架構,提高系統的靈活性和響應速度。
  • Accenture 是全球領先的咨詢、技術服務和外包公司。Accenture 在為多個客戶實施微服務架構時推薦并使用了 Eventuate Tram,特別是在需要最終一致性和復雜事件處理的場景中。
  • Red Hat 支持并推廣了 Eventuate Tram 作為其微服務生態系統的一部分,幫助開發者構建可靠的分布式應用。

代碼實操

創建account-service

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>account-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.eventuate.tram</groupId>
            <artifactId>eventuate-tram-spring-jdbc</artifactId>
            <version>0.26.0.RELEASE</version><!-- Eventuate Tram JDBC支持 -->
        </dependency>
        <dependency>
            <groupId>io.eventuate.tram</groupId>
            <artifactId>eventuate-tram-messaging-rabbitmq</artifactId>
            <version>0.26.0.RELEASE</version><!-- Eventuate Tram RabbitMQ消息代理支持 -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId><!-- JPA數據訪問支持 -->
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

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

application.properties

server.port=8081 # 應用監聽端口

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

# Hibernate自動建表策略
spring.jpa.hibernate.ddl-auto=update

# RabbitMQ配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

Account.java

package com.example.accountservice;

import io.eventuate.tram.events.publisher.DomainEventPublisher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.Collections;

@Service
publicclass AccountService {

    @Autowired
    private AccountRepository accountRepository; // 賬戶倉庫,用于數據庫操作

    @Autowired
    private DomainEventPublisher domainEventPublisher; // 域事件發布器,用于發布事件

    /**
     * 減少賬戶余額
     * @param accountId 賬戶ID
     * @param amount 需要減少的金額
     */
    @Transactional
    public void debit(String accountId, double amount) {
        Account account = accountRepository.findById(accountId).orElseThrow(() -> new RuntimeException("Account not found")); // 根據賬戶ID查找賬戶,如果找不到則拋出異常
        if (account.getBalance() < amount) { // 檢查賬戶余額是否足夠
            thrownew RuntimeException("Insufficient balance"); // 如果余額不足,則拋出異常
        }
        account.setBalance(account.getBalance() - amount); // 減少賬戶余額
        accountRepository.save(account); // 保存賬戶信息到數據庫
        domainEventPublisher.publish(Account.class, account.getId(), Collections.singletonList(new AccountDebitedEvent(amount))); // 發布賬戶被借記的事件
    }

    /**
     * 增加賬戶余額
     * @param accountId 賬戶ID
     * @param amount 需要增加的金額
     */
    @Transactional
    public void credit(String accountId, double amount) {
        Account account = accountRepository.findById(accountId).orElseThrow(() -> new RuntimeException("Account not found")); // 根據賬戶ID查找賬戶,如果找不到則拋出異常
        account.setBalance(account.getBalance() + amount); // 增加賬戶余額
        accountRepository.save(account); // 保存賬戶信息到數據庫
        domainEventPublisher.publish(Account.class, account.getId(), Collections.singletonList(new AccountCreditedEvent(amount))); // 發布賬戶被貸記的事件
    }
}

AccountRepository.java

package com.example.accountservice;

import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 賬戶倉庫接口,繼承自JpaRepository,用于對Account實體進行CRUD操作
 */
public interface AccountRepository extends JpaRepository<Account, String> {}

AccountServiceApplication.java

package com.example.accountservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring Boot應用啟動類
 */
@SpringBootApplication
public class AccountServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(AccountServiceApplication.class, args); // 啟動Spring Boot應用
    }
}

AccountController.java

package com.example.accountservice.controller;

import com.example.accountservice.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 控制器類,處理HTTP請求
 */
@RestController
@RequestMapping("/accounts")
publicclass AccountController {

    @Autowired
    private AccountService accountService; // 注入AccountService

    /**
     * 處理借記賬戶的HTTP POST請求
     * @param accountId 賬戶ID
     * @param amount 借記金額
     */
    @PostMapping("/{accountId}/debit/{amount}")
    public void debit(@PathVariable String accountId, @PathVariable double amount) {
        accountService.debit(accountId, amount); // 調用AccountService的debit方法
    }

    /**
     * 處理貸記賬戶的HTTP POST請求
     * @param accountId 賬戶ID
     * @param amount 貸記金額
     */
    @PostMapping("/{accountId}/credit/{amount}")
    public void credit(@PathVariable String accountId, @PathVariable double amount) {
        accountService.credit(accountId, amount); // 調用AccountService的credit方法
    }
}

AccountDebitedEvent.java

package com.example.accountservice.event;

/**
 * 賬戶借記事件類
 */
publicclass AccountDebitedEvent {
    privatedouble amount; // 借記金額

    public AccountDebitedEvent(double amount) {
        this.amount = amount; // 構造函數初始化借記金額
    }

    // 獲取借記金額的方法
    public double getAmount() {
        return amount;
    }

    // 設置借記金額的方法
    public void setAmount(double amount) {
        this.amount = amount;
    }
}

AccountCreditedEvent.java

/**
 * 賬戶貸記事件類
 */
publicclass AccountCreditedEvent {
    privatedouble amount; // 貸記金額

    public AccountCreditedEvent(double amount) {
        this.amount = amount; // 構造函數初始化貸記金額
    }

    // 獲取貸記金額的方法
    public double getAmount() {
        return amount;
    }

    // 設置貸記金額的方法
    public void setAmount(double amount) {
        this.amount = amount;
    }
}

TransferEventHandler.java

package com.example.accountservice.handler;

import com.example.accountservice.event.TransferMadeEvent;
import com.example.accountservice.AccountService;
import io.eventuate.tram.events.subscriber.DomainEventEnvelope;
import io.eventuate.tram.events.subscriber.EventHandlerMethod;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 事件處理器類,處理轉賬完成事件
 */
@Component
publicclass TransferEventHandler {

    @Autowired
    private AccountService accountService; // 注入AccountService

    /**
     * 處理轉賬完成事件的方法
     * @param event 包含轉賬完成事件的對象
     */
    @EventHandlerMethod
    public void handle(DomainEventEnvelope<TransferMadeEvent> event) {
        TransferMadeEvent transferMadeEvent = event.getEvent(); // 獲取轉賬完成事件對象
        accountService.credit(transferMadeEvent.getCreditAccountId(), transferMadeEvent.getAmount()); // 調用AccountService的credit方法,增加目標賬戶的余額
    }
}

創建transfer-service

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>transfer-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.eventuate.tram</groupId>
            <artifactId>eventuate-tram-spring-jdbc</artifactId>
            <version>0.26.0.RELEASE</version><!-- Eventuate Tram JDBC支持 -->
        </dependency>
        <dependency>
            <groupId>io.eventuate.tram</groupId>
            <artifactId>eventuate-tram-messaging-rabbitmq</artifactId>
            <version>0.26.0.RELEASE</version><!-- Eventuate Tram RabbitMQ消息代理支持 -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

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

application.properties

server.port=8082

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

# Hibernate自動建表策略
spring.jpa.hibernate.ddl-auto=update

# RabbitMQ配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

Transfer.java

package com.example.transferservice;

import io.eventuate.tram.events.publisher.DomainEventPublisher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.Collections;

/**
 * 轉賬服務類
 */
@Service
publicclass TransferService {

    @Autowired
    private TransferRepository transferRepository; // 轉賬倉庫,用于數據庫操作

    @Autowired
    private DomainEventPublisher domainEventPublisher; // 域事件發布器,用于發布事件

    /**
     * 執行轉賬操作
     * @param cmd 包含轉賬命令的對象
     */
    @Transactional
    public void makeTransfer(MakeTransferCommand cmd) {
        Transfer transfer = new Transfer(cmd.getSourceAccountId(), cmd.getTargetAccountId(), cmd.getAmount()); // 創建轉賬記錄
        transferRepository.save(transfer); // 保存轉賬記錄到數據庫
        domainEventPublisher.publish(Transfer.class, transfer.getId(),
                Collections.singletonList(new TransferMadeEvent(cmd.getSourceAccountId(), cmd.getTargetAccountId(), cmd.getAmount()))); // 發布轉賬完成事件
    }
}

TransferRepository.java

package com.example.transferservice;

import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 轉賬倉庫接口,繼承自JpaRepository,用于對Transfer實體進行CRUD操作
 */
public interface TransferRepository extends JpaRepository<Transfer, String> {}

TransferServiceApplication.java

package com.example.transferservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring Boot應用啟動類
 */
@SpringBootApplication
public class TransferServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(TransferServiceApplication.class, args); // 啟動Spring Boot應用
    }
}

TransferController.java

package com.example.transferservice.controller;

import com.example.transferservice.MakeTransferCommand;
import com.example.transferservice.TransferService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 控制器類,處理HTTP請求
 */
@RestController
@RequestMapping("/transfers")
publicclass TransferController {

    @Autowired
    private TransferService transferService; // 注入TransferService

    /**
     * 處理轉賬的HTTP POST請求
     * @param cmd 包含轉賬命令的對象
     */
    @PostMapping
    public void makeTransfer(@RequestBody MakeTransferCommand cmd) {
        transferService.makeTransfer(cmd); // 調用TransferService的makeTransfer方法執行轉賬操作
    }
}

MakeTransferCommand.java

package com.example.transferservice.command;

/**
 * 轉賬命令類,包含轉賬所需的信息
 */
publicclass MakeTransferCommand {
    private String sourceAccountId; // 源賬戶ID
    private String targetAccountId; // 目標賬戶ID
    privatedouble amount; // 轉賬金額

    public MakeTransferCommand(String sourceAccountId, String targetAccountId, double amount) {
        this.sourceAccountId = sourceAccountId; // 初始化源賬戶ID
        this.targetAccountId = targetAccountId; // 初始化目標賬戶ID
        this.amount = amount; // 初始化轉賬金額
    }

    // 獲取源賬戶ID的方法
    public String getSourceAccountId() {
        return sourceAccountId;
    }

    // 設置源賬戶ID的方法
    public void setSourceAccountId(String sourceAccountId) {
        this.sourceAccountId = sourceAccountId;
    }

    // 獲取目標賬戶ID的方法
    public String getTargetAccountId() {
        return targetAccountId;
    }

    // 設置目標賬戶ID的方法
    public void setTargetAccountId(String targetAccountId) {
        this.targetAccountId = targetAccountId;
    }

    // 獲取轉賬金額的方法
    public double getAmount() {
        return amount;
    }

    // 設置轉賬金額的方法
    public void setAmount(double amount) {
        this.amount = amount;
    }
}

TransferMadeEvent.java

package com.example.transferservice.event;

/**
 * 轉賬完成事件類
 */
publicclass TransferMadeEvent {
    private String debitAccountId; // 借記賬戶ID
    private String creditAccountId; // 貸記賬戶ID
    privatedouble amount; // 轉賬金額

    public TransferMadeEvent(String debitAccountId, String creditAccountId, double amount) {
        this.debitAccountId = debitAccountId; // 初始化借記賬戶ID
        this.creditAccountId = creditAccountId; // 初始化貸記賬戶ID
        this.amount = amount; // 初始化轉賬金額
    }

    // 獲取借記賬戶ID的方法
    public String getDebitAccountId() {
        return debitAccountId;
    }

    // 設置借記賬戶ID的方法
    public void setDebitAccountId(String debitAccountId) {
        this.debitAccountId = debitAccountId;
    }

    // 獲取貸記賬戶ID的方法
    public String getCreditAccountId() {
        return creditAccountId;
    }

    // 設置貸記賬戶ID的方法
    public void setCreditAccountId(String creditAccountId) {
        this.creditAccountId = creditAccountId;
    }

    // 獲取轉賬金額的方法
    public double getAmount() {
        return amount;
    }

    // 設置轉賬金額的方法
    public void setAmount(double amount) {
        this.amount = amount;
    }
}

AccountEventHandler.java

package com.example.transferservice.handler;

import com.example.transferservice.event.AccountDebitedEvent;
import com.example.transferservice.TransferService;
import io.eventuate.tram.events.subscriber.DomainEventEnvelope;
import io.eventuate.tram.events.subscriber.EventHandlerMethod;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 事件處理器類,處理賬戶借記事件
 */
@Component
publicclass AccountEventHandler {

    @Autowired
    private TransferService transferService; // 注入TransferService

    /**
     * 處理賬戶借記事件的方法
     * @param event 包含賬戶借記事件的對象
     */
    @EventHandlerMethod
    public void handle(DomainEventEnvelope<AccountDebitedEvent> event) {
        AccountDebitedEvent accountDebitedEvent = event.getEvent(); // 獲取賬戶借記事件對象
        // 這里可以添加額外的邏輯,當賬戶被借記時執行的操作
    }
}

測試

curl -X POST http://localhost:8082/transfers -H "Content-Type: application/json" -d '{"sourceAccountId": "account1", "targetAccountId": "account2", "amount": 150}'

測試結果

無返回內容,說明操作成功。


責任編輯:武曉燕 來源: Java知識日歷
相關推薦

2021-07-26 06:33:42

CRDT數據CAP

2017-07-25 14:38:56

數據庫一致性非鎖定讀一致性鎖定讀

2024-06-04 09:51:48

2016-12-19 18:41:09

哈希算法Java數據

2023-07-25 09:52:00

本地事務宕機

2022-07-21 06:54:28

微服務系統RocketMQ

2019-10-12 09:04:59

微服務架構CAP

2020-11-24 09:03:41

一致性MySQLMVCC

2022-12-14 08:23:30

2024-05-28 00:50:00

RedisMySQL緩存

2024-12-11 09:16:38

2022-11-10 07:49:09

hash算法代碼

2015-10-19 10:42:37

分布式一致性應用系統

2021-06-22 10:22:08

業務IT一致性首席信息官

2025-02-10 03:00:00

2021-06-16 08:33:02

分布式事務ACID

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數據

2025-09-02 00:30:00

系統視頻技術

2020-02-25 23:39:11

架構運維技術
點贊
收藏

51CTO技術棧公眾號

欧美日韩国产高清一区二区| 国产在线看一区| 亚洲美女av在线播放| 少妇人妻互换不带套| aⅴ在线视频男人的天堂| 久久99久久精品欧美| 欧美第一黄色网| 亚洲天堂久久新| 日韩成人精品一区二区三区| 亚洲大片一区二区三区| 日韩资源av在线| 精品免费久久久| 久久精品日产第一区二区| 日韩视频免费在线| 久久中文字幕人妻| 国产高清日韩| 色综合一区二区三区| 大地资源网在线观看免费官网| 亚洲 精品 综合 精品 自拍| 精品综合久久久久久8888| 秋霞成人午夜鲁丝一区二区三区| 99久久婷婷国产综合| 国产精品三级| 亚洲国产另类 国产精品国产免费| 中文字幕第38页| 国产在线精彩视频| 亚洲日本韩国一区| 亚洲激情电影在线| 三级无遮挡在线观看| 国产精品影视在线观看| 国产精品视频资源| 中文字幕在线欧美| 日韩一区二区久久| 久久久久久久国产精品| 国产一二三区精品| 91亚洲国产成人久久精品| 亚洲国产美女久久久久| 一级黄色免费视频| 精品中文在线| 91精品欧美福利在线观看| 国产一级特黄a大片免费| 国产免费拔擦拔擦8x在线播放| 亚洲精品ww久久久久久p站| 亚洲免费视频一区| 91精品国产毛片武则天| 日韩成人av毛片| 欧美日韩爆操| 欧美精品做受xxx性少妇| 日韩av毛片在线观看| 精品一二三区| 一本大道亚洲视频| 熟女少妇内射日韩亚洲| 欧美男男gaytwinkfreevideos| 亚洲成人网在线| 91九色蝌蚪porny| 久久免费视频66| 欧美精品一区二区久久婷婷| 超碰人人cao| 韩国三级成人在线| 欧美一区午夜视频在线观看| 成年人网站av| 亚洲精品一区二区三区中文字幕 | 日韩色图在线观看| 欧美资源在线| 国产精品网红直播| 国产欧美久久久| 成人污视频在线观看| 国产青春久久久国产毛片| 日韩中文字幕综合| 久久这里只有精品视频网| 欧美精品成人一区二区在线观看| 极品白浆推特女神在线观看| 日本一区二区三区免费乱视频| 亚洲电影一二三区| av片在线观看永久免费| 亚洲线精品一区二区三区八戒| 免费拍拍拍网站| 午夜久久中文| 欧美在线视频不卡| 国产欧美精品一二三| 97久久超碰| 亚洲女人被黑人巨大进入| 国产成人在线网址| 国内一区二区三区| 国产精品电影一区| 成 人片 黄 色 大 片| 97精品视频在线观看自产线路二| 色播五月综合| av电影在线免费| 欧美艳星brazzers| 性感美女一区二区三区| 成人欧美一区二区三区黑人一| 成人看片网页| 91精品国产综合久久小美女| 免费黄色三级网站| 成人羞羞动漫| 亚洲3p在线观看| 一级片视频免费| 91片在线免费观看| 99亚洲国产精品| 免费观看亚洲| 欧美一二三区精品| 99精品欧美一区二区| 精品9999| 91久久久久久久久| 久久这里精品| 亚洲一级在线观看| 韩国中文字幕av| 日本在线中文字幕一区| 超在线视频97| 亚洲无码久久久久| 久久久蜜臀国产一区二区| 狠狠干视频网站| 日韩电影精品| 国产一区二区三区精品久久久| 久久久久久久极品内射| 激情久久五月天| 日韩福利影院| 黄色综合网址| 亚洲精品国产免费| 精品无码久久久久| 国产又黄又大久久| 亚洲国内在线| 日韩精品三区| 日韩成人在线视频观看| 久久免费黄色网址| 国产一区二区福利视频| 亚洲日本理论电影| 亚洲不卡系列| 揄拍成人国产精品视频| 国产黄色免费观看| 26uuu亚洲婷婷狠狠天堂| 欧美视频在线观看视频| 一区二区在线视频观看| 欧美久久精品一级黑人c片| 亚洲熟女乱色一区二区三区久久久| 久久婷婷成人综合色| 亚洲自偷自拍熟女另类| 全国精品免费看| 69**夜色精品国产69乱| 日本黄色免费视频| 亚洲mv大片欧洲mv大片精品| 亚洲日本久久久| 国产精品久久久久精| 亚洲电影影音先锋| 91在线观看免费| 精品视频在线一区二区| 欧美日韩免费观看一区三区| 国产99在线 | 亚洲| 日韩在线一区二区| 日产精品一线二线三线芒果| 午夜精品成人av| 国产亚洲精品成人av久久ww| 国语对白做受69按摩| 欧美激情综合在线| 国产无遮挡猛进猛出免费软件 | 国产精品一区二区免费不卡 | 欧美一区二区三区四区在线观看| 欧美亚洲色综久久精品国产| 久久99精品久久只有精品| 一区二区三区四区视频在线| 欧美综合影院| 欧美www在线| 日本黄视频在线观看| 欧美性猛交xxx| 亚洲熟妇一区二区三区| 蜜桃视频在线观看一区二区| 亚洲一区二区三区加勒比| 国产一区二区三区| 高清欧美性猛交xxxx黑人猛交| 天堂网av在线播放| 日本精品视频一区二区| 亚洲一二三四五六区| 国产一区中文字幕| 99视频在线免费播放| 亚洲三级精品| 成人欧美一区二区三区黑人| 青春草在线免费视频| 亚洲精品久久久久久久久久久| 加勒比在线一区| 综合久久给合久久狠狠狠97色 | 国产日韩欧美综合一区| 三日本三级少妇三级99| 一级成人国产| 亚洲日本精品国产第一区| 波多野结衣欧美| 国产精品久久久av久久久| 日本成人不卡| 亚洲色图av在线| 成 人 黄 色 片 在线播放| 色综合久久久久| 久久久久亚洲av无码专区体验| 91小视频免费观看| 亚洲天堂伊人网| 久久精品国产亚洲AV无码麻豆 | 人妻一区二区三区| 欧美日韩中文字幕一区| 久久精品女人毛片国产| 国产精品久久久一本精品| 日本不卡视频一区| 久久激情综合网| 国产成人亚洲精品无码h在线| 91成人国产| 日韩欧美国产二区| jizz性欧美2| 成人网址在线观看| 麻豆精品蜜桃| 97成人精品区在线播放| 伊人春色在线观看| 在线观看成人黄色| 亚洲aⅴ在线观看| 日韩精品专区在线影院观看| 成人黄色片在线观看| 欧美午夜影院在线视频| 久久久久成人网站| 一区精品在线播放| a级在线免费观看| 99国产精品久| 日本一级大毛片a一| 极品少妇xxxx偷拍精品少妇| 宅男噜噜噜66国产免费观看| 国产精品女主播一区二区三区| 大荫蒂性生交片| 中文一区一区三区免费在线观看| 日韩av在线一区二区三区| 丝袜美腿一区二区三区动态图| 成人资源av| 欧美a在线观看| 亚洲一区二区三区香蕉 | 性高爱久久久久久久久| 国产精品美女久久久久久久网站| 亚洲精品久久久久久| 久久精品av麻豆的观看方式| 久久99999| 日本网站在线观看一区二区三区 | 欧美黄色免费看| 亚洲欧美偷拍卡通变态| 成人在线观看高清| 亚洲四区在线观看| 免费成人美女女在线观看| 国产清纯白嫩初高生在线观看91| www.久久国产| 国产亚洲短视频| 欧美日韩生活片| 国产精品久久久久影院色老大 | 国产精品九九视频| 91在线观看免费视频| 欧美在线一级片| 99re8在线精品视频免费播放| 少妇特黄一区二区三区| 久久久美女艺术照精彩视频福利播放| 国产网站无遮挡| 久久久亚洲高清| www.黄色在线| 国产精品第五页| 中文字幕另类日韩欧美亚洲嫩草| 亚洲黄色小说网站| 久久综合成人网| 欧美日韩激情小视频| 国产一级免费视频| 伊人久久大香线蕉无限次| 欧美成人sm免费视频| 草莓福利社区在线| 欧美精品激情在线| 欧美sm一区| 国产精品高清在线观看| 四虎国产精品免费久久5151| 91嫩草在线视频| 国内露脸中年夫妇交换精品| 欧美日韩在线精品| 国产精品黑丝在线播放| 丰满人妻一区二区三区53号 | 国内精品视频一区| 高清视频在线观看三级| 国产精品白嫩初高中害羞小美女| 日韩毛片网站| 国产欧美亚洲日本| 人人狠狠综合久久亚洲婷| 青青草视频国产| 香蕉久久久久久久av网站| 在线观看免费视频高清游戏推荐| 国产福利精品一区| 无码人妻精品一区二区中文| 亚洲欧美日韩小说| 精品国产一区二区三区四| 在线不卡中文字幕播放| 手机福利在线| 欧美精品一区三区| 希岛爱理一区二区三区av高清| 91亚洲精品久久久| 在线一级成人| 日本大片免费看| 麻豆免费看一区二区三区| 性色av蜜臀av浪潮av老女人 | 精品无码m3u8在线观看| 欧美综合一区二区三区| 风流老熟女一区二区三区| 在线亚洲欧美视频| 日本三级在线观看网站| 国产精品网站视频| 西瓜成人精品人成网站| 超碰10000| 久久国产婷婷国产香蕉| 欧美高清性xxxx| 一区二区三区色| 中文字幕一区二区三区四区视频| 欧美激情一区在线| 精品日韩美女| 红桃成人av在线播放| 日本xxxxxxxxxx75| 国产精品一区二区三区99| 综合 欧美 亚洲日本| 疯狂欧美牲乱大交777| www.蜜桃av.com| 久久精品视频在线观看| 亚洲天堂一区二区| 久久精品人成| 亚洲成人原创| 国产精品嫩草69影院| 亚洲少妇最新在线视频| 中文 欧美 日韩| 亚洲天堂第一页| 午夜不卡影院| 久久国产精品精品国产色婷婷| 好吊一区二区三区| 欧美xxxx黑人| 亚洲欧美日韩中文字幕一区二区三区 | 精品福利在线观看| 亚洲奶汁xxxx哺乳期| 欧美精品做受xxx性少妇| 国产一区二区三区免费观看在线| 亚洲在线视频一区二区| 天堂影院一区二区| 久久精品国产亚洲av麻豆| 精品久久久国产| 婷婷丁香花五月天| 韩国福利视频一区| 激情视频极品美女日韩| 无码粉嫩虎白一线天在线观看| 国产成人日日夜夜| 欧美久久久久久久久久久久| 日韩欧美在线不卡| 国产精品探花在线| 国产精品免费一区二区三区| 狠狠88综合久久久久综合网| 色悠悠在线视频| 午夜国产精品影院在线观看| 性感美女一级片| 国产成人亚洲综合| 欧美亚洲国产精品久久| 亚洲36d大奶网| 亚洲三级电影全部在线观看高清| 国产日韩免费视频| 欧美国产一区二区三区| 美女一区2区| 欧美日韩大尺度| 国产精品萝li| 99久久精品无免国产免费| 欧美高清无遮挡| 台湾佬综合网| 8x8x最新地址| 亚洲欧美日韩人成在线播放| 女人18毛片水真多18精品| 91黑丝在线观看| sdde在线播放一区二区| 亚洲欧美手机在线| 亚洲综合在线观看视频| 天堂v视频永久在线播放| 国产精品欧美久久久| 中文字幕日韩一区二区不卡| 中文字幕免费高清视频| 色屁屁一区二区| 国产网友自拍视频导航网站在线观看| 激情图区综合网| 亚洲毛片亚洲毛片亚洲毛片| 欧美一级一区二区| 日本三级一区| 影音先锋欧美在线| 成人免费看黄yyy456| 免费精品一区二区| 欧美日韩成人在线播放| 亚洲涩涩av| 亚洲精品一区二区18漫画| 色婷婷久久综合| jizz性欧美10| 秋霞久久久久久一区二区| 狠狠色丁香婷综合久久| 中文字幕一区二区三区精品| 色哟哟网站入口亚洲精品| 88久久精品| 黄色永久免费网站| 午夜在线成人av| 国产精品久久麻豆| 欧美人xxxxx| 国产很黄免费观看久久| 欧美精品一二三四区| 欧美激情欧美激情在线五月| 成人高清电影网站| 亚洲制服丝袜在线播放| 欧美高清视频www夜色资源网|