Spring Cloud Alibaba整合Seata實戰

Spring Cloud Alibaba整合Seata實戰

1.啟動Seata Server

1.1 環境準備

1)指定nacos作為配置中心和注冊中心
修改registry.conf文件
在這里插入圖片描述
在這里插入圖片描述
注意:客戶端配置registry.conf使用nacos時也要注意group要和seata server中的group一致,默認group是"DEFAULT_GROUP"。

2)同步seata server的配置到nacos
獲取/seata/script/config-center/config.txt,修改配置信息。
在這里插入圖片描述
配置事務分組, 要與客戶端配置的事務分組一致。
(客戶端properties配置:spring.cloud.alibaba.seata.tx‐service‐group=my_test_tx_group)。
在這里插入圖片描述
配置參數同步到Nacos
shell:

sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca

參數說明:
-h: host,默認值 localhost
-p: port,默認值 8848
-g: 配置分組,默認值為 ‘SEATA_GROUP’
-t: 租戶信息,對應 Nacos 的命名空間ID字段, 默認值為空 ‘’
在這里插入圖片描述
3)啟動Seata Server
啟動Seata Server命令

bin/seata-server.sh

啟動成功,默認端口8091
在這里插入圖片描述
在注冊中心可以查看到seata-server注冊成功
在這里插入圖片描述

2.Seata如何整合到Spring Cloud微服務

業務場景:
用戶下單,整個業務邏輯由三個微服務構成:

  • 倉儲服務:對給定的商品扣除庫存數量。
  • 訂單服務:根據采購需求創建訂單。
  • 帳戶服務:從用戶帳戶中扣除余額。
    在這里插入圖片描述
    在這里插入圖片描述
    環境準備:
    seata: v1.4.0
    spring cloud&spring cloud alibaba:
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>

注意版本選擇問題:
spring cloud alibaba 2.1.2 及其以上版本使用seata1.4.0會出現如下異常 (支持seata 1.3.0)
在這里插入圖片描述

2.1 導入依賴

<!-- seata-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-all</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>io.seata</groupId><artifactId>seata-all</artifactId><version>1.4.0</version>
</dependency><!--nacos 注冊中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.16</version>
</dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>

2.2 微服務對應數據庫中添加undo_log表

CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.3 微服務需要使用seata DataSourceProxy代理自己的數據源

/*** 需要用到分布式事務的微服務都需要使用seata DataSourceProxy代理自己的數據源*/
@Configuration
@MapperScan("com.aaa.datasource.mapper")
public class MybatisConfig {/*** 從配置文件獲取屬性構造datasource,注意前綴,這里用的是druid,根據自己情況配置,* 原生datasource前綴取"spring.datasource"** @return*/@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource druidDataSource() {DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}/*** 構造datasource代理對象,替換原來的datasource* @param druidDataSource* @return*/@Primary@Bean("dataSource")public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {return new DataSourceProxy(druidDataSource);}@Bean(name = "sqlSessionFactory")public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();//設置代理數據源factoryBean.setDataSource(dataSourceProxy);ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();factoryBean.setMapperLocations(resolver.getResources("classpath*:mybatis/**/*-mapper.xml"));org.apache.ibatis.session.Configuration configuration=new org.apache.ibatis.session.Configuration();//使用jdbc的getGeneratedKeys獲取數據庫自增主鍵值configuration.setUseGeneratedKeys(true);//使用列別名替換列名configuration.setUseColumnLabel(true);//自動使用駝峰命名屬性映射字段,如userId ---> user_idconfiguration.setMapUnderscoreToCamelCase(true);factoryBean.setConfiguration(configuration);return factoryBean.getObject();}}

注意: 啟動類上需要排除DataSourceAutoConfiguration,否則會出現循環依賴的問題。
在這里插入圖片描述
啟動類排除DataSourceAutoConfiguration.class。

@SpringBootApplication(scanBasePackages = "com.aaa",exclude = DataSourceAutoConfiguration.class)
public class AccountServiceApplication {public static void main(String[] args) {SpringApplication.run(AccountServiceApplication.class, args);}
}

4.添加seata配置

1)將registry.conf文件拷貝到resources目錄下,指定注冊中心和配置中心都是nacos

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {serverAddr = "192.168.65.232:8848"namespace = ""cluster = "default"group = "SEATA_GROUP"}
}config {# file、nacos 、apollo、zk、consul、etcd3、springCloudConfigtype = "nacos"nacos {serverAddr = "192.168.65.232:8848"namespace = "29ccf18e-e559-4a01-b5d4-61bad4a89ffd"group = "SEATA_GROUP"}
}

org.springframework.cloud:spring-cloud-starter-alibaba-seataorg.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration類中,默認會使用 ${spring.application.name}-seata-service-group作為服務名注冊到 Seata Server上,如果和service.vgroup_mapping配置不一致,會提示 no available server to connect錯誤。也可以通過配置 spring.cloud.alibaba.seata.tx-service-group修改后綴,但是必須和file.conf中的配置保持一致。

2)在yml中指定事務分組(和配置中心的service.vgroup_mapping 配置一一對應)

spring:application:name: account-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group:my_test_tx_group  # seata 服務事務分組

io.seata.core.rpc.netty.NettyClientChannelManager#getAvailServerList
》NacosRegistryServiceImpl#lookup
》String clusterName = getServiceGroup(key); #獲取seata server集群名稱
》List firstAllInstances = getNamingInstance().getAllInstances(getServiceName(), getServiceGroup(), clusters)

spring cloud alibaba 2.1.4 之后支持yml中配置seata屬性,可以用來替換registry.conf文件。
配置支持實現在seata-spring-boot-starter.jar中,也可以引入依賴。

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.0</version>
</dependency>

在yml中配置

seata:# seata 服務分組,要與服務端nacos-config.txt中service.vgroup_mapping的后綴對應tx-service-group: my_test_tx_groupregistry:# 指定nacos作為注冊中心type: nacosnacos:server-addr: 127.0.0.1:8848namespace: ""group: SEATA_GROUP  config:# 指定nacos作為配置中心type: nacosnacos:server-addr: 127.0.0.1:8848namespace: "54433b62-df64-40f1-9527-c907219fc17f"group: SEATA_GROUP

3) 在事務發起者中添加@GlobalTransactional注解
核心代碼

@Override
//@Transactional
@GlobalTransactional(name="createOrder")
public Order saveOrder(OrderVo orderVo){log.info("=============用戶下單=================");log.info("當前 XID: {}", RootContext.getXID());// 保存訂單Order order = new Order();order.setUserId(orderVo.getUserId());order.setCommodityCode(orderVo.getCommodityCode());order.setCount(orderVo.getCount());order.setMoney(orderVo.getMoney());order.setStatus(OrderStatus.INIT.getValue());Integer saveOrderRecord = orderMapper.insert(order);log.info("保存訂單{}", saveOrderRecord > 0 ? "成功" : "失敗");//扣減庫存storageFeignService.deduct(orderVo.getCommodityCode(),orderVo.getCount());//扣減余額accountFeignService.debit(orderVo.getUserId(),orderVo.getMoney());//更新訂單Integer updateOrderRecord = orderMapper.updateOrderStatus(order.getId(),OrderStatus.SUCCESS.getValue());log.info("更新訂單id:{} {}", order.getId(), updateOrderRecord > 0 ? "成功" : "失敗");return order;}

4)測試分布式事務是否生效
用戶下單賬戶余額不足,庫存是否回滾
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44231.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44231.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44231.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的PHP8編譯日志

編譯命令在arm和x86架構上是一樣的&#xff0c;如果缺少依賴庫&#xff0c;按需要安裝&#xff1a; 登錄后復制 yuminstall libcurl libcurl-devel yum install openssl openssl-devel yum install pcre2 pcre2-devel yum install libxml2 libxml2-devel 1.2.3.4. 配置和編譯&…

Linux--生產消費模型

線程系列&#xff1a; Linux–線程的認識(一) Linux–線程的分離、線程庫的地址關系的理解、線程的簡單封裝&#xff08;二&#xff09; 線程的互斥&#xff1a;臨界資源只能在同一時間被一個線程使用 生產消費模型 生產消費模型是多線程編程和分布式系統中的一個經典概念&…

我們水冷使制動電阻功率密度成倍增加-水冷電阻設計工廠

先進陶瓷 我們后來發現工業應用中對占用空間最小的水冷電阻器的工業需求&#xff0c;推出了適用于中壓工業應用的水冷電阻器。它的特點是兩塊由具有特殊性能的先進陶瓷制成的板。 使用工業電驅動裝置的一個重要好處是&#xff0c;可靠的再生和動態制動系統可以補充或取代傳統…

Llama2 訓練指南

Llama2 是一個基于 Python 的機器學習框架&#xff0c;旨在幫助開發者快速構建和部署機器學習模型。下面是 Llama2 訓練指南&#xff0c;旨在幫助您了解如何使用 Llama2 訓練模型。 概述 Llama2 提供了多種方式來訓練模型&#xff0c;包括使用 Keras 和 TensorFlow。下面是在…

Laravel :如何將Excel文件導入數據庫

文章目錄 一、前提二、使用2.1、新建一個導入文件2.2、新建一個控制器和方法,調用導入文件2.3、 新建一個頁面&#xff0c;支持文件上傳 一、前提 想要將excel內容入庫&#xff0c;laravel有擴展可以使用,常用的擴展是maatwebsite/excel&#xff0c;安裝步驟參考上一篇&#x…

力扣 202快樂數

快樂數這題有兩個關鍵 一個是求n的 各個位上平方和 另一個是判斷是否為快樂數的依據是是否在哈希表中找到已經出現過的數 1求各個位上平方和方法 定義sum sum N除以十取余的平方和 n/10 循環終止條件是n0 2查找一個數是否出現&#xff0c;用哈希表unordered_set &…

Mosh|SQL教程第四彈(未完)

SQL有很多自帶的內聚的函數&#xff08;MAX、MIN、AVG、SUM、COUNT&#xff09; 一、聚合函數&#xff08;Aggregate Functions&#xff09; 這里的括號可以寫列名也可以寫表達式,下面是一個練習&#xff1a; 二、GROUP BY子句 統計2019-07-01以后每個客戶的總銷售額 注意這…

result.h

#ifndef ASYNCIO_RESULT_H #define ASYNCIO_RESULT_H#include <asyncio/exception.h> #include <variant> #include <optional> namespace ASYNCIO_NS {// 結果類封裝&#xff08;不是協程函數的返回類型&#xff09; template<typename T> struct Res…

Javaweb11-Filter過濾器

Filter過濾器 1.Filter的基本概念&#xff1a; 在Java Servlet中&#xff0c;Filter接口是用來處理HttpServletRequest和HttpServletResponse的對象的過濾器。主要用途是在請求到達Servlet之前或者響應離開Servlet之前對請求或響應進行預處理或后處理。 2.Filter常見的API F…

探展2024世界人工智能大會之合合信息掃描黑科技~

文章目錄 ?? 前言?? AIGC古籍修復文化遺產煥新?? 高效的文檔圖像處理解決方案?? AIGC掃描黑科技一鍵全搞定?? 行業級的大模型加速器?? 結語 ?? 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩編程&#xff09; &#xff0c;這次非常榮幸受邀作為專業觀眾參…

【常用知識點-Java】讀取Properties文件

Author&#xff1a;趙志乾 Date&#xff1a;2024-07-11 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 簡介 .properties文件是一種簡單的文本文件&#xff0c;用于存儲鍵值對&#xff0c;其每個鍵值對占一行&#xff0c;且鍵和值之間用…

力扣題解( 最長遞增子序列的個數)

673. 最長遞增子序列的個數 給定一個未排序的整數數組 nums &#xff0c; 返回最長遞增子序列的個數 。 注意 這個數列必須是 嚴格 遞增的。 思路&#xff1a; 用一個maxlen表示當前最長遞增數組的長度&#xff0c;maxcount表示最大長度。當進下標為i的元素時&#xff0c;將…

重磅!新公司法正式實施,這些變化你必須知道! ?

新公司法來了&#xff01;企業設立和經營必知的關鍵變動 &#x1f3db;?&#x1f680; 大家好&#xff0c;我是貓頭虎&#xff0c;科技自媒體博主。今天我們來聊聊一件大事——新公司法的實施&#xff0c;這對企業設立和經營帶來了哪些重大影響&#xff1f;跟著我&#xff0c…

【DDIM】DENOISING DIFFUSION IMPLICIT MODELS【論文精讀】【視頻講解】【公式推導】

論文&#xff1a;DENOISING DIFFUSION IMPLICIT MODELS&#xff08;https://arxiv.org/abs/2010.02502&#xff09; B站視頻鏈接 DDIM論文精講視頻 去噪擴散隱模型的論文精讀&#xff0c;涉及本文的大部分公式逐步推導。總計3小時的詳細論文講解。 講解詳細對應文檔 DDIM視頻…

聊聊mysql

記錄那些坑 本文會持續更新&#xff0c;陸續更新有關mysql技術內幕、實戰優化、面試技巧。 文章目錄 前言索引BTree之聚集索引BTree之輔助索引BTree之聯合索引BTree之覆蓋索引 使用到的工具1、py_innodb_page_info工具2、hexdump工具 總結 前言 重中之重的MySql數據庫 mysql…

模擬人機猜數游戲

設計目的 1、加深學生對該課程基礎知識和基本理論的理解和掌握&#xff0c;培養學生綜合運用所學知識獨立 分析和解決問題的能力; 2、培養學生在計算機軟硬件開發、理論計算、查閱資料等方面的能力&#xff0c;使學生逐步樹立正 確的設計思想; 3、加強理論聯系實際&#xff0c…

邦芒支招:職場高效溝通的6個秘訣

??俗話說得好“良言一句三冬暖&#xff0c;惡語傷人六月寒。”無論在什么單位&#xff0c;社會上竟是形形色色的人等&#xff0c;人過一百&#xff0c;形形色色。每個人都想得到他人賞識、揮灑才華、爭得提升。但是&#xff0c;要和陌生的人融洽相處、溝通合作&#xff0c;是…

Android 藍牙語音通話調試

首先要清楚藍牙語音通話屬于藍牙得哪一個協議 1、HEADSET 耳機和免提模式,用于藍牙耳機 2、A2DP (advanced audio distribution profile)高級音頻及立體聲規范,包括A2DP SINK和A2DP SOURCE 3、HEALTH 健康設備規范,和一些健康設備進行通信 4、OPP (object push profi…

概率論期末速成(知識點+例題)

考試范圍 一&#xff1a; 事件關系運算性質全概率公式、貝葉斯公式古典概型 二&#xff1a; 離散分布律連續密度函數性質 -> 解決三個問題&#xff08;求待定系數、求概率、求密度函數&#xff09;分布函數 -> 解決三個問題常用分布&#xff08;最后一節課的那幾個分…

手電筒的光能飛到宇宙盡頭嗎

如果我們打開手電筒向夜空照一秒再關掉&#xff0c;我們將會看到&#xff0c;在關掉手電筒的一瞬間&#xff0c;手電筒發出的光束也會消失&#xff0c;那么&#xff0c;它發出的光哪去了呢&#xff1f;下面我們就來聊一下這個話題。實際上&#xff0c;我們看到的光束&#xff0…