微服务架构的分布式事务解决方案有几种( 四 )


4) 运行样例
在sample-txc-simple目录下执行build.sh编译本工程。编译完成后执行run.sh。

4.7.2 sample-txc-dubbo 样例
4.7.2.1 样例业务逻辑
本案例模拟了用户下订单、减库存的业务逻辑。客户端(Client)通过调用订单服务(OrderService)创建订单,之后通过调用库存服务(StockService)扣库存。其中订单服务读写订单数据库,库存服务读写库存数据库。由 GTS 保证跨服务事务的一致性。

4.7.2.2 样例搭建方法
1) 准备数据库环境
安装MySQL,创建两个数据库db1和db2。在db1和db2中分别创建txc_undo_log表。在db1库中创建orders表,在db2库中创建stock表。
2) 下载样例
将样例文件sample-txc-dubbo下载到本地机器,样例中已经包含了GTS的SDK。
3) 修改配置
打开sample-txc-dubbo/src/main/resources目录,将dubbo-order-service.xml、dubbo-stock-service.xml两个文件中数据源的url、username、password修改为实际值。
4) 运行样例
a. 编译程序
在工程根目录执行 build.sh 命令,编译工程。编译后会在 sample-txc-dubbo/client/bin 目录下生成 order_run.sh、stock_run.sh、client_run.sh 三个运行脚本对应订单服务、库存服务以及客户端。
b. 运行程序
在根目录执行run.sh,该脚本会依次启动order_run.sh(订单服务)、stock_run.sh(库存服务)和client_run.sh(客户端程序)。

4.7.2.3 其他说明
样例使用Multicast注册中心的声明方式。如果本机使用无线网络,dubbo服务在绑定地址时有可能获取ipv6地址,可以通过jvm启动参数禁用。 方法是配置jvm启动参数 -Djava.net.preferIPv4Stack=true。

4.7.3 SQL
4.7.3.1 建表 txc_undo_log
CREATE TABLE txc_undo_log (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT \u0026#39;主键\u0026#39;,gmt_create datetime NOT NULL COMMENT \u0026#39;创建时间\u0026#39;,gmt_modified datetime NOT NULL COMMENT \u0026#39;修改时间\u0026#39;,xid varchar(100) NOT NULL COMMENT \u0026#39;全局事务ID\u0026#39;,branch_id bigint(20) NOT NULL COMMENT \u0026#39;分支事务ID\u0026#39;,rollback_info longblob NOT NULL COMMENT \u0026#39;LOG\u0026#39;,status int(11) NOT NULL COMMENT \u0026#39;状态\u0026#39;,server varchar(32) NOT NULL COMMENT \u0026#39;分支所在DB IP\u0026#39;,PRIMARY KEY (id),KEY unionkey (xid,branch_id)) ENGINE=InnoDB AUTO_INCREMENT=211225994 DEFAULT CHARSET=utf8 COMMENT=\u0026#39;事务日志表\u0026#39;;
4.7.3.2 建表 user_money_a
CREATE TABLE user_money_a (id int(11) NOT NULL AUTO_INCREMENT,money int(11) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
4.7.3.3 建表 user_money_b
CREATE TABLE user_money_b (id int(11) NOT NULL AUTO_INCREMENT,money int(11) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;4.7.3.4 建表 orders
CREATE TABLE orders (id bigint(20) NOT NULL AUTO_INCREMENT,user_id varchar(255) NOT NULL,product_id int(11) NOT NULL,number int(11) NOT NULL,gmt_create timestamp NOT NULL,PRIMARY KEY (id)) ENGINE=MyISAM AUTO_INCREMENT=351 DEFAULT CHARSET=utf84.7.3.5 建表 stock
CREATE TABLE stock (product_id int(11) NOT NULL,price float NOT NULL,amount int(11) NOT NULL,PRIMARY KEY (product_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8

5 总结

GTS已经在阿里内部广泛使用,经过了双十一流量高峰的考验。内部成熟后,在专有云和公有云服务了很多用户,很多用户一天事务量在千万/亿级别,解决了业务服务化改造后的分布式事务棘手技术难题。


推荐阅读