欲从事服务端工作不懂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
| 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+Nacos | https://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=9898nacos-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的基本使用!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: seata+nacos出现can not
- 下一篇: 那些年,我的数据结构课设,现在满满的回忆