springboot整合seata1.5.2+nacos2.1.1
一、前言
Seata出現前,大部分公司使用的都是TCC或者MQ(RocketMq)等來解決分布式事務的問題,TCC代碼編寫復雜,每個業務均需要實現三個入口,侵入性強,RocketMQ保證的是最終一致性。
二、環境準備
1、nacos:(這里采用最新版本2.1.1)
下載地址:https://github.com/alibaba/nacos/releases
官方文檔:https://nacos.io/zh-cn/docs/what-is-nacos.html
2、seata:(這里采用最新版本1.5.2)
下載地址:https://github.com/seata/seata/releases
官方文檔:http://seata.io/zh-cn/docs/overview/what-is-seata.html
3、其它:
redis、maven、mysql等(自行安裝)
三、項目搭建(這里僅作本地測試,均采用單機模式)
1、mysql 自行下載、安裝,創建數據庫seata、nacos、seata-user、seata-order(后面兩個是接入seata的微服務的數據庫)
2、nacos
①解壓壓縮包,進入nacos目錄
②進入conf目錄,拷貝nacos-mysql.sql到數據庫nacos初始化
③打開application.properties,找到如下配置,放開注釋,修改為本地連接
### If use MySQL as datasource:
spring.datasource.platform=mysql ### Count of DB:
db.num=1 ### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
④進入bin目錄,執行cmd命令," .\startup.cmd -m standalone",觀察到如下日志,無報錯,即啟動成功
⑤上圖標出的即為nacos管理界面的地址,賬號密碼均為nacos,登錄成功
⑥新建命令空間,我這里加的"yhc",大家可以自定義,不過后面seata和server的配置需要對應上,后文也會提到。
⑦新建配置"seata.yml",這個配置可以從seata官網demo中找到,注意只用修改db連接即可。
metrics:
enabled: false
exporterList: prometheus
exporterPrometheusPort: 9898
registryType: compact
server:
maxCommitRetryTimeout: -1
maxRollbackRetryTimeout: -1
recovery:
asynCommittingRetryPeriod: 1000
committingRetryPeriod: 1000
rollbackingRetryPeriod: 1000
timeoutRetryPeriod: 1000
rollbackRetryTimeoutUnlockEnable: false
undo:
logDeletePeriod: 86400000
logSaveDays: 7
store:
db:
branchTable: branch_table
datasource: druid
dbType: mysql
driverClassName: com.mysql.cj.jdbc.Driver
globalTable: global_table
lockTable: lock_table
maxConn: 30
maxWait: 5000
minConn: 5
password: root
queryLimit: 100
url: jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true&useSSL=false
user: root
mode: db
transport:
compressor: none
serialization: seata
3、seata
①解壓壓縮包,進入seata目錄
②進入/script/server/db目錄,拷貝mysql.sql到數據庫seata初始化
③進入/conf目錄,修改application.yml配置文件,配置中心和注冊中心改為nacos
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
nacos:
server-addr: localhost:8848
namespace: c23f9030-953e-46bb-8c6e-0bf4a8227a8c
group: yhc
username: nacos
password: nacos
data-id: seata.yml
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: localhost:8848
namespace: c23f9030-953e-46bb-8c6e-0bf4a8227a8c
group: yhc
username: nacos
password: nacos
④進入/bin目錄,雙擊執行seata-server.bat啟動
⑤打開nacos列表,觀察seata服務注冊成功
4、服務接入
①引入依賴
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.5.2</version>
</dependency>
②添加seata配置(注意替換nacos配置)
seata:
enabled: true
# Seata 應用編號,默認為 ${spring.application.name}
application-id: ${spring.application.name}
# Seata 事務組編號,用于 TC 集群名
tx-service-group: ${spring.application.name}-group
# 關閉自動代理
enable-auto-data-source-proxy: true
# 服務配置項
service:
# 虛擬組和分組的映射
vgroup-mapping:
seata-user-group: default # config:
# # support: nacos, consul, apollo, zk, etcd3
# type: nacos
# nacos:
# server-addr: localhost:8848
# namespace: c23f9030-953e-46bb-8c6e-0bf4a8227a8c
# group: yhc
# username: nacos
# password: nacos
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace: 1238c7de-5821-452d-8586-639ccca55768
group: yhc
# username: nacos
# password: nacos
# cluster: default
③在需要事務管理的地方添加seata注解@GlobalTransactional
④在seata-user數據庫初始化undo_log表
⑤另一個微服務seata-order也按如上操作配置,源碼地址:https://gitee.com/yhc910/seata-demo.git
⑥啟動redis服務、seata-user服務、seata-order服務
四、測試
UserServiceImpl類里,修改如下判斷值,驗證事務回滾。
1、數據正常提交
結果:賬戶余額減少,交易記錄正常保存
2、修改判斷值為true,拋出異常
結果:賬戶不動,無交易記錄,說明事務已回滾
3、修改判斷值為false,重復操作1
結果:發現id有間隔(注意:我們的業務表的主鍵id是自增),是因為seata是先將數據插入后,事務回滾做的刪除,所以該刪除數據的id無記錄。
此次接入有比較多的注意點,這里我列下:
1、nacos單機啟動命令,需添加 -m standalone 指定模式
2、接入seata的配置,tx-service-group的值與vgroup-mapping需保持一致
3、A服務調用B服務,B服務獲取xid為null,是因為xid沒被透傳,需自定義Feign的RequestInterceptor處理。
String xid = RootContext.getXID();
template.header(RootContext.KEY_XID, xid);
下篇會整合shardingpshere,有興趣的可以先看看這篇文章:https://www.cnblogs.com/yhc-910/p/16543293.html
總結
以上是生活随笔為你收集整理的springboot整合seata1.5.2+nacos2.1.1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: filter 作用
- 下一篇: 利用RATF框架实现web状态的监控