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

一步一步教你:用 Docker Compose 完成 Seata 的整合部署

開發(fā)
本文中我們將深入探索基于 Docker Compose 整合 Seata 的全過程,不僅會詳細介紹每一個步驟,還會剖析其中的關(guān)鍵要點和潛在問題。

在當今分布式系統(tǒng)大行其道的時代,確保數(shù)據(jù)在不同服務(wù)間的一致性和完整性,已然成為開發(fā)者們面臨的關(guān)鍵挑戰(zhàn)之一。分布式事務(wù)管理因此成為了構(gòu)建可靠、高效分布式應(yīng)用不可或缺的一部分。

Seata,作為一款優(yōu)秀的分布式事務(wù)解決方案,為解決分布式環(huán)境下的數(shù)據(jù)一致性問題提供了強大的支持。它致力于提供高性能且易于使用的分布式事務(wù)服務(wù),幫助開發(fā)者輕松應(yīng)對復(fù)雜的業(yè)務(wù)場景。 而 Docker Compose,無疑是容器編排領(lǐng)域的得力助手。它能夠讓我們通過一個簡單的配置文件,便捷地定義和運行多個相互關(guān)聯(lián)的 Docker 容器,極大地提升了開發(fā)和部署的效率,簡化了環(huán)境管理的復(fù)雜度。 那么,當功能強大的 Seata 遇上便捷高效的 Docker Compose,會碰撞出怎樣的火花呢?

在本文中,我們將深入探索基于 Docker Compose 整合 Seata 的全過程,不僅會詳細介紹每一個步驟,還會剖析其中的關(guān)鍵要點和潛在問題。無論你是分布式系統(tǒng)開發(fā)的新手,渴望深入了解分布式事務(wù)管理,還是經(jīng)驗豐富的開發(fā)者,希望借助容器技術(shù)優(yōu)化現(xiàn)有架構(gòu),相信本文都能為你帶來有價值的參考和啟發(fā)。

詳解docker-compose整合seata步驟

1. 實踐案例描述

我們用一共比較簡單的購物下單的實例介紹一下本文示例的業(yè)務(wù),當前業(yè)務(wù)用戶通過接口提交訂單請求,對應(yīng)參數(shù)為如下,分別是用戶賬號id、產(chǎn)品id、購買的產(chǎn)品數(shù)量:

{
    "accountCode": "0932897",
    "productCode": "P001",
    "count": 1
}

然后執(zhí)行如下步驟:

  • 基于傳入的商品id和數(shù)量計算售價。
  • 基于用戶id和商品id、數(shù)量生成訂單信息。
  • 基于售價信息到用戶賬戶上進行扣減。
  • 基于傳入的數(shù)量和商品id進行庫存扣減。

需要注意的是上述的創(chuàng)建訂單、余額扣減、庫存扣減分別對應(yīng)3個服務(wù),這也就意味著一個原子業(yè)務(wù)需要在分布式環(huán)境下保證如下幾個業(yè)務(wù)合理性:

  • 用戶余額不足扣款直接回滾,將生成的訂單信息銷毀。
  • 商品庫存不足同樣回滾訂單和庫存扣減。

所以我們需要借助seata來實現(xiàn)分布式事務(wù)以保證分布式事務(wù)的ACID:

這里我們先給出對應(yīng)的業(yè)務(wù)代碼,后續(xù)我們將通過seata保證這塊分布式事務(wù)的ACID:

public void createOrder(OrderDto orderDTO) {
        Order order = new Order();
        BeanUtils.copyProperties(orderDTO, order);
        //調(diào)用產(chǎn)品服務(wù)獲取商品詳情
        ResultData<ProductDTO> productInfo = productFeign.getByCode(orderDTO.getProductCode());
        //計算總金額
        BigDecimal total = productInfo.getData().getPrice().multiply(new BigDecimal(order.getCount()));
        order.setAmount(total);
        //創(chuàng)建訂單
        save(order);
        //扣減金額
        accountFeign.reduceAccount(orderDTO.getAccountCode(), order.getAmount());
        //扣減商品
        productFeign.deduct(orderDTO.getProductCode(), orderDTO.getCount());

    }

2. 容器編排和基礎(chǔ)環(huán)境配置

既然要用到docker-compose,所以我們就需要創(chuàng)建一個yml文件,以筆者為例創(chuàng)建一個名為seata-compose.yaml的文件,筆者都已給出注釋,內(nèi)容如下:

version: "3"
services:
  seata-server:
    image: seataio/seata-server:1.4.2
    ports:
    # 內(nèi)外部端口映射
    - "8091:8091"
    environment:
    # 端口號和seata的ip地址
    - SEATA_PORT=8091
    - SEATA_IP=x.x.x.x
    volumes:
      # 宿主和容器之間registry.conf文件映射地址
    - "/usr/local/seata/seata-config/registry.conf:/seata-server/resources/registry.conf"
    # 宿主和容器之間file.conf文件映射地址
    - "/usr/local/seata/seata-config/file.conf:/seata-server/resources/file.conf"
    expose:
      # 暴露端口號
    - 8091
    # 容器名稱
    container_name: seata-server

可以看到筆者上文配置中registry.conf宿主存放位置在/usr/local/seata/seata-config/,所以我們需要在這個位置創(chuàng)建registry.conf,以筆者為例,這個registry.conf內(nèi)容如下,可以看到筆者指明了注冊中心的地址、命名空間id以及分組名。

這里唯一需要的注意的就是registry 上指明的cluster 集群節(jié)點名稱,該配置會將seata綁定到nacos對應(yīng)的default節(jié)點上:

registry {
  # 將seata注冊到nacos上
  type = "nacos"
  nacos {
  # nacos地址
    serverAddr = "ip:8848"
    # 命名空間id
    namespace = "63f0dbe6-ac91-4a2e-a88e-82b76f8187b6"
    # 組名
    group = "DEFAULT_GROUP"
    # 集群節(jié)點名稱
    cluster = "default"
  }
}
config {
  # 通過nacos獲取配置
  type = "nacos"
  nacos {
    serverAddr = "ip:8848"
    namespace = "63f0dbe6-ac91-4a2e-a88e-82b76f8187b6"
    group = "DEFAULT_GROUP"
  }
}

3. 將seata常規(guī)配置存到nacos中

完成上述步驟后,我們的seata已經(jīng)可以注冊到nacos上了。只不過我們還需要在上述的命名空間(63f0dbe6-ac91-4a2e-a88e-82b76f8187b6)創(chuàng)建一個seataServer.properties的配置文件,將seata存儲設(shè)置為MySQL存儲,對應(yīng)的配置如下注釋所示:

store.mode=db
#-----db-----
store.db.datasource=druid
store.db.dbType=mysql
# 需要根據(jù)mysql的版本調(diào)整driverClassName
# mysql8及以上版本對應(yīng)的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://ip:3306/seata?useUnicode=true&characterEncoding=utf8&cnotallow=1000&socketTimeout=3000&autoRecnotallow=true&useSSL=false
store.db.user= 用戶
store.db.password= 數(shù)據(jù)庫密碼
# 數(shù)據(jù)庫初始連接數(shù)
store.db.minCnotallow=1
# 數(shù)據(jù)庫最大連接數(shù)
store.db.maxCnotallow=20
# 獲取連接時最大等待時間 默認5000,單位毫秒
store.db.maxWait=5000
# 全局事務(wù)表名 默認global_table
store.db.globalTable=global_table
# 分支事務(wù)表名 默認branch_table
store.db.branchTable=branch_table
# 全局鎖表名 默認lock_table
store.db.lockTable=lock_table
# 查詢?nèi)质聞?wù)一次的最大條數(shù) 默認100
store.db.queryLimit=100


# undo保留天數(shù) 默認7天,log_status=1(附錄3)和未正常清理的undo
server.undo.logSaveDays=7
# undo清理線程間隔時間 默認86400000,單位毫秒
server.undo.logDeletePeriod=86400000
# 二階段提交重試超時時長 單位ms,s,m,h,d,對應(yīng)毫秒,秒,分,小時,天,默認毫秒。默認值-1表示無限重試
# 公式: timeout>=now-globalTransactionBeginTime,true表示超時則不再重試
# 注: 達到超時時間后將不會做任何重試,有數(shù)據(jù)不一致風險,除非業(yè)務(wù)自行可校準數(shù)據(jù),否者慎用
server.maxCommitRetryTimeout=-1
# 二階段回滾重試超時時長
server.maxRollbackRetryTimeout=-1
# 二階段提交未完成狀態(tài)全局事務(wù)重試提交線程間隔時間 默認1000,單位毫秒
server.recovery.committingRetryPeriod=1000
# 二階段異步提交狀態(tài)重試提交線程間隔時間 默認1000,單位毫秒
server.recovery.asynCommittingRetryPeriod=1000
# 二階段回滾狀態(tài)重試回滾線程間隔時間  默認1000,單位毫秒
server.recovery.rollbackingRetryPeriod=1000
# 超時狀態(tài)檢測重試線程間隔時間 默認1000,單位毫秒,檢測出超時將全局事務(wù)置入回滾會話管理器
server.recovery.timeoutRetryPeriod=1000

# 指定SeaTa的命名空間
seata.config.nacos.namespace=63f0dbe6-ac91-4a2e-a88e-82b76f8187b6

4. 創(chuàng)建seata配置庫存儲分支事務(wù)和全局事務(wù)表

上文配置中我們指明一個名為seata_config的數(shù)據(jù)庫,所以我們就需要到創(chuàng)建一個名為seata_config的數(shù)據(jù)庫并刷入分支事務(wù)和全局事務(wù)表以及l(fā)ock_table表:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- 分支事務(wù)表
-- ----------------------------
DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table`  (
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `transaction_id` bigint(20) NULL DEFAULT NULL,
  `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `status` tinyint(4) NULL DEFAULT NULL,
  `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` datetime(6) NULL DEFAULT NULL,
  `gmt_modified` datetime(6) NULL DEFAULT NULL,
  PRIMARY KEY (`branch_id`) USING BTREE,
  INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- 全局事務(wù)表
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table`  (
  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `transaction_id` bigint(20) NULL DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `timeout` int(11) NULL DEFAULT NULL,
  `begin_time` bigint(20) NULL DEFAULT NULL,
  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` datetime NULL DEFAULT NULL,
  `gmt_modified` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`xid`) USING BTREE,
  INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
  INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;




CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(96) DEFAULT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `branch_id` bigint NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

SET FOREIGN_KEY_CHECKS = 1;

5. 創(chuàng)建undo.log表

上述步驟我們完成了seata相關(guān)的功能維護的配置,以本文的AT模式為例,為保證每個分支事務(wù)在回滾時都能準確還原,seata參照MySQL的mvcc設(shè)計思想提出undo.log的概念,如果需要實現(xiàn)AT模式,我們需要針對每一個分支事務(wù)的數(shù)據(jù)庫刷入下面這張undo_log表:

-- 日志文件表--
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    ) ENGINE = INNODB
    AUTO_INCREMENT = 1
    DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

6. 啟動seata將其注冊到nacos中

完成這些步驟之后,我們就可以啟動seata容器查看是否注冊到容器中,我們在seata-compose.yaml文件所在的路徑鍵入這條命令:

docker-compose -f seata-compose.yaml up -d

完成這條命令后,我們通過docker ps獲取到seata的id值,以筆者為例,容器的id為8c48c75d07ad,所以我們鍵入:

docker logs 8c48c75d07ad

如下圖所示,如果正常讀取到registry.conf文件以及輸出端口號,就說明啟動成功了。

查看nacos對應(yīng)命名空間的服務(wù)列表,可以看到seata-server已經(jīng)成功注冊了,自此我們的seata就已經(jīng)部署成功了。

7. 服務(wù)注冊到seata

完成這些步驟后,我們就可以將本地服務(wù)注冊到seata中,首先服務(wù)必須引入依賴seata-spring-boot-starter,只有引入這個依賴才會自動裝配seata相關(guān)組件確保服務(wù)可以注冊到seata中。

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <!--版本較低,1.3.0,因此排除-->
                <exclusion>
                    <artifactId>seata-spring-boot-starter</artifactId>
                    <groupId>io.seata</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--版本在父工程中配置,seata starter 采用1.4.2版本-->
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>

然后修改每個服務(wù)的yml文件配置,如下所示,這里需要注意一點,因為筆者在上文seataServer.properties指定事務(wù)分組名稱為seata-demo,所以我們這里的tx-service-group也是seata-demo。然后vgroup-mapping也指明seata-demo和我們nacos集群(筆者在上文registry.conf將cluster配置為default)的映射關(guān)系。

具體配置如下所示:

seata:
  # TC服務(wù)注冊中心的配置,微服務(wù)根據(jù)這些信息去注冊中心獲取tc服務(wù)地址
  registry:
    # 注冊中心類型 nacos
    type: nacos
    nacos:
      # nacos地址
      server-addr: ip:8848
      # namespace,默認為空
      namespace: 63f0dbe6-ac91-4a2e-a88e-82b76f8187b6
      # 配置組
      group: DEFAULT_GROUP
      # seata服務(wù)名稱
      application: seata-server
      username: nacos
      password: 密碼
  config:
    type: nacos
    nacos:
      server-addr: ip:8848
      group : "DEFAULT_GROUP"
      namespace: "63f0dbe6-ac91-4a2e-a88e-82b76f8187b6"
      dataId: "seataServer.properties"
      username: "nacos"
      password: "密碼"
    # 事務(wù)組名稱
  tx-service-group: seata-demo
  service:
    vgroup-mapping: # 事務(wù)組與cluster的映射關(guān)系
      seata-demo: default
    grouplist.seata-server: ip:8091
  data-source-proxy-mode: AT

注意yml文件對縮進的格式要求很高,讀者可以參考筆者的配置進行修改,筆者本次部署時遇到服務(wù)始終無法注冊到seata中,控制臺持續(xù)輸出can not get cluster name in registry config xxxx, please make sure registry config correct

經(jīng)過查閱源碼NettyClientChannelManager的代碼段,大抵推測yml配置沒有生效,排查半天得出yml縮進有問題。

//筆者這里debug進去發(fā)現(xiàn)group取的SEATA-GROUP和我們的指定的DEFAULT-GROUP不一樣
 String clusterName = registryService.getServiceGroup(transactionServiceGroup);

    if (StringUtils.isBlank(clusterName)) {
                LOGGER.error("can not get cluster name in registry config '{}{}', please make sure registry config correct",
                        ConfigurationKeys.SERVICE_GROUP_MAPPING_PREFIX,
                        transactionServiceGroup);
                return;
            }

筆者查閱github一些issue發(fā)現(xiàn),上面這個問題可能還需要補充這樣一個步驟:

在上文配置的命名空間中增加一條配置,data-id為service.vgroupMapping.事務(wù)分組名稱,以筆者為例就是service.vgroupMapping.seata-demo,內(nèi)容為default

8. 啟動服務(wù)將其注冊到seata中

完成后啟動服務(wù),以筆者的order-service為例,啟動后如果seata日志中輸出這樣一段話,則說明啟動成功了。

16:31:15.596  INFO --- [rverHandlerThread_1_1_500] i.s.c.r.processor.server.RegRmProcessor  : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://ip:3306/cloud_alibaba', applicatinotallow='order-service', transactinotallow='seata-demo'},channel:[id: 0x25ec75ef, L:/172.23.0.5:8091 - R:/220.200.39.1:30735],client version:1.4.2
16:31:15.732  INFO --- [rverHandlerThread_1_2_500] i.s.c.r.processor.server.RegRmProcessor  : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://ip:3306/cloud_alibaba', applicatinotallow='order-service', transactinotallow='seata-demo'},channel:[id: 0x25ec75ef, L:/172.23.0.5:8091 - R:/220.200.39.1:30735],client version:1.4.2

其他服務(wù)同理,都完成后,我們的下單服務(wù)代碼加一個GlobalTransactional注解,即可完成分布式事務(wù)了,感興趣的讀者可以在扣款或者庫存扣減調(diào)用上設(shè)置一個錯誤的調(diào)用,最終都會看到訂單回滾且當前用戶的余額和庫存都不會有扣減:

@Override
    @GlobalTransactional
    @Transactional(rollbackFor = RuntimeException.class)
    public void createOrder(OrderDto orderDTO) {
        Order order = new Order();
        BeanUtils.copyProperties(orderDTO, order);
        //調(diào)用產(chǎn)品服務(wù)獲取商品詳情
        ResultData<ProductDTO> productInfo = productFeign.getByCode(orderDTO.getProductCode());
        //計算總金額
        BigDecimal total = productInfo.getData().getPrice().multiply(new BigDecimal(order.getCount()));
        order.setAmount(total);
        //創(chuàng)建訂單
        save(order);
        //扣減金額
        accountFeign.reduceAccount(orderDTO.getAccountCode(), order.getAmount());
        //扣減商品
        productFeign.deduct(orderDTO.getProductCode(), orderDTO.getCount());

    }
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2009-07-06 19:29:37

云計算私有云服務(wù)器虛擬化

2018-03-07 15:24:41

PythonMySQL

2024-09-13 15:20:46

2024-12-02 14:48:30

Docker鏡像文件

2009-12-17 08:57:28

Windows 7磁盤分區(qū)

2024-07-22 11:43:28

LVMPnetLab網(wǎng)絡(luò)

2024-11-01 11:40:11

2022-08-29 15:19:09

CSS煙花動畫

2013-11-11 13:24:21

cocos2dx 2.Android編譯

2020-10-28 15:03:25

C+代碼開發(fā)

2013-03-18 16:09:27

JavaEEOpenfire

2019-09-18 07:20:34

深度學習人臉識別人工智能

2015-07-30 09:35:24

滑動返回代碼

2022-09-30 15:37:19

Web網(wǎng)站服務(wù)器

2012-03-22 10:33:33

思杰XenDesktop

2011-06-07 16:03:48

匿名SQL Server

2013-01-06 09:43:35

MySQLMySQL遷移Redis

2017-12-25 11:50:57

LinuxArch Linux

2010-10-08 14:48:32

TFSVisual Stud

2019-11-04 10:06:19

MySQL索引
點贊
收藏

51CTO技術(shù)棧公眾號

国产影视一区二区| 男人晚上看的视频| 欧美成a人片在线观看久| 欧美激情一区三区| 亚洲专区中文字幕| 中文字幕在线观看视频网站| 香蕉久久一区| 国产精品天干天干在观线| 亚洲a级在线观看| 天天干天天干天天操| 亚洲一区欧美| 亚洲天堂第二页| 亚洲区 欧美区| 欧美日韩精品免费观看视欧美高清免费大片| 国产aⅴ精品一区二区三区色成熟| 久久精品国产久精国产一老狼| xxxx一级片| bl视频在线免费观看| 中文av一区二区| 精品一区二区国产| 欧美国产成人精品一区二区三区| 欧美男男freegayvideosroom| 午夜欧美在线一二页| 亚洲成人午夜在线| 视频三区在线观看| 国产资源在线一区| 久久久久久久国产精品视频| 第四色在线视频| 久久久久久久久成人| 欧美亚洲一区三区| 黄色免费视频大全| 伦理在线一区| 亚洲精品视频自拍| 亚洲欧美日韩国产成人综合一二三区| 91免费视频播放| 欧美成人嫩草网站| 色偷偷88888欧美精品久久久| 亚洲免费黄色网| 九九九伊在线综合永久| 日韩欧美精品中文字幕| 日本电影一区二区三区| 亚洲香蕉在线视频| 日本亚洲三级在线| 国产精品99久久99久久久二8| 久久爱一区二区| 精品素人av| 精品国产乱码久久久久久牛牛| 欧美污视频网站| 九色porny自拍视频在线播放| 国产午夜精品一区二区三区视频| 亚洲一区久久久| 国产精品久久777777换脸| 亚洲黄色在线| 国内精品视频在线| 日韩av一二三区| 国产一区二区三区的电影| 午夜精品久久久久久久99热| 妖精视频在线观看免费| 欧美特黄一级大片| 在线精品视频视频中文字幕| 中国美女乱淫免费看视频| 欧美美女在线直播| 亚洲欧洲在线观看| 国产极品视频在线观看| 久久综合av| 麻豆国产va免费精品高清在线| 一区二区精品免费| 91麻豆精品国产91久久久久推荐资源| 精品日韩中文字幕| 日韩av在线综合| 亚洲精品.com| 欧美剧情电影在线观看完整版免费励志电影 | 国产亚洲精品久久久久久无几年桃| 在线日韩网站| 在线播放日韩欧美| 国产性生活大片| 国内成人在线| 日本不卡高字幕在线2019| 久草视频在线资源站| 欧美激情aⅴ一区二区三区| 久久久久久国产精品久久| 在线观看亚洲网站| 免费一区二区三区视频导航| 亚洲精品一区二区三区精华液| www午夜视频| 欧美高清一级片| 亚洲精品国产欧美| 免费看91的网站| 免费国产自久久久久三四区久久| 亚洲黄在线观看| 特级西西www444人体聚色| 亚洲不卡av不卡一区二区| 国内免费久久久久久久久久久| 全程偷拍露脸中年夫妇| 亚洲伊人观看| 91在线精品视频| 你懂的在线看| 樱桃视频在线观看一区| av片中文字幕| 无人区乱码一区二区三区| 亚洲视频第一页| 久久久久久国产精品视频 | 久久精品国产亚洲aⅴ | 成人免费看片98| 国产一区二区三区四区老人| 欧美日韩高清在线观看| 国产伦精品一区二区三区视频我| 久久国产主播| 成人免费直播live| 日本福利片在线| 一区二区三区免费在线观看| 800av在线免费观看| 日本免费中文字幕在线| 精品久久久久久久久久| 欧美a在线视频| 日韩三级网址| 色偷偷av一区二区三区乱| 久久久久久久久久久影院| 免费人成精品欧美精品| 精品国产乱码久久久久久郑州公司| 偷拍精品一区二区三区| 亚洲另类色综合网站| 色婷婷狠狠18| 久久不见久久见中文字幕免费| 这里只有精品在线播放| 久久精品国产成人av| 日韩不卡一区二区三区| 久久大香伊蕉在人线观看热2| 毛片免费在线| 亚洲第一主播视频| 天天影视综合色| 羞羞色国产精品网站| 国模视频一区二区| 国产77777| 亚洲永久免费av| 日本三级免费观看| 久久狠狠久久| 欧美激情精品久久久久久蜜臀| 影音先锋在线国产| wwwwww.欧美系列| 国产精品久久久久9999爆乳| 6080亚洲理论片在线观看| 久久天天躁夜夜躁狠狠躁2022| 国产极品在线播放| 高清视频一区二区| 日本公妇乱淫免费视频一区三区| 成人午夜在线影视| 在线播放欧美女士性生活| jizzjizzjizz国产| 麻豆国产精品777777在线| 污视频在线免费观看一区二区三区| 亚洲国产精品精华素| 日韩欧美国产骚| 国产激情在线免费观看| 欧美在线综合| 色乱码一区二区三在线看| 国外成人福利视频| 亚洲精品久久久久久久久久久久| 久久精品亚洲a| 久久电影网站中文字幕| 天堂v在线视频| 免费观看成人性生生活片 | 一区二区三区精| av激情综合网| 精品中文字幕av| 在线免费观看亚洲| 欧美另类极品videosbestfree| 免费无码国产精品| 国产精品三级视频| 欧美在线观看www| 欧美精品乱码| 91精品国产综合久久香蕉的用户体验 | 超碰免费在线播放| 精品日本一线二线三线不卡| 成人18视频免费69| 国产成人高清在线| 男人靠女人免费视频网站| 精品免费一区二区| 91在线在线观看| 一区一区三区| 日韩一级黄色av| 黄色www视频| 欧美综合天天夜夜久久| 国产精品探花一区二区在线观看| 欧美视频亚洲视频| 欧美日韩在线精品| 亚洲精品一区二区在线播放∴| 在线日韩第一页| www.日韩高清| 色妹子一区二区| 欧美日韩在线视频免费| 久久先锋影音av鲁色资源| 毛片毛片毛片毛| 国产午夜久久| 经典三级在线视频| 欧美猛男男男激情videos| 欧美一级片久久久久久久| 日本三级在线播放完整版| 日韩av网站在线| 国产精品欧美综合亚洲| 欧美性xxxx极品高清hd直播| 视频国产一区二区| 久久久蜜臀国产一区二区| 国产伦理在线观看| 欧美bbbbb| 国产精品999视频| 999国产精品| 成人亚洲激情网| 少女频道在线观看高清| 一区二区三区四区精品| 亚洲综合五月天婷婷丁香| 欧美日韩亚洲一区二区三区| 日本老熟俱乐部h0930| 成人午夜短视频| 久久婷婷中文字幕| 免费精品视频在线| 免费在线观看的av网站| 国内精品久久久久久久97牛牛| 精品国产乱码久久久久久蜜柚| 日韩电影免费观| 性欧美xxxx交| 青青草原av在线| 伦伦影院午夜日韩欧美限制| 色三级在线观看| 在线播放国产一区中文字幕剧情欧美 | 日韩欧美一区二区免费| 国产亚洲欧美精品久久久www| 99久久久精品免费观看国产蜜| 国语对白做受xxxxx在线中国| 日韩欧美高清| 日本一区二区三区四区在线观看| 91麻豆精品国产综合久久久 | 久久综合综合久久| 亚洲精品少妇30p| 国产一二三区精品| 亚洲视频中文字幕| 久久爱一区二区| 综合久久综合久久| 小泽玛利亚一区二区免费| 日韩一区中文字幕| 亚洲少妇一区二区三区| 天堂在线一区二区| 日韩中文字幕二区| 天堂精品中文字幕在线| 熟女人妇 成熟妇女系列视频| 欧美一区网站| a级黄色片网站| 国产一区二区三区不卡视频网站| 亚洲一区二区免费在线| 国产精品久久久久久av公交车| 欧美有码在线视频| 中文字幕21页在线看| 欧美在线观看视频| 欧美亚洲韩国| 国内外成人免费激情在线视频| 久久精品视频免费看| 久久久久99精品久久久久| 超碰在线观看免费版| 欧美大片免费观看| 哥也色在线视频| 欧美国产高跟鞋裸体秀xxxhd| 91视频在线观看| 久久精品99国产精品酒店日本| 欧美少妇另类| 在线亚洲国产精品网| 国产中文字幕在线看| 国产一区二区av| 国产在线69| 国产做受高潮69| www.一区| www.一区二区三区| 天堂av一区二区三区在线播放| 国产精品yjizz| 色天下一区二区三区| 国产精品美女xx| 九一国产精品| 经典三级在线视频| 国产精品一卡| 欧美大片久久久| 不卡区在线中文字幕| xxxxx在线观看| 亚洲欧美另类图片小说| 麻豆久久久久久久久久| 欧美日韩国产成人在线91| 丰满人妻一区二区三区无码av| 日韩一区二区高清| 国产精品九九九九| 在线播放91灌醉迷j高跟美女| 亚洲在线免费观看视频| 精品卡一卡二卡三卡四在线| 久久精品a一级国产免视看成人| 日韩av在线看| 黄黄的网站在线观看| 欧美一区二区三区四区在线| 成人影院网站ww555久久精品| 91在线直播亚洲| 性欧美xxxx免费岛国不卡电影| 久久久久久九九九九| 精品在线手机视频| 久久福利一区二区| 日韩一区精品视频| 超碰超碰在线观看| 97久久人人超碰| www青青草原| 午夜激情一区二区三区| 一级特黄特色的免费大片视频| 69av一区二区三区| 精品国产九九九| 国产亚洲视频在线观看| 精品极品在线| 97影院在线午夜| 日韩一区三区| 国产第一页视频| 精品一区中文字幕| 欧美日韩高清丝袜| 欧美性猛交xxxx富婆弯腰| 国产刺激高潮av| 美女福利精品视频| av资源中文在线天堂| 91超碰rencao97精品| 欧美国产一区二区三区激情无套| 人妻av无码专区| 国产另类ts人妖一区二区| 婷婷丁香综合网| 亚洲小说欧美激情另类| av在线免费在线观看| 日韩在线观看成人| 电影在线观看一区二区| 久久综合伊人77777麻豆| 影音先锋国产精品| 毛茸茸free性熟hd| 一区二区三区加勒比av| 国产露脸91国语对白| 日韩中文在线观看| 国精品产品一区| 精品网站在线看| 日韩视频一区| 日韩成人精品视频在线观看| 国产精品色婷婷| 91tv国产成人福利| 色阁综合伊人av| 日韩综合久久| 偷拍盗摄高潮叫床对白清晰| 精品一区二区免费| 亚洲女人毛茸茸高潮| 欧美区一区二区三区| 涩涩视频免费看| 91精品国产高清久久久久久| 欧美理伦片在线播放| 日韩精品一区二区三区色欲av| 国产呦萝稀缺另类资源| 中文字幕国产综合| 欧美性生交xxxxxdddd| 日韩专区一区二区| 国产成人av在线| 偷拍精品福利视频导航| 欧美视频第一区| 欧美国产乱子伦| 国产精品探花视频| www.色综合| 99这里只有精品视频| 亚洲一区二区四区| 国产在线精品一区二区不卡了| 蜜桃无码一区二区三区| 欧美日韩亚洲不卡| 国产美女在线观看| 国产日韩久久| 日韩精品欧美成人高清一区二区| 亚洲国产精品无码久久久久高潮| 亚洲视频在线一区二区| 中文字幕 亚洲视频| 久久九九免费视频| 久久99国产精品久久99大师| 国产麻花豆剧传媒精品mv在线| 99re热这里只有精品视频| 麻豆影视在线播放| 精品一区二区电影| 性孕妇free特大另类| 亚洲精品免费在线看| 国产精品自拍一区| 五月婷婷亚洲综合| 日韩网站免费观看| 美国成人xxx| 欧美美女一级片| 中文字幕一区二区在线观看| 亚洲春色一区二区三区| 日韩av成人在线观看| 亚洲色图国产| 91成人破解版| 欧美一区二区不卡视频| 成人小电影网站| 欧洲精品亚洲精品| 国产乱人伦偷精品视频不卡| 国产精品va无码一区二区三区| 亚洲欧美中文字幕| 户外露出一区二区三区| 亚洲电影一二三区| 狠狠色综合日日| 国产精品视频一区二区三| 国产视频精品在线|