快速开始

让我们从一个微服务示例开始。

用例

用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:

  • 仓储服务:对给定的商品扣除仓储数量。
  • 订单服务:根据采购需求创建订单。
  • 帐户服务:从用户帐户中扣除余额。

架构图

Architecture

仓储服务

  1. public interface StorageService {
  2. /**
  3. * 扣除存储数量
  4. */
  5. void deduct(String commodityCode, int count);
  6. }

订单服务

  1. public interface OrderService {
  2. /**
  3. * 创建订单
  4. */
  5. Order create(String userId, String commodityCode, int orderCount);
  6. }

帐户服务

  1. public interface AccountService {
  2. /**
  3. * 从用户账户中借出
  4. */
  5. void debit(String userId, int money);
  6. }

主要业务逻辑

  1. public class BusinessServiceImpl implements BusinessService {
  2. private StorageService storageService;
  3. private OrderService orderService;
  4. /**
  5. * 采购
  6. */
  7. public void purchase(String userId, String commodityCode, int orderCount) {
  8. storageService.deduct(commodityCode, orderCount);
  9. orderService.create(userId, commodityCode, orderCount);
  10. }
  11. }
  1. public class OrderServiceImpl implements OrderService {
  2. private OrderDAO orderDAO;
  3. private AccountService accountService;
  4. public Order create(String userId, String commodityCode, int orderCount) {
  5. int orderMoney = calculate(commodityCode, orderCount);
  6. accountService.debit(userId, orderMoney);
  7. Order order = new Order();
  8. order.userId = userId;
  9. order.commodityCode = commodityCode;
  10. order.count = orderCount;
  11. order.money = orderMoney;
  12. // INSERT INTO orders ...
  13. return orderDAO.insert(order);
  14. }
  15. }

SEATA 的分布式交易解决方案

快速启动 - 图2 我们只需要使用一个 @GlobalTransactional 注解在业务方法上:

  1. @GlobalTransactional
  2. public void purchase(String userId, String commodityCode, int orderCount) {
  3. ......
  4. }

由Dubbo + SEATA提供支持的示例

步骤 1:建立数据库

  • 要求:具有InnoDB引擎的MySQL。

注意: 实际上,在示例用例中,这3个服务应该有3个数据库。 但是,为了简单起见,我们只能创建一个数据库并配置3个数据源。

使用您刚创建的数据库 URL/username/password 修改Spring XML。

dubbo-account-service.xml dubbo-order-service.xml dubbo-storage-service.xml

  1. <property name="url" value="jdbc:mysql://x.x.x.x:3306/xxx" />
  2. <property name="username" value="xxx" />
  3. <property name="password" value="xxx" />

步骤 2:创建 UNDO_LOG 表

SEATA AT 模式需要 UNDO_LOG

  1. -- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
  2. CREATE TABLE `undo_log` (
  3. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  4. `branch_id` bigint(20) NOT NULL,
  5. `xid` varchar(100) NOT NULL,
  6. `context` varchar(128) NOT NULL,
  7. `rollback_info` longblob NOT NULL,
  8. `log_status` int(11) NOT NULL,
  9. `log_created` datetime NOT NULL,
  10. `log_modified` datetime NOT NULL,
  11. `ext` varchar(100) DEFAULT NULL,
  12. PRIMARY KEY (`id`),
  13. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

步骤 3:为示例业务创建表

  1. DROP TABLE IF EXISTS `storage_tbl`;
  2. CREATE TABLE `storage_tbl` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `commodity_code` varchar(255) DEFAULT NULL,
  5. `count` int(11) DEFAULT 0,
  6. PRIMARY KEY (`id`),
  7. UNIQUE KEY (`commodity_code`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  9. DROP TABLE IF EXISTS `order_tbl`;
  10. CREATE TABLE `order_tbl` (
  11. `id` int(11) NOT NULL AUTO_INCREMENT,
  12. `user_id` varchar(255) DEFAULT NULL,
  13. `commodity_code` varchar(255) DEFAULT NULL,
  14. `count` int(11) DEFAULT 0,
  15. `money` int(11) DEFAULT 0,
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  18. DROP TABLE IF EXISTS `account_tbl`;
  19. CREATE TABLE `account_tbl` (
  20. `id` int(11) NOT NULL AUTO_INCREMENT,
  21. `user_id` varchar(255) DEFAULT NULL,
  22. `money` int(11) DEFAULT 0,
  23. PRIMARY KEY (`id`)
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤 4: 启动服务

  1. Usage: sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for windows) [options]
  2. Options:
  3. --host, -h
  4. The host to bind.
  5. Default: 0.0.0.0
  6. --port, -p
  7. The port to listen.
  8. Default: 8091
  9. --storeMode, -m
  10. log store mode : filedb
  11. Default: file
  12. --help
  13. e.g.
  14. sh seata-server.sh -p 8091 -h 127.0.0.1 -m file

步骤 5: 运行示例

示例仓库: seata-samples

  • 启动 DubboAccountServiceStarter
  • 启动 DubboStorageServiceStarter
  • 启动 DubboOrderServiceStarter
  • 运行 DubboBusinessTester for demo test

TBD: 运行演示应用程序的脚本