文章目錄
- 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個微服務提供支援:
- 存儲服務:扣除給定商品的存儲數量。
- 訂單服務:根據購買請求建立訂單。
- 帳戶服務:借記使用者帳戶的餘額。
結構

存儲服務
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解決分布式事務
我們僅僅需要在業務方法上使用注解@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:運作示範應用程式的腳本