快速部署

最近更新时间: 2024-10-17 17:10:00

准备工作

参考 准备工作 文档。

下载 DTF 示例工程

此处可以下载 DTF 的 示例工程,以便于快速上手分布式事务研发工作。

初始化数据库

  1. 准备一台数据库(MySQL 即可),请确保数据库与后续部署程序包的虚拟机在同一 VPC 下。建议使用 云数据库 MySQL,在线 初始化 数据库,检查 数据库与虚拟机是否成功连接。

    说明: 执行 示例工程初始化脚本: 00_init.sql。 如果需要使用 FMT,在每个业务库中,执行 FMT初始化脚本: 01_init_fmt_tables.sql

  2. 获取 MySQLHost、MySQLPort(若使用云数据库MySQL,您可直接使用数据库实例的内网地址)。

工程依赖及应用配置

DTF 可以在非 SpringSpring BootSpring Cloud 三种环境中运行,分别需要使用不同的 Maven POM 配置和应用配置进行启动。

说明:

  • 下列示例中的${dtf.version}可以根据 Release Note 选择最新(推荐)或指定的版本。
  • 下列示例中,每个场景都可以单独部署使用。

非 Spring 应用

示例工程: single-transfer

修改示例工程中com.tencent.cloud.dtf.demo.TransferApplication类的以下内容。

说明: 设置的值请在 准备工作 步骤中获取。

/**
 * 设置启动参数
 */
private static void initEnv() {
    // 应用唯一标识,具有相同标识的应用节点被视作对等节点
    DtfEnv.setServer("single-transfer");
    // API密钥:SecretId
    DtfEnv.setSecretId("${SecretId}");
    // API密钥:SecretKey
    DtfEnv.setSecretKey("${SecretKey}");
    // 事务分组ID,事务协调器BrokerList。
    DtfEnv.addTxmBroker("${GroupId}", "${BorkerList}");
}

修改示例工程中com.tencent.cloud.dtf.demo.transfer.util.DBUtil类的以下内容。

说明: 设置的值请在 初始化数据库(MySQL 即可) 步骤中获取。

private static final String URL1 = "jdbc:mysql://${MySQLHost}:${MySQLPort}/dtf_demo_account_1?useSSL=false&characterEncoding=utf8&serverTimezone=GMT";

private static final String URL2 = "jdbc:mysql://${MySQLHost}:${MySQLPort}/dtf_demo_account_2?useSSL=false&characterEncoding=utf8&serverTimezone=GMT";

示例工程测试方法:启动后自动执行,不需要外部触发。

Spring Boot应用 - 单应用多数据源场景

示例工程:

TCC模式:

single-transfer-spring-boot

FMT模式:

single-transfer-fmt-spring-boot

修改示例工程中的application.yml文件。

说明: 设置的值请在 准备工作初始化数据库(MySQL 即可) 两个步骤中获取。

spring:
  application:
    name: single-transfer
  datasource:
    primary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbcUrl: jdbc:mysql://${MySQLHost}:${MySQLPort}/dtf_demo_account_1?useSSL=false&characterEncoding=utf8&serverTimezone=GMT
      username: dtf_demo_account_1
      password: 1q2w3e4r@TX
    secondary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbcUrl: jdbc:mysql://${MySQLHost}:${MySQLPort}/dtf_demo_account_2?useSSL=false&characterEncoding=utf8&serverTimezone=GMT
      username: dtf_demo_account_2
      password: 1q2w3e4r@TX
dtf:
  env:
    groups:
      ${GroupId}: ${BorkerList}
    secretId: ${SecretId}
    secretKey: ${SecretKey}

示例工程测试方法:启动后自动执行,不需要外部触发。

Spring Boot 应用 - 多应用场景

说明: 该组示例中 TCC 与 FMT 节点可以混布。

示例工程:

TCC 模式:

spring-boot-orderspring-boot-inventoryspring-boot-paymentspring-boot-point

FMT 模式

spring-boot-fmt-orderspring-boot-fmt-inventoryspring-boot-fmt-paymentspring-boot-fmt-point

远程调用场景:

Order .......................... spring-boot-order/spring-boot-fmt-order
  ├ Inventory .................. spring-boot-inventory/spring-boot-fmt-inventory
  └ Payment .................... spring-boot-payment/spring-boot-fmt-payment
      └ Point .................. spring-boot-point/spring-boot-fmt-point

修改示例工程中的 application.yml 文件的以下部分。

说明: 设置的值请在 准备工作初始化数据库(MySQL即可) 两个步骤中获取。

spring:
  datasource:
    url: jdbc:mysql://${MySQLHost}:${MySQLPort}/dtf_demo_inventory?useSSL=false&characterEncoding=utf8&serverTimezone=GMT
dtf:
  env:
    groups:
      ${GroupId}: ${BorkerList}
    secretId: ${SecretId}
    secretKey: ${SecretKey}

Spring Boot 应用没有服务注册发现,所以需要手动配置远程调用地址。 修改spring-boot-orderspring-boot-fmt-order工程的以下内容: com.tencent.cloud.dtf.demo.order.proxy.InventoryRestTemplate

说明: ${inventory-host}为部署spring-boot-inventoryspring-boot-fmt-inventory的主机地址。

public Boolean deduct(Order order) {
    Inventory inventory = new Inventory();
    inventory.setProductId(order.getProductId());
    inventory.setQty(order.getQty());
    return restTemplate.postForObject("http://${inventory-host}:19001/deduct", inventory, Boolean.class);
}

com.tencent.cloud.dtf.demo.order.proxy.PaymentRestTemplate

说明: ${payment-host}为部署spring-boot-paymentspring-boot-fmt-payment的主机地址。

public Boolean pay(Order order) {
    Payment payment = new Payment();
    payment.setAccountId(order.getAccountId());
    payment.setBalance(order.getQty());
    return restTemplate.postForObject("http://${payment-host}:19002/pay", payment, Boolean.class);
}

修改spring-boot-paymentspring-boot-fmt-payment工程的以下内容:
com.tencent.cloud.dtf.demo.payment.proxy.PointRestTemplate

说明: ${point-host}为部署spring-boot-pointspring-boot-fmt-point的主机地址。

public boolean point(Payment payment) {
    Point point = new Point();
    point.setAccountId(payment.getAccountId());
    point.setPoint(payment.getBalance());
    return restTemplate.postForObject("http://${point-host}:19003/point", point, Boolean.class);
}

示例工程测试方法:

需要手工调用 Order 工程的下单接口:

说明: ${order-host}为部署spring-boot-orderspring-boot-fmt-order的主机地址。

curl --location --request POST 'http://${order-host}:19000/order' \
--header 'Content-Type: application/json' \
-d '{
    "productId": 4,
    "qty": 1,
    "accountId": 1
}'

Spring Cloud应用 - 多应用场景

说明:该组示例中 TCC 与 FMT 节点可以混布。

示例工程:

TCC 模式: spring-cloud-orderspring-cloud-inventoryspring-cloud-paymentspring-cloud-point

FMT 模式: spring-cloud-fmt-orderspring-cloud-fmt-inventoryspring-cloud-fmt-paymentspring-cloud-fmt-point

远程调用场景:

Order .......................... spring-cloud-order/spring-cloud-fmt-order
  ├ Inventory .................. spring-cloud-inventory/spring-cloud-fmt-inventory
  └ Payment .................... spring-cloud-payment/spring-cloud-fmt-payment
      └ Point .................. spring-cloud-point/spring-cloud-fmt-point

修改示例工程中的 application.yml 文件的以下部分。

说明: 设置的值请在 准备工作初始化数据库(MySQL即可) 两个步骤中获取。

spring:
  datasource:
    url: jdbc:mysql://${MySQLHost}:${MySQLPort}/dtf_demo_inventory?useSSL=false&characterEncoding=utf8&serverTimezone=GMT
dtf:
  env:
    groups:
      ${GroupId}: ${BorkerList}
    secretId: ${SecretId}
    secretKey: ${SecretKey}

示例工程测试方法:

需要手工调用 Order 工程的下单接口:

说明: ${order-host}为部署spring-boot-orderspring-boot-fmt-order的主机地址。

curl --location --request POST 'http://${order-host}:19000/order' \
--header 'Content-Type: application/json' \
-d '{
    "productId": 4,
    "qty": 1,
    "accountId": 1
}'

打包示例工程

在示例工程根目录下使用以下脚本打包示例工程。

mvn clean package

说明: 非 Spring 应用在打包后会出现 single-transfer-x.x.x-RELEASE.jar 与 single-transfer-x.x.x-RELEASE-jar-with-dependenices.jar 两个应用包,请使用后者上传和部署。

部署应用

在 CVM 或 TSF 中部署刚刚打包好的示例工程 jar 包。请确保 CVM 或 TSF 中用于部署的机器,与数据库在同一 VPC 下。若使用CVM 与 云数据库MySQL,您可参考 一键连接检查工具 检查二者是否处于同一 VPC 下。

TSF 中部署(推荐)

TSF 控制台 部署,可参考 应用基本操作

CVM 中部署

CVM 控制台 中部署,步骤如下:

  1. 上传 jar 包到指定服务器(服务器需要安装 JDK 1.8或以上版本)。

  2. 使用以下命令启动程序包。

    nohup java -jar ${jar_file} > root.log &

    说明: ${jar_file} 为打包示例工程时生成的 jar 包。

检查运行结果

DTF控制台 上检查事务分组的对应数据。

在业务日志中检查执行过程产生的日志。