由于公司项目一直没有整合分布式事务框架,最近查阅资料后觉得seata对代码的侵入性较小,所以决定整合seata。网上一堆博客搞得晕头转向,一路踩坑,最终还是搞定了。先来讲讲使用过程。
目前我的项目环境是:consul(注册中心) + oracle(数据库).
一、引入pom
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
二、引入kryo
这个是用来替换fastjson的,切记不要用fastjson,不然在序列化时候会各种报错
<!--kryo-->
<dependency>
<groupId>com.esotericsoftware.kryo</groupId>
<artifactId>kryo</artifactId>
<version>2.24.0</version>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
<version>0.45</version>
</dependency>
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>4.0.2</version>
</dependency>
三、修改application.yml
seata:直接顶格写就行
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_test_tx_group
enable-auto-data-source-proxy: true
data-source-proxy-mode: AT
use-jdk-proxy: false
excludes-for-auto-proxying: firstClassNameForExclude,secondClassNameForExclude
client:
rm:
async-commit-buffer-limit: 1000
report-retry-count: 5
table-meta-check-enable: false
report-success-enable: false
saga-branch-register-enable: false
saga-json-parser: fastjson
lock:
retry-interval: 10
retry-times: 30
retry-policy-branch-rollback-on-conflict: true
tm:
commit-retry-count: 5
rollback-retry-count: 5
default-global-transaction-timeout: 60000
degrade-check: false
degrade-check-period: 2000
degrade-check-allow-times: 10
undo:
data-validation: true
log-serialization: kryo
log-table: undo_log
only-care-update-columns: true
log:
exceptionRate: 100
service:
vgroup-mapping:
my_test_tx_group: wms_seata
grouplist:
default: 192.168.0.186:8091
enable-degrade: false
disable-global-transaction: false
transport:
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
server-executor-thread-prefix: NettyServerBizHandler
share-boss-worker: false
client-selector-thread-prefix: NettyClientSelector
client-selector-thread-size: 1
client-worker-thread-prefix: NettyClientWorkerThread
worker-thread-size: default
boss-thread-size: 1
type: TCP
server: NIO
heartbeat: true
serialization: seata
compressor: none
enable-client-batch-send-request: true
registry:
type: consul
load-balance: RandomLoadBalance
load-balance-virtual-nodes: 10
consul:
server-addr: 192.168.1.66:8500
四、事务发起方添加 @GlobalTransactional
加了这个全局事务即可,其他微服务方法上无需加这个注解
@Override
@GlobalTransactional
public void test(){
...
}
这样就完成了seata的整合使用。
五、数据库新增表
建表sql 在码云上的seata项目中有, 路径 script/server/db
另外还少了一张表叫undo_log,这个可以自行网上查找建表sql,如果你的业务库有多个,就在每一个库里建一张。
六、启动seata服务端
首先就是下载seata的服务端 seata.io/zh-cn/blog/… ,最好下载最新的版本1.3.0 +,不然对oracle的支持会有问题。
第二步修改配置文件。
seata 文件夹下有个conf文件夹,里面有 file.conf 和 registry.conf 这两个文件需要修改。我选择的是consul,所以其他没用部分就删除了。
registry.conf:
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "consul"
consul {
cluster = "test" #这个可以自定义
serverAddr = "192.168.1.66:8500"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "file"
file {
name = "file.conf"
}
}
file.conf:
service {
#transaction service group mapping
#修改,可不改,my_test_tx_group随便起名字。
vgroupMapping.my_test_tx_group = "test"
#only support when registry.type=file, please don't set multiple addresses
# 此服务的地址
default.grouplist = "192.168.0.186:8091"
#disable seata
disableGlobalTransaction = false
}
## transaction log store, only used in seata-server
store {
## store mode: file、db、redis
mode = "db"
## file store property
file {
## store location dir
dir = "sessionStore"
# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
maxBranchSessionSize = 16384
# globe session size , if exceeded throws exceptions
maxGlobalSessionSize = 512
# file buffer size , if exceeded allocate new buffer
fileWriteBufferCacheSize = 16384
# when recover batch read size
sessionReloadReadSize = 100
# async, sync
flushDiskMode = async
}
## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = "hikari"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "oracle"
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@//你的ip/数据库名"
user = "root"
password = "root"
minConn = 5
maxConn = 30
globalTable = "GLOBAL_TABLE"
branchTable = "BRANCH_TABLE"
lockTable = "LOCK_TABLE"
queryLimit = 100
maxWait = 5000
}
## redis store property
redis {
host = "192.168.1.66"
port = "6379"
password = ""
database = "0"
minConn = 1
maxConn = 10
queryLimit = 100
}
}
接着启动他, windows 下直接bin目录下双击 bat文件
这样就可以使用seata的分布式事务啦,自己抛个异常看看数据回滚了没。
如果还有遇到问题可以给我留言哦。