springboot集成分布式事务fescar(Seata)

简介

github地址

spring-boot-starter-seata:https://github.com/itrickzhang/spring-boot-starter-seata

seata版本

server和client版本为0.4.1,Seata 一直在快速迭代在1.0 之前都有可能出现协议不兼容 尽量使用版本号一致

说明

目前提供的示例是针对使用dubbo的服务,那Spring Boot的项目如何集成fescar呢?

快速开始

使用案例

Business Service购买商品的业务逻辑。整个业务逻辑由3个微服务驱动:

  • Storage service: 扣除给定商品的库存量.

  • Order service: 根据采购需求创建订单.

  • Account service: 借记用户帐户上的余额.

请求逻辑

springboot集成分布式事务fescar(Seata)_第1张图片

fescar下载

下载地址:https://github.com/alibaba/fescar/releases

脚本

业务脚本

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;

事务脚本

-- 注意此处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;

集成

<dependency>	
    <groupId>org.springframework.boot</groupId>	
    <artifactId>spring-boot-starter-seata</artifactId>	
    <version>${project.version}</version>	
</dependency>

使用

使用注解@GlobalTransactional

    @GlobalTransactional(timeoutMills = 300000, name = "spring-cloud-demo-tx")	
    @RequestMapping(value = "/fescar/feign", method = RequestMethod.GET, produces = "application/json")	
    public String feign() {	
        LOGGER.info("business Service Begin ... xid: " + RootContext.getXID());	
        String result = storageService.storage(COMMODITY_CODE, ORDER_COUNT);	
        if (!SUCCESS.equals(result)) {	
            throw new RuntimeException();	
        }	
        result = orderService.order(USER_ID, COMMODITY_CODE, ORDER_COUNT);	
        if (!SUCCESS.equals(result)) {	
            throw new RuntimeException();	
        }	
        return SUCCESS;	
    }

demo运行

spring-boot-starter-seata-sample

  • Start AccountService

  • Start StorageService

  • Start OrderService

  • Run BusinessService for demo test

运行结果

启动demo

springboot集成分布式事务fescar(Seata)_第2张图片

访问demo

springboot集成分布式事务fescar(Seata)_第3张图片

数据库数据

springboot集成分布式事务fescar(Seata)_第4张图片

springboot集成分布式事务fescar(Seata)_第5张图片

我的公众号

springboot集成分布式事务fescar(Seata)_第6张图片

你可能感兴趣的:(springboot集成分布式事务fescar(Seata))