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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot之基于Dubbo和Seata的分布式事务解决方案

發布時間:2023/12/3 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot之基于Dubbo和Seata的分布式事务解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?Spring Boot之基于Dubbo和Seata的分布式事務解決方案

1. 分布式事務初探

一般來說,目前市面上的數據庫都支持本地事務,也就是在你的應用程序中,在一個數據庫連接下的操作,可以很容易的實現事務的操作。但是目前,基于SOA的思想,大部分項目都采用微服務架構后,就會出現了跨服務間的事務需求,這就稱為分布式事務。本文假設你已經了解了事務的運行機制,如果你不了解事務,那么我建議先去看下事務相關的文章,再來閱讀本文。

1.1 什么是分布式事務

對于傳統的單體應用而言,實現本地事務可以依賴Spring的@Transactional注解標識方法,實現事務非常簡單。

我們以最常見的電商系統為例,簡單拆分為用戶客戶端、訂單服務、庫存服務、商品服務等等,在用戶下單過程中,需要同時調用各個服務,但是,每個服務都是獨立部署的,數據庫連接是不共享的,因此要保證這些操作全部執行,或者全部不執行,就需要分布式事務的支持。

1.2 分布式事務解決方案

  • 全局事務,基于DTP模型實現,需要三種角色即Application 應用系統,Transaction Manager 事務管理器,Resource Manager資源管理器;

  • 基于可靠消息服務的分布式事務,通過消息隊列實現事務的一致性;

  • TCC,即Try、Confirm、Cancel,屬于補償型分布式事務,Try:嘗試待執行的事務,Confirm:執行事務,Cancel:取消執行的事務;

1.3 Seata介紹

Seata 是一款開源的分布式事務解決方案,致力于在微服務架構下提供高性能和簡單易用的分布式事務服務。Seata 于2019.1正式對外開源,前身是阿里巴巴2014年誕生的 TXC(Taobao Transaction Constructor)。以下是Seata官網介紹的特色服務:

Seata 將為用戶提供了 AT、TCC 和 XA 事務模式,為用戶打造一站式的分布式解決方案。更多關于Seata的介紹,可參考其官網。

2. Spring Boot,Dubbo和Seata實現分布式事務案例

2.1 環境準備

運行本測試,需要你提前準備如下的軟件運行環境:

運行環境版本要求
jdk1.8+
Spring Boot1.5+
MySQL5.7+
ZooKeeper3.4+
Seata0.6.1
Dubbo2.6.5

本案例,主要模仿簡單的下單扣減庫存的過程,架構圖如下:

2.2 Seata管理端

下載Seata的最新版本,并解壓后,進入seata/bin目錄,啟動:

sh seata-server.sh 8091 file

觀察8091端口是否啟動。

2.3 數據存儲

本測試服務,需要創建兩張表,分別是訂單表和庫存表:

CREATE TABLE `t_order` (`id` int(11) NOT NULL AUTO_INCREMENT,`order_no` varchar(255) DEFAULT NULL,`user_id` varchar(255) DEFAULT NULL,`commodity_code` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT '0',`amount` double(14,2) DEFAULT '0.00',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `t_storage` (`id` int(11) NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT '0',PRIMARY KEY (`id`),UNIQUE KEY `commodity_code` (`commodity_code`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.4 構建Spring Boot服務

示例代碼可參考Github倉庫,倉庫的目錄結構如下:

  • springboot-base:存儲公共調用的基類接口,mapper接口,Model層的類等,可mvn install后,供另外三個module調用。

  • springboot-dubbo-storage:庫存服務;

  • springboot-dubbo-order:訂單服務;

  • springboot-dubbo-client:RPC消費者,提供對外接口;

基于Spring Boot構建Dubbo服務可參考之前的博文《Spring Boot(五)之集成Dubbo部署RPC服務》,構建本項目的過程就不再贅述了。

加入Seata組件后,與普通Dubbo項目的不同之處在于

1,配置Seata數據源

/*** seata數據源** init datasource proxy* @Param: druidDataSource datasource bean instance* @Return: DataSourceProxy datasource proxy*/ @Bean public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource){return new DataSourceProxy(druidDataSource); }

2,Seata初始化

/*** 配置全局事務掃描器。有兩個參數,一個是應用名稱,一個是事務分組** @return*/ @Bean public GlobalTransactionScanner globalTransactionScanner() {return new GlobalTransactionScanner("springboot-dubbo-storage", "my_test_tx_group"); }

3,配置注冊中心,目前可用的配置中心有file、nacos 、apollo、zk、consul,file類型本身不具備注冊中心的動態發現和動態配置功能,官方的初衷是在不依賴第三方配置注冊中心的基礎上快速集成測試seata功能。配置內容在file.conf和registry.conf。

4,注解標記事務方法,在需要分布式事務的方法上,加上@GlobalTransactional注解即可。

2.5 測試

依次啟動Seata、springboot-dubbo-storage、springboot-dubbo-order、springboot-dubbo-client后,打開postman測試,配置測試參數為:

可以看到,在addOrder報錯后,會有全局事務的rollback過程。

3. 參考資料

  • Seata

  • 如何使用Seata保證Dubbo微服務間的一致性

  • SpringBoot+Dubbo+Seata分布式事務實戰

  • 分布式事務選型的取舍

  • 常用的分布式事務解決方案

總結

以上是生活随笔為你收集整理的Spring Boot之基于Dubbo和Seata的分布式事务解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

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