seata1.6.1的配置部署与使用目录
前言
这是针对于 Windows版本 的配置部署,不过linux版本的也是一样的。
而工程中的配置文件都是 使用 的是Spring官方比较推荐的 yaml/yml 进行配置。
因为seata1.6.1是2022年12月份推出的新版本,具笔者写文档的2023年7月份过去不到7个月,其中资料不能说绝无仅有,也是少的可怜。所以笔者经历了几天的时间进行实践,终于能摸清点seata的新版配置。
读者研读这篇文章也能为2023年7月才出的seata1.7打下基础。而我们可以看到他们的github上已经有2.0的分支了
这里还是推荐读者关于配置方面使用Spring官方推荐的yaml/yml进行配置。
而本文所进行的配置步骤,可以延伸至1.7,以及前面的1.5,满足知识的迁移性。
技术选型:
这里选择的是阿里巴巴的spring-cloud的全家桶,基于2023年7月份较为新的版本:
如果是新的最好整个对应的生态都是比较新的版本,这样之间才不会有各种兼容性问题。
而其本质不变,且应该能向下兼容的。
所以笔者欢迎各位技术同仁进行测试后在评论区进行讨论是否能进行兼容。
阿里微服务生态:
服务注册与配置中心:
nacos-server-2.2.3
服务熔断中心:
sentinel-dashboard-1.8.6.jar
分布式事务解决方案
seata-server-1.6.1
如果对其源码感兴趣的可以下载seata-1.6.1.zip
业务工程版本选择
父工程:
spring-boot-starter : v2.3.9RELEASE
spring-cloud-alibaba : v2.2.9RELEASE
spring-cloud : Hoxton.RELEASE
这里解释为什么还需要Spring-Cloud-Hoxton,是因为我们后期需要使用OpenFeign进行远程调用其他微服务的方法(资源)。所以需要Cloud。
所提供服务:
nacos 与 sentinel 这些用父工程所自带的版本就可以了。
seata:
spring-cloud-starter-alibaba-seata v:2022.0.0.0-RC2
这里的seata需要格外注意。如果要用最新版的seata1.6.1版本的依赖需要使用的是这个版本,而不是使用自带的父工程中自带的版本的seata。
不过可以不带版本号,然后排除spring-cloud-alibaba : v2.2.9RELEASE 里自带的一些关于seata1.5的相关配置,使用新的1.6.1的配置。
而业务中的所需要的数据库以及其他的,请自行选择版本。
seata-server的配置
因为seata-server在1.4.1之后就没有file.config,registry.config等文件,而取而代之的是全是yml文件
通过抓图:可以看到在conf目录下有四个部分,而我们需要的是application.yml,并且官方还很贴心的给你了一个 application.example.yml 的实例文件(他真的,我哭死)。
其实大部分的配置按照这个application.example.yml进行配置就可以了。
但这个时候笔者这里建议:观看它的官网。
在用户文档标签里的参数配置与事务分组获取相关的配置的知识,了解它里面的某些配置项的意思。
但要注意官网的一些概念所指:
在参数配置中:server指的是seata-server,而client指的是我们自己搭建的业务服务端。所以server端的配置参数就是在seata中进行配置的,client端就是在我们自己搭建的业务服务中所需要进行配置的一些参数。
而同理在事务分组中的事务分组介绍这个标签下也是同样的道理(同时点名批评:事务分组介绍中的文档,还在使用seata1.4.1没有进行更改成对应的版本进行写的)。
那么在开始配置之前,建议先对application.yml进行备份(这是一个非常好的工程习惯,以前笔者喜欢注释,但其实那样效率太低了,不如备份一个完整的好),这里笔者的备份就是:application - 默认出厂设置.yml
然后配置的时候按照官网所写的,与application.example.yml所写的进行相互参考。很快就能将seata-server的服务端进行自定义化配置。
而这里笔者就贴出自己的yml文件供大家参考:
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: ../runninglogs/logs/seata
extend:
logstash-appender:
destination: 127.0.0.1:4560
kafka-appender:
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstash
console:
user:
username: seata
password: seata
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group: DEFAULT_GROUP
data-id: seataServerConfig.yml
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
group: DEFAULT_GROUP
server-addr: 127.0.0.1:8848
store:
# support: file 、 db 、 redis
mode: db
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
user: 用户名
password: 密码
min-conn: 10
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 1000
max-wait: 5000
# server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'
# 将安全认证进行去除,因为可能会导致一定的问题
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
关于变化
这里我们可以看到,基本的配置和之前没有多大的区别,最基本的区别就是从conf的语法变为了yml。
以前可能是
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "file" ---------------> 使用file作为注册中心
}
现在则是:
seata:
registry:
type: file
给人感觉就是想换了一个语法而已,并没有什么区别。
但是,虽然没什么变化。
还是有一处关键的变化:
在1.4.1版本以前需要在file.conf中配置:
service {
vgroupMapping.my_test_tx_group = "default"
default.grouplist = "127.0.0.1:8091"
}
从而让其TC识别事务组名,从而进行注册事务。
seatea1.6.1的配置中根本不需要在seata-server端进行这样的配置。笔者这么说是因为在官方文档中在 参数配置 这一标签页中直接没有这一配置。(不得不说因为官网的一些说不清的名词,还有就是一些落后的文档信息,导致我在阅读的时候直接忽略了好多东西,重头仔细读文档的时候才发现有些东西官网虽然还是之前的配置环境,但思想已经进行改变了。说到底我还是太菜了)
seata14.1这种设计有很严重的弊端,就是如果想要新增就要去seata-server的配置里面进行更改,然后还要重启服务,这就违背了seata设计的初衷。所以现在关于这里的配置在所需要的业务端进行配置。(以上两句话都是笔者对改动的一些推测,并不一定是seata官方团队所想的。)
而关于业务端的配置将在下文中进行揭晓。
关于笔者的环境
刚刚的配置,读者也能看到,笔者这里使用了nacos做为服务注册发现中心,并用MySQL与Druid数据库连接池,对数据库进行操作。
关于最后几行的security的配置
这块配置是必须要有的,因为没有这个配置,seata-server在启动的时候会报安全验证的错误。具体为什么大家感兴趣可以看看源码。
顺便说一个小技巧,在这种需要使用 xxx.bat 或者 xxx.cmd 进行启动的,或者关闭的。最好使用win命令行的方式进行启动,或者如果实在不喜欢命令行,可以在文件最后加一行:
pause
不过有时候你要阅读一下这个文件里面写的是什么。
比如笔者这里的文件:
创建名为seata数据库
配置完了application.yml千万别忘了在数据库中添加一个名为seata的数据库。
因为application.yml中进行配置了相关的数据库
这里最后一行的seata表示需要在数据库里自己创建。
首先根据下图的找到关于自己对应数据库的相关脚本。
这里笔者所使用的mysql,所以笔者找寻到mysql.sql文件并在自己MySQL中创建了seata的数据库,然后执行了这个文件夹下的mysql.sql的文件语句。
启动 seata-server 服务器
首先在启动seata前需要先启动nacos,因为我们在配置里面进行
在seata文件下的bin中寻找seata-server.bat,并点击它,在windows系统下启动。
笔者的地址为:seata文件所在目录\seata-server-1.6.1\bin
下找到seata-server.bat 然后点击就可以打开了。如果出现闪退的现象,请使用上面的方式进行检测是否有其他报错。
革命尚未成功,同志仍需努力
虽然能够成功启动seata,但如何使用它也是非常重要的。
现在开始搭建能使用seata的业务环境。
这里笔者选择搭建官网的例子,并参考一部分尚硅谷的数据库字段,从而搭建其项目。
这里推荐读者使用自己的项目,笔者会将重要的pom依赖以及配置进行书写。
父工程
关键依赖的父工程pom 文件配置如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<springcloud.version>Hoxton.RELEASE</springcloud.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--spring-boot的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--spring-cloud的starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<!--spring-boot-test的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springcloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这里的配置文件与之前技术选型是一样的。
业务逻辑模块
依赖
接下来是三个业务模块的依赖以及配置,这里以Order(订单服务)进行举例
<dependencies>
<!--spring-web-mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--开启监控接口-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--nacos服务发现中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos服务配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--seata相关的配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2022.0.0.0-RC2</version>
</dependency>
<!--baomidou-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
从中我们可以看到因为我们选择mysql进行存储业务数据,所以需要mysql依赖,以及使用mybatis-plus进行快速的业务逻辑搭建,所以有苞米豆的依赖。
而最重要的就是这个依赖:
<!--seata相关的配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2022.0.0.0-RC2</version>
</dependency>
这里seata的配置是通过淘宝镜像网站中所搜索到的。这里面包含了1.5的版本的一些配置,和1.6.1的关键依赖,只要带上这个版本号: 2022.0.0.0-RC2 就可以避免排除后新加的麻烦。
注:
如果只是按照尚硅谷的视频中排除一个是不行的,需要排除两个然后,在使用1.6.1版本的两个,但具体那两个笔者忘保存了,现在找不到。所以大家可以进行补充。
配置
关键的配置如下:
seata:
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
my_test_tx_group: default
registry:
type: nacos
nacos:
server-addr: localhost:8848
application: seata-server
group: DEFAULT_GROUP
其中:
tx-service-group的值表示的是下面vgroup-mapping中可以选择的变量。
而在vgroup-mapping下的my_test_tx_group的值是你要在@GlobalTransactional里面的name所写的值
而后面也是同样重要,代表着你的连接的TC到底是那个TC
所以是registry这个变量下面的type就是需要从那个注册中心找到seata,
后面就是nacos的很多配置,还有个重要的是连接TC的应用名称为:seata-server
完整的笔者配置如下:
server:
port: 8001
spring:
application:
name: cloud-alibaba-seata-order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
group: DEFAULT_GROUP
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/order所在的业务数据库?useUnicode=true&characterEncoding=utf-8
username: 数据库账号
password: 数据库密码
management:
endpoints:
web:
exposure:
include: '*'
seata:
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
my_test_tx_group: default
registry:
type: nacos
nacos:
server-addr: localhost:8848
application: seata-server
group: DEFAULT_GROUP
当配完这些
终于可以在自己的代码里面加入 @GlobalTransactional 进行愉快的玩耍了。
问题的出现
当读者愉快的玩耍的时候,会发现,只有加入 @GlobalTransactional 这个注解表进行了回滚,而其他的并不会回滚。
这个时候推荐看这篇文章进行排查:
可以多多参考这个大佬的文章的解决方法,里面讲解了很多关于失败的调试方法以及应对手段。
笔者也是因为发现问题后找到的这篇宝藏文章。从而添加了部分代码,才成功让单个错误时,三数据库的三表回滚的。
后记
当我整理完1.6.1的seata使用版本的时候,就已经有同仁尝试过了1.7的配置。1.7的配置和1.6.1配置差不多,可以先学习1.6.1配置,然后直接应用到1.7版本上。