最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法

 更新時間:2021年05月02日 09:07:17   作者:小目標(biāo)青年  
這篇文章主要介紹了springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法 ,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

近期一直在忙項目,我也是打工仔。不多說,我們開始玩一玩seata。

正文

什么都不說,我們按照慣例,先上一個圖(圖里不規(guī)范的使用請忽略):

簡單一眼就看出來, 比我們平時用的東西,多了 Seata Server 微服務(wù) 。

同樣這個 Seata Server 微服務(wù) ,也是需要注冊到eureka上面去的。

那么我們首先就搞一搞這個 seata server ,那么剩下的就是一些原本的業(yè)務(wù)服務(wù)整合配置了。

該篇用的 seata server 版本,用的是1.4.1 , 可以去git下載下。當(dāng)然,我也是給你們備了的:

seata server 1.4.1 某度網(wǎng)盤分享地址:

鏈接: https://pan.baidu.com/s/1Oj1NkKwU4jeLjJ3Pu9hT2Q

提取碼: 9at6

第一步,下載下來解壓 :

第二步,創(chuàng)個 seata server 用的數(shù)據(jù)庫 :

CREATE TABLE `branch_table` (
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `resource_group_id` varchar(32) DEFAULT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `branch_type` varchar(8) DEFAULT NULL,
  `status` tinyint(4) DEFAULT NULL,
  `client_id` varchar(64) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `global_table` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `application_id` varchar(32) DEFAULT NULL,
  `transaction_service_group` varchar(32) DEFAULT NULL,
  `transaction_name` varchar(128) DEFAULT NULL,
  `timeout` int(11) DEFAULT NULL,
  `begin_time` bigint(20) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`xid`),
  KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(96) DEFAULT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `branch_id` bigint(20) NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

創(chuàng)建完后:

第三步,修改下 \seata-1.4.1\seata-server-1.4.1\seata\conf 里的配置文件一些信息 :

1. registry.conf

ok,registry.conf 這文件就修改這些配置項。

2. file.conf :

以上兩個文件配置完(記得保存), 我們先把我們的注冊中心 eureka服務(wù)跑起來,然后點擊啟動 seata server:

可以看到啟動成功(前提是eureka已經(jīng)啟動):

第三步 ,配置我們需要用到 分布式事務(wù) seata組件的 微服務(wù) :

我這里的示例實踐,需要用到的有2個微服務(wù) :

那么我們這兩個微服務(wù)都需要做點什么呢?

1. 在對應(yīng)的微服務(wù)的對應(yīng)的不同數(shù)據(jù)庫里(只要你想用上seata的), 都加上undo_log 這個表:

SQL語句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
 
-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime(0) NULL,
  `log_modified` datetime(0) NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
SET FOREIGN_KEY_CHECKS = 1;

2. 關(guān)鍵步驟了 , 導(dǎo)入jar包 (需要用到seata組件都服務(wù)都需要導(dǎo)入)

<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-seata</artifactId>
			<version>2.1.0.RELEASE</version>
			<exclusions>
				<exclusion>
					<artifactId>seata-all</artifactId>
					<groupId>io.seata</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<artifactId>seata-all</artifactId>
			<groupId>io.seata</groupId>
			<version>1.4.1</version>
		</dependency>

3.更加關(guān)鍵了,就是做配置

先總得了解下,需要用到seata的 微服務(wù)需要做些什么配置 ?

1. 在resources 下 新增2個配置文件 , file.conf 和 registry.conf

2.yml 新增配置seata 事務(wù)組參數(shù)

3.代碼調(diào)整數(shù)據(jù)源代理,交給seata代理

1. registry.conf

以上是業(yè)務(wù)微服務(wù)里的registry.conf 需要改動的配置信息 ,給出一份該篇文章使用的:

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"
  loadBalance = "RandomLoadBalance"
  loadBalanceVirtualNodes = 10
 
  nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka/"
    application = "seata-server"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = 0
    password = ""
    cluster = "default"
    timeout = 0
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}
 
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "file"
 
  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    appId = "seata-server"
    apolloMeta = "http://192.168.1.204:8801"
    namespace = "application"
    apolloAccesskeySecret = ""
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

file.conf

給出一份該篇使用的完整的:

transport {
  # tcp udt unix-domain-socket
  type = "TCP"
  #NIO NATIVE
  server = "NIO"
  #enable heartbeat
  heartbeat = true
  # the client batch send request enable
  enableClientBatchSendRequest = true
  #thread factory for netty
  threadFactory {
    bossThreadPrefix = "NettyBoss"
    workerThreadPrefix = "NettyServerNIOWorker"
    serverExecutorThread-prefix = "NettyServerBizHandler"
    shareBossWorker = false
    clientSelectorThreadPrefix = "NettyClientSelector"
    clientSelectorThreadSize = 1
    clientWorkerThreadPrefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    bossThreadSize = 1
    #auto default pin or 8
    workerThreadSize = "default"
  }
  shutdown {
    # when destroy server, wait seconds
    wait = 3
  }
  serialization = "seata"
  compressor = "none"
}
service {
#這里注意,等號前后都是配置,前面是yml里配置的事務(wù)組,后面是register.conf里定義的seata-server
  vgroupMapping.test_tx_group = "seata-server"
  #only support when registry.type=file, please don't set multiple addresses
  seata_tc_server.grouplist = "127.0.0.1:8091"
  #degrade, current not support
  enableDegrade = false
  #disable seata
  disableGlobalTransaction = false
}
client {
  rm {
    asyncCommitBufferLimit = 10000
    lock {
      retryInterval = 10
      retryTimes = 30
      retryPolicyBranchRollbackOnConflict = true
    }
    reportRetryCount = 5
    tableMetaCheckEnable = false
    reportSuccessEnable = false
  }
  tm {
    commitRetryCount = 5
    rollbackRetryCount = 5
  }
  undo {
    dataValidation = true
    logSerialization = "jackson"
    logTable = "undo_log"
  }
  log {
    exceptionRate = 100
  }
}

2. 需要在yml配置文件加上配置項,指明當(dāng)前服務(wù)使用了 seata分布式事務(wù)組件,且需要加入的分布式事務(wù)組是哪個:

spring:
  cloud:
    alibaba:
      seata.tx-service-group: test_tx_group

3.然后是需要將數(shù)據(jù)源交給seata去代理:

去掉默認(rèn)自動加載數(shù)據(jù)源

配置dao層掃描位置

@MapperScan("com.cloud.client1.dao")
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

然后是seata代理數(shù)據(jù)源(紅色標(biāo)注的地方需要注意下,都是實打?qū)嵅瘸鰜淼目印?dǎo)入類的來源以及掃描的mapper的xml位置):

ok,到這里一個微服務(wù) usercent的 整合 seata 分布式組件算是完成了。

同樣,我們繼續(xù)對 另外一個微服務(wù) coredata 做seata 分布式組件 整合 。

也是第一步,file.conf 和 registry.conf (其實我們現(xiàn)在就是讓這兩個微服務(wù)在同一個分布式事務(wù)組,我們直接把剛才在usercent那邊的兩個文件直接粘貼過來就好)。

然后第二步就是修改yml配置:

第三步就是新增seata數(shù)據(jù)源代理、application上的注解排除自動加載數(shù)據(jù)源和掃描dao層地址,yml上面的配置項:

完事,兩個業(yè)務(wù)微服務(wù)都整合了 分布式事務(wù)組件 seata ,而且都設(shè)置在同個分布式事務(wù)組里 (test_tx_group).

那么到這其實已經(jīng)完事了, 接下來玩下 分布式事務(wù)回滾場景 的例子 (怎么去使用)。

我該篇就不弄太多服務(wù)了,就弄了2個分布式服務(wù)。

展示的例子內(nèi)容 :

1. 上游服務(wù) 出錯, 觸發(fā)分布式事務(wù), 上下游服務(wù)都會事務(wù)回滾;

2.下游服務(wù) 出錯,觸發(fā)分布式事務(wù), 上下游服務(wù)都會事務(wù)回滾;(某種程度上講,下游出錯如果只有一個下游,其實不需分布式事務(wù),通過錯誤傳遞單個回滾也是可以的。但是如果服務(wù)調(diào)用鏈很長,中游服務(wù)出錯,需要整個鏈上的服務(wù)都事務(wù)回滾,那么就有必要都使用seata )

我們開始模擬:

第一個場景 上游服務(wù) coredata 使用seata全局事務(wù)注解@GlobalTransactional 標(biāo)記方法,先插入一個Account數(shù)據(jù) ;然后調(diào)用下游服務(wù) usercent 插入一條數(shù)據(jù);

然后 上游服務(wù) coredata繼續(xù)執(zhí)行業(yè)務(wù)邏輯,繼續(xù)插入數(shù)據(jù);

接著模擬上游服務(wù)coredata開始報錯(我們通過name長度故意觸發(fā)錯誤);

期望結(jié)果: 上下游兩個服務(wù) 在當(dāng)前方法事務(wù)下插入的數(shù)據(jù)都回滾!

上游服務(wù) coredata 方法:

通過fegin調(diào)用下游服務(wù) usercent 方法:

下游服務(wù) usercent 的插入方法:

開始模擬:

1.先把eureka跑起來:

暫時就注冊中心自己,沒有別的服務(wù):

2.把seata server 服務(wù)跑起來,注冊到eureka上去:

我是window環(huán)境,執(zhí)行.bat

可以看到已經(jīng)成功注冊到eureka上了:

3. 把上游微服務(wù) coredata 和 下游服務(wù) usercent 都跑起來:

然后看下seata server上,也可以看到 兩個服務(wù) 都成功‘注冊'到了 seata server上了,而且都在同一個事務(wù)組 test_tx_group里面:

接下來,就是開始調(diào)用一下我們模擬的場景代碼就完事了(不過我會加點圖來給大家簡單分析下):

一開始,都是沒有數(shù)據(jù)的:

調(diào)用上游服務(wù)coredata接口觸發(fā)一下整個流程:

調(diào)用開始:

我們打斷點到 上游已經(jīng)插入過一次數(shù)據(jù),下游也插入過一次數(shù)據(jù),

可以看到上游服務(wù)和下游服務(wù)的數(shù)據(jù)庫里面的undo_log表出現(xiàn)了 事務(wù)記錄,有關(guān)當(dāng)前事務(wù)的 branch_id和 所在事務(wù) xid,而且可以看到在兩個服務(wù)內(nèi)的undo_log表中記錄的xid都是一致的,代表他們都在一個事務(wù)中:

然后我們繼續(xù)往下執(zhí)行,故意讓上游報錯:

這時候,接口調(diào)用完畢結(jié)束:我們看到seata server里面的信息,可以看到全局事務(wù) xid為22080結(jié)尾,回滾成功:

回滾成功后,undo_log表中的記錄會刪除掉:

當(dāng)然我們兩個服務(wù)里面也是沒有數(shù)據(jù)的,因為回滾了:

這里可能有人會想,你查一下是空就能證明是回滾了么?

這時候我們也可以利用主鍵自增當(dāng)前值可以看到確實發(fā)生了數(shù)據(jù)回滾的場景:

第一個場景就到此吧。

接下來我們模擬第二個場景:

上游服務(wù) coredata 使用seata全局事務(wù)注解@GlobalTransactional 標(biāo)記方法,先插入一個Account數(shù)據(jù) ;然后調(diào)用下游服務(wù) usercent 插入一條數(shù)據(jù);

然后下游服務(wù) 直接模擬出錯, 這樣觸發(fā)事務(wù)回滾。 期望結(jié)果: 上下游兩個服務(wù) 在當(dāng)前方法事務(wù)下插入的數(shù)據(jù)都回滾!

也就是說我們需要對下游服務(wù)的插入方法里面做手腳,故意拋出錯誤:

快速調(diào)用一下:

可以看到下游出錯了:

看下我們的seata server怎么說,已出發(fā)分布式事務(wù),回滾成功:

數(shù)據(jù)庫里面的數(shù)據(jù)也是回滾了,空的:

好了,該篇springboot cloud使用eureka整合 分布式事務(wù)組件 Seata 就到此吧。

ps: 最近比較忙,每篇文章其實都是用一些零碎時間拼湊出來的。不過我會堅持我的文章的初衷,能讓大家跟著實踐,能搞懂,能學(xué)會。我...只是個散工。

到此這篇關(guān)于SpringCloud 整合分布式事務(wù)組件 Seata的文章就介紹到這了,更多相關(guān)SpringCloud 整合分布式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven安裝與配置圖文教程

    Maven安裝與配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Maven安裝與配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • spring boot整合shiro安全框架過程解析

    spring boot整合shiro安全框架過程解析

    這篇文章主要介紹了spring boot整合shiro安全框架過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Kotlin 基礎(chǔ)教程之?dāng)?shù)組容器

    Kotlin 基礎(chǔ)教程之?dāng)?shù)組容器

    這篇文章主要介紹了Kotlin 基礎(chǔ)教程之?dāng)?shù)組容器的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java 設(shè)計模式之適配器模式詳解

    Java 設(shè)計模式之適配器模式詳解

    設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性
    2021-11-11
  • java自帶的MessageDigest實現(xiàn)文本的md5加密算法

    java自帶的MessageDigest實現(xiàn)文本的md5加密算法

    這篇文章主要介紹了java自帶的MessageDigest實現(xiàn)文本的md5加密算法,需要的朋友可以參考下
    2015-12-12
  • Maven 多模塊父子工程的實現(xiàn)(含Spring Boot示例)

    Maven 多模塊父子工程的實現(xiàn)(含Spring Boot示例)

    這篇文章主要介紹了Maven 多模塊父子工程的實現(xiàn)(含Spring Boot示例),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java ThreadLocal原理解析以及應(yīng)用場景分析案例詳解

    Java ThreadLocal原理解析以及應(yīng)用場景分析案例詳解

    這篇文章主要介紹了Java ThreadLocal原理解析以及應(yīng)用場景分析案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Spring事務(wù)管理的使用細(xì)則淺析

    Spring事務(wù)管理的使用細(xì)則淺析

    事務(wù)的作用就是為了保證用戶的每一個操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring開發(fā)應(yīng)用時,大部分情況下也都需要使用事務(wù)
    2023-02-02
  • AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    這篇文章主要為大家介紹了AQS同步組件CyclicBarrier循環(huán)屏障用例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Spring實戰(zhàn)之清除緩存操作示例

    Spring實戰(zhàn)之清除緩存操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之清除緩存操作,結(jié)合實例形式詳細(xì)分析了spring清除緩存操作具體步驟、配置、領(lǐng)域模型及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01

最新評論

台湾省| 五台县| 资源县| 镇康县| 寿阳县| 丽江市| 女性| 唐河县| 彰化市| 从化市| 孟连| 石泉县| 胶州市| 武穴市| 酉阳| 宾阳县| 博罗县| 都江堰市| 略阳县| 凤台县| 天祝| 喜德县| 通化县| 如皋市| 宁晋县| 河曲县| 喜德县| 从化市| 肥东县| 饶阳县| 阿克陶县| 嫩江县| 孝义市| 铜川市| 台东市| 河东区| 铜梁县| 新建县| 寻乌县| 乌拉特前旗| 海兴县|