如何使用Fescar保证Dubbo微服务间的一致性
生活随笔
收集整理的這篇文章主要介紹了
如何使用Fescar保证Dubbo微服务间的一致性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
案例
用戶采購商品業務,整個業務包含3個微服務:
- 庫存服務: 扣減給定商品的庫存數量。
- 訂單服務: 根據采購請求生成訂單。
- 賬戶服務: 用戶賬戶金額扣減。
業務結構圖
StorageService
public interface StorageService {/*** deduct storage count*/void deduct(String commodityCode, int count); }OrderService
public interface OrderService {/*** create order*/Order create(String userId, String commodityCode, int orderCount); }AccountService
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 StorageServiceImpl implements StorageService {private StorageDAO storageDAO;@Overridepublic void deduct(String commodityCode, int count) {Storage storage = new Storage();storage.setCount(count);storage.setCommodityCode(commodityCode);storageDAO.update(storage);} } 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;return orderDAO.insert(order);} }Fescar 分布式事務解決方案
此處僅僅需要一行注解?@GlobalTransactional?寫在業務發起方的方法上:
@GlobalTransactionalpublic void purchase(String userId, String commodityCode, int orderCount) {......}Dubbo 與 Fescar 結合的例子
Step 1: 安裝數據庫
- 要求: MySQL (InnoDB 存儲引擎)。
提示:?事實上例子中3個微服務需要3個獨立的數據庫,但為了方便我們使用同一物理庫并配置3個邏輯連接串。
更改以下xml文件中的數據庫url、username和password
dubbo-account-service.xml dubbo-order-service.xml dubbo-storage-service.xml
<property name="url" value="jdbc:mysql://x.x.x.x:3306/xxx" /><property name="username" value="xxx" /><property name="password" value="xxx" />Step 2: 為 Fescar 創建 undo_log 表
UNDO_LOG?此表用于 Fescar 的AT模式。
-- 注意當 Fescar 版本升級至 0.3.0+ 將由之前的普通索引變更為唯一索引。 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;Step 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;Step 4: 啟動 Fescar-Server 服務
- 下載Server?package, 并解壓。
- 運行bin目錄下的啟動腳本。
Step 5: 運行例子
- 啟動賬戶服務 (DubboAccountServiceStarter)。
- 啟動庫存服務 (DubboStorageServiceStarter)。
- 啟動訂單服務 (DubboOrderServiceStarter)。
- 運行BusinessService入口 (DubboBusinessTester)。
相關項目
- fescar:?https://github.com/alibaba/fescar/
- fescar-samples :?https://github.com/fescar-group/fescar-samples
?
原文:http://dubbo.apache.org/zh-cn/blog/dubbo-fescar.html
總結
以上是生活随笔為你收集整理的如何使用Fescar保证Dubbo微服务间的一致性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo Admin服务测试功能
- 下一篇: Dubbo 注解驱动(Annotatio