天天看點

阿裡開源分布式事務架構(二)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:運作示範應用程式的腳本

繼續閱讀