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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

欲从事服务端工作不懂seata?一篇小demo零基础带你快速掌握分布式事务框架seata的基本使用!

發布時間:2024/10/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 欲从事服务端工作不懂seata?一篇小demo零基础带你快速掌握分布式事务框架seata的基本使用! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

乾坤未定,你我皆是🐂🐎乾坤未定,你我皆是🐂 🐎🐂🐎,兄弟們,開卷了~

文章目錄

  • 一、seata的簡介
    • 1、從單一架構到分布式架構的發展歷程
    • 2、分布式架構出現了什么問題?
  • 二、模擬分布式場景
    • 2.1、seata下載安裝
    • 2.2、Nacos+Sentinel的相關教程(打波廣告~)
  • 三、seata的數據表導入
  • 四、seata-server配置文件的修改
    • 4.1、修改file.conf
    • 4.2、修改register.conf
    • 4.3、將conf.txt上傳至nacos
  • 五、代碼準備
    • 1.模擬思路
    • 2、核心代碼講解
    • 3、相關注意點
  • 六、不使用@GlobalTransactional注解
  • 七、使用@GlobalTransactional注解


代碼地址:https://download.csdn.net/download/Kevinnsm/19436005?spm=1001.2014.3001.5501

一、seata的簡介

Seata 是一款開源的分布式事務解決方案,致力于提供高性能和簡單易用的分布式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,為用戶打造一站式的分布式解決方案。

1、從單一架構到分布式架構的發展歷程

階段一:最初的互聯網由于用戶體量小,單一架構就能夠滿足企業需求。隨著互聯網的不斷發展,用戶體量不斷增加,普通的單一架構已經不能支撐起龐大的用戶量。

階段二:、數據服務器和應用服務器分離,并發展出了集群的概念

階段三:在這個階段人們發現了一種問題,那就是數據庫讀操作遠遠大于寫操作,這造成了讀寫比例失衡,對服務器的性能有很大的影響,所以就出現了數據庫的讀寫分離

階段四: 數據庫做讀庫的話,常常對模糊查詢的性能不是很好,所以又引入了搜索引擎這個概念。同時出現了緩存數據庫,對熱點數據進行存儲,減少了數據庫的壓力。

階段五: 隨著業務的發展,業務越來越多,應用的壓力越來越大。服務開始拆分,通過RPC技術進行遠程調用

2、分布式架構出現了什么問題?

服務之間的拆分,分庫分表到底會產生什么影響。且先看下圖

根據上方這張圖,你能夠看出什么問題;
比如說系統執行到第三步出現了問題,那么前兩步已經對商品庫存進行了減量,是不是就是出現了很大的問題。

這就是我們常見的事務問題,我們必須要求要么全部成功,要么全部失敗!




二、模擬分布式場景

下面我模擬這樣一個場景,看看是否會出現這樣的問題

2.1、seata下載安裝

下載地址:https://github.com/seata/seata/releases



啟動命令就在bin里,一會還需要對配置文件做修改,安裝之后先不做任何操作



2.2、Nacos+Sentinel的相關教程(打波廣告~)


我使用的是云服務器安裝的seata,默認你已經了解過nacos

云服務器Linux jdk安裝詳解https://blog.csdn.net/Kevinnsm/article/details/116193837?spm=1001.2014.3001.5501
2021年零基礎帶你走進nacos的世界之云服務器下載安裝nacos-小白教程,詳細到爆了!https://blog.csdn.net/Kevinnsm/article/details/117387323?spm=1001.2014.3001.5501
本地Navicat連接阿里云數據庫RDS for MySQL(全網最詳細,沒有之一!)https://blog.csdn.net/Kevinnsm/article/details/117437544?spm=1001.2014.3001.5501
一分鐘帶你快速進入Nacos的世界,史上最簡易教程!零基礎也能看明白!誰反對?https://blog.csdn.net/Kevinnsm/article/details/117390678?spm=1001.2014.3001.5501
不會Nacos的配置中心?你怎么敢的呀!如何一步步實現Nacos作為服務的配置中心(全網最詳系列)https://blog.csdn.net/Kevinnsm/article/details/117410495?spm=1001.2014.3001.5501
零基礎帶你一步步搭建Nacos高可用集群(史上最詳細,賽過教科書!)為此我準備了三臺云服務器+云數據庫https://blog.csdn.net/Kevinnsm/article/details/117440619?spm=1001.2014.3001.5501
全網最詳細的Sentinel安裝教程,沒有之一!誰反對?(Linux+windows)https://blog.csdn.net/Kevinnsm/article/details/117479096?spm=1001.2014.3001.5501
簡單幾行代碼帶你快速了解淘寶雙十一的強大技術支撐點Sentinel+Nacoshttps://blog.csdn.net/Kevinnsm/article/details/117520719?spm=1001.2014.3001.5501
手把手帶你領略雙十一背后的核心組件Sentinel之流控規則https://blog.csdn.net/Kevinnsm/article/details/117559362?spm=1001.2014.3001.5501
手把手帶你領略雙十一背后的核心技術Sentinel之服務的熔斷降級https://blog.csdn.net/Kevinnsm/article/details/117560907?spm=1001.2014.3001.5501
手把手帶你領略雙十一背后的核心技術Sentinel之熱點參數限流https://blog.csdn.net/Kevinnsm/article/details/117575011?spm=1001.2014.3001.5501
流控組件Sentinel核心注解@SentinelResource中的參數fallback和blockHandler的使用方式https://blog.csdn.net/Kevinnsm/article/details/117599007?spm=1001.2014.3001.5501
Sentinel+Nacos實現Sentinel的持久化規則,就很nice!https://blog.csdn.net/Kevinnsm/article/details/117601806?spm=1001.2014.3001.5501
欲從事服務端工作不懂seata?一篇小demo零基礎帶你快速掌握分布式事務框架seata的基本使用!



三、seata的數據表導入






這幾個sql腳本我已經上傳到CSDN了

免積分下載地址:https://download.csdn.net/download/Kevinnsm/19428868?spm=1001.2014.3001.5501

四、seata-server配置文件的修改

4.1、修改file.conf

store mode: file、db、redismode = "db" //注意修改為db(數據庫)## rsa decryption public keypublicKey = ""## file store propertyfile {## store location dirdir = "sessionStore"# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptionsmaxBranchSessionSize = 16384# globe session size , if exceeded throws exceptionsmaxGlobalSessionSize = 512# file buffer size , if exceeded allocate new bufferfileWriteBufferCacheSize = 16384# when recover batch read sizesessionReloadReadSize = 100# async, syncflushDiskMode = async}## database store propertydb { //前面修改為db,就會走這條路線## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql" //注意修改相關mysql連接信息driverClassName = "com.mysql.cj.jdbc.Driver"## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection paramurl = "jdbc:mysql://rm-b9v16dc34x1uo.mysql.rds.aliyuncs.com:3306/seata?rewriteBatchedStatements=true&serverTimezone=UTC"user = "administrator"password = "xxxxxxxx"minConn = 5maxConn = 100globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}## redis store propertyredis {## redis mode: single、sentinelmode = "single"## single mode propertysingle {host = "127.0.0.1"port = "6379"}## sentinel mode propertysentinel {masterName = ""## such as "10.28.235.65:26379,10.28.235.65:26380,10.28.235.65:26381"sentinelHosts = ""}password = ""database = "0"minConn = 1maxConn = 10maxTotal = 100queryLimit = 100} }

4.2、修改register.conf

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos" //注冊中心修改為nacosnacos { //上面是nacos,這里就會走這條nacos路線application = "seata-server"serverAddr = "124.xx.xxx.xxx:8848"//注冊中心地址group = "SEATA_GROUP"namespace = ""cluster = "default"username = "nacos"password = "nacos"}eureka {serviceUrl = "http://localhost:8761/eureka"application = "default"weight = "1"}redis {serverAddr = "localhost:6379"db = 0password = ""cluster = "default"timeout = 0}zk {cluster = "default"serverAddr = "127.0.0.1:2181"sessionTimeout = 6000connectTimeout = 2000username = ""password = ""}consul {cluster = "default"serverAddr = "127.0.0.1:8500"aclToken = ""}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、etcd3type = "nacos" //配置中心修改為nacosnacos { //走這條路線serverAddr = "124.xx.xxx.xx:8848"namespace = "seata"group = "SEATA_GROUP"username = "nacos"password = "nacos"dataId = "seataServer.properties"}consul {serverAddr = "127.0.0.1:8500"aclToken = ""}apollo {appId = "seata-server"## apolloConfigService will cover apolloMetaapolloMeta = "http://192.168.1.204:8801"apolloConfigService = "http://192.168.1.204:8080"namespace = "application"apolloAccesskeySecret = ""cluster = "seata"}zk {serverAddr = "127.0.0.1:2181"sessionTimeout = 6000connectTimeout = 2000username = ""password = ""nodePath = "/seata/seata.properties"}etcd3 {serverAddr = "http://localhost:2379"}file {name = "file.conf"} }

4.3、將conf.txt上傳至nacos

transport.type=TCP transport.server=NIO transport.heartbeat=true transport.enableClientBatchSendRequest=true transport.threadFactory.bossThreadPrefix=NettyBoss transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler transport.threadFactory.shareBossWorker=false transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector transport.threadFactory.clientSelectorThreadSize=1 transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread transport.threadFactory.bossThreadSize=1 transport.threadFactory.workerThreadSize=default transport.shutdown.wait=3 service.vgroupMapping.my_test_tx_group=default//這個my_test_tx_group和application.yml對應 service.default.grouplist=127.0.0.1:8091 service.enableDegrade=false service.disableGlobalTransaction=false client.rm.asyncCommitBufferLimit=10000 client.rm.lock.retryInterval=10 client.rm.lock.retryTimes=30 client.rm.lock.retryPolicyBranchRollbackOnConflict=true client.rm.reportRetryCount=5 client.rm.tableMetaCheckEnable=false client.rm.tableMetaCheckerInterval=60000 client.rm.sqlParserType=druid client.rm.reportSuccessEnable=false client.rm.sagaBranchRegisterEnable=false client.rm.tccActionInterceptorOrder=-2147482648 client.tm.commitRetryCount=5 client.tm.rollbackRetryCount=5 client.tm.defaultGlobalTransactionTimeout=60000 client.tm.degradeCheck=false client.tm.degradeCheckAllowTimes=10 client.tm.degradeCheckPeriod=2000 client.tm.interceptorOrder=-2147482648 store.mode=db //注意修改為db store.lock.mode=file store.session.mode=file store.publicKey= store.file.dir=file_store/data store.file.maxBranchSessionSize=16384 store.file.maxGlobalSessionSize=512 store.file.fileWriteBufferCacheSize=16384 store.file.flushDiskMode=async store.file.sessionReloadReadSize=100 store.db.datasource=druid store.db.dbType=mysql //注意修改相關配置文件 store.db.driverClassName=com.mysql.cj.jdbc.Driver store.db.url=jdbc:mysql://rm-bp13rrs9v16dc34x1uo.mysql.rds.xxxncs.com:3306/seata_order?serverTimezone=UTC store.db.user=common_1 store.db.password=Hao_7886 store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000 store.redis.mode=single store.redis.single.host=127.0.0.1 store.redis.single.port=6379 store.redis.sentinel.masterName= store.redis.sentinel.sentinelHosts= store.redis.maxConn=10 store.redis.minConn=1 store.redis.maxTotal=100 store.redis.database=0 store.redis.password= store.redis.queryLimit=100 server.recovery.committingRetryPeriod=1000 server.recovery.asynCommittingRetryPeriod=1000 server.recovery.rollbackingRetryPeriod=1000 server.recovery.timeoutRetryPeriod=1000 server.maxCommitRetryTimeout=-1 server.maxRollbackRetryTimeout=-1 server.rollbackRetryTimeoutUnlockEnable=false server.distributedLockExpireTime=10000 client.undo.dataValidation=true client.undo.logSerialization=jackson client.undo.onlyCareUpdateColumns=true server.undo.logSaveDays=7 server.undo.logDeletePeriod=86400000 client.undo.logTable=undo_log client.undo.compress.enable=true client.undo.compress.type=zip client.undo.compress.threshold=64k log.exceptionRate=100 transport.serialization=seata transport.compressor=none metrics.enabled=false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898

nacos-config.sh腳本下載地址:https://gitee.com/yuemei/vxx/blob/master/nacos-config.sh

將config.txt上傳至conf的同級目錄,并新建script文件夾,將nacos-config.sh腳本放進去

如果你是自己創建的腳本,然后把腳本代碼復制過去的,注意修改腳本文件格式,因為window和Linux腳本格式有點區別。如若不改動,應該會報bash/r錯誤。

執行nacos-config.sh腳本即可,然后去nacos控制臺查看列表

出現這些就代表成功了!




五、代碼準備

1.模擬思路


seata組件中的@GlobalTransactional注解能夠保證分布式事務的一致性

相關代碼我已經上傳至CSDN了:https://download.csdn.net/download/Kevinnsm/19436005?spm=1001.2014.3001.5501

2、核心代碼講解

三個子模塊,基本上相關配置是一模一樣的

以訂單服務模塊為例(seata-order-service)




3、相關注意點

1、啟動seata-server之前一定要先啟動nacos
2、在1.x版本之后,已經改為了駝峰命名(vgroup_mapping->vgroupMapping)
3、啟動服務之前,需要將nacos和seata服務啟動
4、蒼天保佑吧!

六、不使用@GlobalTransactional注解

我在訂單狀態修改之前,手動加入一個錯誤,讓其結束執行

我設置的訂單狀態1代表已下單,0代表還未下單(也就是付錢)

未執行之前數據庫各表中的數據如下所示


啟動服務測試

訪問:http://localhost:7071/order/create&userId=1&storageId=1&commodityCode=法拉第&orderCount=1&money=100&status=0

查看控制臺

查看數據庫表中的數據變化



訂單狀態未修改(0代表未下單),但是庫存和賬戶余額已經減量了;這就是分布式事務問題,有些成功了,有些失敗了,沒有做到協調一致

七、使用@GlobalTransactional注解

將數據庫中的數據回歸到最初


加入@GlobalTransactional注解

重新啟動測試,查看控制臺

查看數據庫表發現沒有發送任何變化



此時也可以從undo_log表中查看到記錄

以seata_account數據庫中的為例

成功!

總結

以上是生活随笔為你收集整理的欲从事服务端工作不懂seata?一篇小demo零基础带你快速掌握分布式事务框架seata的基本使用!的全部內容,希望文章能夠幫你解決所遇到的問題。

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