天天看点

阿里开源分布式事务框架(二)seata (fescar)简单使用Maven依赖快速开始使用seata解决分布式事务Dubbo + SEATA的示例

文章目录

  • Maven依赖
  • 快速开始
      • 用例
      • 结构
      • 存储服务
      • 订单服务
      • 帐户服务
      • 主业务逻辑
  • 使用seata解决分布式事务
  • Dubbo + SEATA的示例
      • 第1步:设置数据库
      • 第2步:创建UNDO_LOG表
      • 第3步:创建表格,例如业务
      • 第4步:启动服务器
      • 第5步:运行示例

Maven依赖

<seata.version>0.5.1</seata.version>

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring</artifactId>
    <version>${seata.version}</version>
</dependency>

<!--dependency for Apache Dubbo-->
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-dubbo</artifactId>
    <version>${seata.version}</version>
</dependency>

<!--dependency for Alibaba Dubbo-->
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-dubbo-alibaba</artifactId>
    <version>${seata.version}</version>
</dependency>
           

快速开始

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

用例

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

  • 存储服务:扣除给定商品的存储数量。
  • 订单服务:根据购买请求创建订单。
  • 帐户服务:借记用户帐户的余额。

结构

阿里开源分布式事务框架(二)seata (fescar)简单使用Maven依赖快速开始使用seata解决分布式事务Dubbo + SEATA的示例

存储服务

public interface StorageService {

    /**
     * deduct storage count
     */
    void deduct(String commodityCode, int count);
}
           

订单服务

public interface OrderService {

    /**
     * create order
     */
    Order create(String userId, String commodityCode, int orderCount);
}
           

帐户服务

public interface AccountService {

    /**
     * debit balance of user's account
     */
    void debit(String userId, int money);
}
           

主业务逻辑

public class BusinessServiceImpl implements BusinessService {

    private StorageService storageService;

    private OrderService orderService;

    /**
     * purchase
     */
    public void purchase(String userId, String commodityCode, int orderCount) {

        storageService.deduct(commodityCode, orderCount);

        orderService.create(userId, commodityCode, orderCount);
    }
}
           
public class OrderServiceImpl implements OrderService {

    private OrderDAO orderDAO;

    private AccountService accountService;

    public Order create(String userId, String commodityCode, int orderCount) {

        int orderMoney = calculate(commodityCode, orderCount);

        accountService.debit(userId, orderMoney);

        Order order = new Order();
        order.userId = userId;
        order.commodityCode = commodityCode;
        order.count = orderCount;
        order.money = orderMoney;

        // INSERT INTO orders ...
        return orderDAO.insert(order);
    }
           

使用seata解决分布式事务

阿里开源分布式事务框架(二)seata (fescar)简单使用Maven依赖快速开始使用seata解决分布式事务Dubbo + SEATA的示例

我们仅仅需要在业务方法上使用注解@GlobalTransactional

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

Dubbo + SEATA的示例

第1步:设置数据库

要求:带有InnoDB引擎的MySQL。

注意:实际上,示例用例中的3个服务应该有3个数据库。但是,我们只需创建一个数据库并配置3个数据源即可。

使用刚刚创建的数据库URL /用户名/密码修改Spring XML。

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

< property  name = “ url ”  value = “ jdbc:mysql:// xxxx:3306 / xxx ” /> 
        < property  name = “ username ”  value = “ xxx ” /> 
        < property  name = “ password ”  value = “ xxx ” />
           

第2步:创建UNDO_LOG表

UNDO_LOG SEATA AT模式需要表格。

-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
           

第3步:创建表格,例如业务

DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
           

第4步:启动服务器

  • 从https://github.com/seata/seata/releases下载服务器包,解压缩。
sh seata-server.sh $LISTEN_PORT $STORE_MODE

e.g.

sh seata-server.sh 8091 file
           

第5步:运行示例

转到样品repo:seata-samples

  • 启动DubboAccountServiceStarter
  • 启动DubboStorageServiceStarter
  • 启动DubboOrderServiceStarter
  • 运行DubboBusinessTester进行演示测试

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

继续阅读