日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用Fescar保证Dubbo微服务间的一致性

發布時間:2025/1/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用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目錄下的啟動腳本。
sh fescar-server.sh $LISTEN_PORT $PATH_FOR_PERSISTENT_DATAe.g.sh fescar-server.sh 8091 /home/admin/fescar/data/

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微服务间的一致性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。