快速部署
最近更新时间: 2024-10-17 17:10:00
准备工作
参考 准备工作 文档。
下载 DTF 示例工程
此处可以下载 DTF 的 示例工程,以便于快速上手分布式事务研发工作。
初始化数据库
准备一台数据库(MySQL 即可),请确保数据库与后续部署程序包的虚拟机在同一 VPC 下。建议使用 云数据库 MySQL,在线 初始化 数据库,检查 数据库与虚拟机是否成功连接。
说明: 执行 示例工程初始化脚本: 00_init.sql。 如果需要使用 FMT,在每个业务库中,执行 FMT初始化脚本: 01_init_fmt_tables.sql。
获取 MySQLHost、MySQLPort(若使用云数据库MySQL,您可直接使用数据库实例的内网地址)。
工程依赖及应用配置
DTF 可以在非 Spring、Spring Boot、Spring 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-order
,spring-boot-inventory
,spring-boot-payment
,spring-boot-point
FMT 模式
spring-boot-fmt-order
,spring-boot-fmt-inventory
,spring-boot-fmt-payment
,spring-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-order
,spring-boot-fmt-order
工程的以下内容:
com.tencent.cloud.dtf.demo.order.proxy.InventoryRestTemplate
类
说明:
${inventory-host}
为部署spring-boot-inventory
或spring-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-payment
或spring-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-payment
,spring-boot-fmt-payment
工程的以下内容:com.tencent.cloud.dtf.demo.payment.proxy.PointRestTemplate
类
说明:
${point-host}
为部署spring-boot-point
或spring-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-order
或spring-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-order
,spring-cloud-inventory
,spring-cloud-payment
,spring-cloud-point
FMT 模式:
spring-cloud-fmt-order
,spring-cloud-fmt-inventory
,spring-cloud-fmt-payment
,spring-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-order
或spring-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 中部署(推荐)
CVM 中部署
在 CVM 控制台 中部署,步骤如下:
上传 jar 包到指定服务器(服务器需要安装 JDK 1.8或以上版本)。
使用以下命令启动程序包。
nohup java -jar ${jar_file} > root.log &
说明: ${jar_file} 为
打包示例工程
时生成的 jar 包。
检查运行结果
在 DTF控制台 上检查事务分组的对应数据。
在业务日志中检查执行过程产生的日志。