阿里开源分布式事务框架(二)seata (fescar)简单使用

时间:2019-05-08作者:klpeng分类:IT综合浏览:3411评论:0

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)简单使用

存储服务

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)简单使用
我们仅仅需要在业务方法上使用注解@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:运行演示应用程序的脚本

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢