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

国产乱理伦片在线观看夜一区| 日韩精品成人在线观看| 91麻豆成人久久精品二区三区| 欧美在线欧美在线| 欧美男男青年gay1069videost| 国产97在线视频| 91n在线视频| 国产精品丝袜在线播放| 在线亚洲高清视频| 妺妺窝人体色www看人体| 欧美日本网站| 国产最新精品免费| 2018中文字幕一区二区三区| 亚洲一级理论片| 加勒比色老久久爱综合网| 欧美午夜精品一区| 国产美女主播在线播放| 日本网站在线免费观看视频| av欧美精品.com| 成人黄色免费片| 国产原创视频在线| 午夜久久99| 最近中文字幕2019免费| www.超碰97| 欧美影院视频| 欧美日韩综合一区| 日本精品www| 青春草免费在线视频| 国产精品看片你懂得| 精品国产一区二区三区四区精华| 国产婷婷在线视频| 久久国产精品区| 国产成人精品视频在线| 免费观看一级视频| 亚洲九九在线| 日韩中文字幕在线免费观看| 小早川怜子久久精品中文字幕| 好吊妞视频这里有精品| 91精品国产一区二区三区 | 国产福利在线看| 成人免费的视频| 99久久99| 精品国精品国产自在久不卡| 国产精品熟女久久久久久| 欧美变态网站| 精品国产91洋老外米糕| 黑人巨大猛交丰满少妇| 亚洲热av色在线播放| 欧美亚洲禁片免费| 久久久国产欧美| 另类专区亚洲| 一本久久a久久免费精品不卡| 少妇高潮喷水在线观看| 精品三级久久| 无码av免费一区二区三区试看 | 国产视频一区在线观看一区免费| 欧美大片免费观看| 青青草原免费观看| 在线精品观看| 欧美一级视频一区二区| 狠狠人妻久久久久久| 欧美一级二区| 日韩av毛片网| 国产情侣呻吟对白高潮| 捆绑调教美女网站视频一区| 国产区精品在线观看| 夜夜爽8888| 国内精品不卡在线| 国产精品裸体一区二区三区| 日本加勒比一区| 91婷婷韩国欧美一区二区| 六月婷婷久久| av播放在线观看| 专区另类欧美日韩| 妞干网在线播放| 波多野结衣视频一区二区| 欧美性高跟鞋xxxxhd| 国内自拍视频一区| 伊人久久大香线蕉成人综合网| 精品国精品国产自在久不卡| 不卡的av在线播放| 免费在线国产精品| 永久免费av片在线观看全网站| 成人免费在线观看入口| 17c丨国产丨精品视频| 亚洲伊人av| 欧美剧在线免费观看网站 | 精品国产一区二区三区久久| 欧美成人一区二区三区高清| av成人国产| 国产精品亚洲激情| 丰满人妻av一区二区三区| 久久色.com| 最新欧美日韩亚洲| 国产99在线观看| 欧美日韩高清一区二区| 手机在线成人av| 日韩aaaa| 6080yy精品一区二区三区| 亚洲网站免费观看| 不卡在线视频中文字幕| 亚洲国产精品久久久久婷婷老年| 日韩成人伦理| 欧美性淫爽ww久久久久无| aaaaa黄色片| 成人情趣视频| 97超碰色婷婷| 国产精品久久久久77777| xxxx.国产| 国产一区二区成人久久免费影院| 精品一区二区不卡| 91福利国产在线观看菠萝蜜| 色综合久久中文字幕综合网 | 7799精品视频天天看| 国产一区二区电影| 日产精品高清视频免费| 1234区中文字幕在线观看| 欧美日韩精品综合在线| 免费无码一区二区三区| 中文精品久久| 国产主播欧美精品| 欧美视频综合| 亚洲不卡在线观看| 永久看看免费大片| 久久中文字幕av一区二区不卡| 琪琪亚洲精品午夜在线| 色婷婷视频在线| 亚洲激情图片小说视频| 五月婷婷六月丁香激情| 亚洲色图丝袜| 91极品视频在线| 亚洲老妇色熟女老太| 亚洲天堂成人网| 五月激情五月婷婷| 精品日韩免费| 日本午夜在线亚洲.国产| 欧美一级性视频| 国产精品成人**免费视频| 91在线看国产| 精品一二三四五区| 久久影院一区二区三区| 最近2019年中文视频免费在线观看 | 欧美一区二区在线观看视频| 亚洲免费电影在线| 亚洲精品国产一区二区三区| 日本午夜一区| 国产精品揄拍一区二区| xxxxx日韩| 欧美在线不卡视频| www..com.cn蕾丝视频在线观看免费版 | 狠狠爱免费视频| 网红女主播少妇精品视频| 69久久夜色精品国产7777| 天天插天天干天天操| 岛国av一区二区| 加勒比综合在线| 日韩专区在线视频| 先锋影音亚洲资源| 婷婷丁香久久| 九九精品视频在线| 亚洲av无码专区在线| 亚洲高清不卡在线观看| 鲁大师私人影院在线观看| 亚洲欧美综合久久久久久v动漫| 一区在线免费| 国产精品一区二区久久久| 二区三区在线| 欧美人与性动xxxx| 成人免费毛片东京热| 丁香激情综合五月| 免费无码国产v片在线观看| 欧美伦理影院| 亚洲在线免费看| av女在线播放| 亚洲欧美在线播放| 一级黄色录像大片| 亚洲图片自拍偷拍| av网站免费在线播放| 美女爽到高潮91| 国产成人一区二区三区别| 日本在线中文字幕一区| 国产精品高清网站| 丝袜在线视频| 亚洲深夜福利在线| 99久久婷婷国产一区二区三区| 夜夜嗨av一区二区三区四季av| 自拍视频一区二区| 久久国产精品色| 老太脱裤让老头玩ⅹxxxx| 成人aaaa| 国产精品三区www17con| 国产激情久久| 国内精品一区二区三区| 日本国产在线| 欧美一区2区视频在线观看| 毛片视频网站在线观看| 国产精品国产三级国产| 亚洲国产精品无码久久久久高潮| 七七婷婷婷婷精品国产| 日韩xxxx视频| 99久久综合| 欧美日韩成人一区二区三区| 精品国产三级| 国产精品成人aaaaa网站| 国产蜜臀一区二区打屁股调教| 在线观看日韩视频| 丰满人妻一区二区三区免费视频| 欧美偷拍一区二区| 天堂网一区二区三区| 亚洲欧美日韩中文播放| 亚洲永久精品ww.7491进入| 不卡一本毛片| 久久先锋影音av鲁色资源网| 午夜免费一级片| 久久尤物视频| 国产婷婷一区二区三区| 亚洲国产精品久久久天堂| 欧美另类网站| 国产精品欧美大片| 亚洲最大福利网站| 日韩一级特黄| 国产精品国产三级国产aⅴ浪潮| av成人影院在线| 欧美精品免费在线| 久操视频在线观看| 国产一区二区三区视频在线观看| 黑人乱码一区二区三区av| 91精品免费在线观看| 正在播放木下凛凛xv99| 色香蕉久久蜜桃| 欧美日韩综合在线观看| 亚洲午夜日本在线观看| 欧美成人精品欧美一级私黄| 亚洲日本中文字幕区| 国产不卡在线观看视频| 26uuu国产电影一区二区| 国产一级免费片| 国产成人免费视频一区| 国产精品久久久久久9999| 日本欧美一区二区在线观看| 欧美成人精品欧美一级乱| 欧美一级视频| 亚洲男人天堂色| 日本三级亚洲精品| 一路向西2在线观看| 日本在线不卡视频| 国产精品一区二区羞羞答答| 丝袜亚洲精品中文字幕一区| 国产乱子夫妻xx黑人xyx真爽| 99热免费精品在线观看| 少妇高潮喷水在线观看| 夜夜嗨网站十八久久| 高清在线观看免费| 国产日韩免费| 无码内射中文字幕岛国片| 午夜在线一区| 任你操这里只有精品| 日韩高清欧美激情| www.亚洲高清| 国产主播一区二区| ass极品水嫩小美女ass| 高清国产午夜精品久久久久久| 五月天丁香社区| 99re66热这里只有精品3直播| av网站免费在线播放| 国产欧美一二三区| 欧美a级片免费看| 亚洲激情五月婷婷| 国产精品男女猛烈高潮激情| www.成人在线视频| 91精品免费看| 中文字幕一区二区三区四区久久| 粉嫩av免费一区二区三区| 麻豆精品av| 日韩一区免费观看| 亚洲人成免费网站| 日本xxxxxxxxxx75| 老牛嫩草一区二区三区日本| 免费看涩涩视频| 国产一区二区三区免费在线观看| 秘密基地免费观看完整版中文| 91麻豆免费视频| 国产精品理论在线| 亚洲视频 欧洲视频| 精品视频久久久久| 色悠久久久久综合欧美99| 又污又黄的网站| 精品毛片乱码1区2区3区| 日本午夜在线| 久久久999精品视频| 成入视频在线观看| 国产区精品视频| 全国精品免费看| 欧美日韩视频免费在线观看| 亚洲人成人一区二区三区| 国产视频手机在线播放| 成人午夜av影视| 欧美激情视频二区| 亚洲综合一区二区精品导航| 日本欧美www| 精品国产污网站| 在线观看免费高清完整| 亚洲**2019国产| 成人综合日日夜夜| 欧美黑人3p| 影音先锋久久久| 免费av不卡在线| 久久久久青草大香线综合精品| 中文字幕在线2021| 色狠狠色狠狠综合| 人妻少妇精品无码专区| 精品国产网站地址| 日韩不卡免费高清视频| 国产精品国模大尺度私拍| 国产高清久久| 亚洲色精品三区二区一区| 成人午夜电影小说| 国产a免费视频| 欧美男人的天堂一二区| 国产系列在线观看| 91成人精品网站| 国产伦精品一区二区三区免费优势 | 国产欧美日韩一区二区三区在线观看| 一区二区三区免费高清视频 | 四虎影视精品成人| 第一会所亚洲原创| 午夜精品一区二区三区四区 | 最新中文字幕一区二区三区| 黄色片网站在线免费观看| 精品999久久久| 七七成人影院| 91一区二区三区| 亚洲澳门在线| 国产女同无遮挡互慰高潮91| 中文字幕av一区二区三区| 中文字幕免费观看| 亚洲精品一区中文字幕乱码| 妞干网免费在线视频| 国产在线一区二区三区欧美| 亚洲视频狠狠| 午夜影院福利社| 亚洲va天堂va国产va久| 亚洲黄色在线播放| 欧美成人午夜激情| 日韩欧美久久| 中文字幕人妻熟女人妻洋洋| 国产suv精品一区二区6| 久草资源在线视频| 精品久久久久久无| 91九色美女在线视频| 国产精品三区四区| 国产日韩高清一区二区三区在线| av网站有哪些| 欧美专区亚洲专区| 在线日本视频| 成人性生交大片免费看视频直播 | 精品国产乱码久久久久久蜜臀网站| 少妇高潮久久77777| 国产一区 二区| 国产又粗又猛又爽又黄的网站| 成人综合婷婷国产精品久久蜜臀 | 美国一级黄色录像| 欧美裸体bbwbbwbbw| yellow91字幕网在线| 国产精品9999久久久久仙踪林| 亚洲美女色禁图| 波多野结衣a v在线| 欧美日韩二区三区| 2021国产在线| 久久精品国产精品国产精品污 | 亚洲第一成人网站| 欧美性一区二区| 搞黄网站在线观看| 狠狠色综合色区| 日韩国产在线一| 欧美日韩精品在线观看视频| 亚洲精品久久久一区二区三区| av高清不卡| 一区二区高清视频| 成人免费观看av| 中文字幕精品视频在线观看| 精品国产一区二区三区久久狼黑人 | 超碰10000| 99久久婷婷国产综合精品电影| 免费黄色网址在线| 久久精品在线视频| 天天躁日日躁成人字幕aⅴ| 国产野外作爱视频播放| 一区二区理论电影在线观看| 三级毛片在线免费看| 91精品国产综合久久香蕉| 亚洲人妖在线| 日韩欧美123区| 亚洲欧美色图片| 精品久久国产一区| 国产乱子夫妻xx黑人xyx真爽| 亚洲美女区一区| 国产在线免费观看| 国产美女精品久久久| 久久99国内精品|