SpringCloud Alibaba Seata安装配置吗,使用Nacos为配置中心
下载安装
官网下载地址:https://github.com/seata/seata/releases
下载下来解压即可,目前最新版本为1.4.0(下载服务包和源码包)
概念介绍
seata分布式事务解决方案在使用中分为server端和client端。
- server端:就是下载的seata,配置好后直接启动运行。
- client端:需要业务系统集成seata。
主要配置文件registry.conf。
Server端存储模式(store.mode)现有file、db、redis三种(后续将引入raft,mongodb),file模式无需改动,直接启动即可,下面专门讲下db和redis启动步骤。
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;
db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.
注册中心
- 什么是注册中心?
注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用.比如Seata Client端(TM,RM),发现Seata Server(TC)集群的地址,彼此通信. - Seata的注册中心与Dubbo,Spring cloud的注册中心区别是?
在广义上来说,并无区别,只不过Dubbo与Spring cloud的注册中心仅是作用于它们自身的组件,而Seata的注册中心也是一样是作用于Seata自身.(注:Dubbo与Spring cloud的注册中心与Seata无关)
配置中心
- 什么是配置中心?
配置中心可以说是一个"大衣柜",内部放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息. - Seata的配置中心与Spring cloud的配置中心区别是?
在广义上来说,并无区别,只不过Spring cloud的配置中心仅是作用于它们自身的组件,而Seata的配置中心也是一样是作用于Seata自身.(注:Spring cloud的配置中心与Seata无关)
事务分组
-
事务分组是什么?
事务分组是seata的资源逻辑,类似于服务实例。在file.conf中的my_test_tx_group就是一个事务分组。 -
通过事务分组如何找到后端集群?
- 首先程序中配置了事务分组(GlobalTransactionScanner 构造方法的txServiceGroup参数)
- 程序会通过用户配置的配置中心去寻找service.vgroupMapping .[事务分组配置项],取得配置项的值就是TC集群的名称
- 拿到集群名称程序通过一定的前后缀+集群名称去构造服务名,各配置中心的服务名实现不同
- 拿到服务名去相应的注册中心去拉取相应服务名的服务列表,获得后端真实的TC服务列表
- 为什么这么设计,不直接取服务名?
这里多了一层获取事务分组到映射集群的配置。这样设计后,事务分组可以作为资源的逻辑隔离单位,出现某集群故障时可以快速failover,只切换对应分组,可以把故障缩减到服务级别,但前提也是你有足够server集群。
SpringCloud项目整合Seata
maven依赖 官方推荐依赖方式(默认项目已经使用Nacos)
<!-- 集成seata分布式事务 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>项目中spring-cloud-alibaba的版本</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- seata注册配置中心 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.3.2</version>
</dependency>
修改server端registry.conf配置(注册中心和配置中心使用nacos)
- 在nacos控制台中创建一个新的命名空间seata(记住这个ID)
- 配置server端注册中心和配置中心
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
loadBalance = "RandomLoadBalance"
loadBalanceVirtualNodes = 10
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "naocs中命名空间ID"
cluster = "default"
username = "nacos登录账号"
password = "nacos登录密码"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = "naocs中命名空间ID"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
}
上传配置到至Nacos配置中心,在下载的源码包中seata-source-1.4.0\script\config-center文件夹下。
config.txt是官方配置好的参数,直接使用nacos文件里面的脚本上传配置即可。参数介绍
./nacos/nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 命名空间ID -u nacos账号-w nacos密码
官方教程连接
上传成功后,就可以在nacos上面看见了
- 配置client端注册中心和配置中心
在项目的通用配置application.yml中配置(也可以在要使用seata的每个服务里面的application,yml中配置)
# seata配置
seata:
registry:
type: nacos
# 复制的seata config文件夹里面的registry.conf内容
nacos:
# 和server端中application一致
application: "seata-server"
serverAddr: localhost:8848
group: "SEATA_GROUP"
namespace: "命名空间ID"
cluster: "default"
username: "nacos账号"
password: "nacos密码"
config:
type: nacos
nacos:
serverAddr: localhost:8848
group: "SEATA_GROUP"
namespace: "命名空间ID"
username: "nacos账号"
password: "nacos密码"
然后在需要使用seata的服务中配置参数(比如有订单模块和用户模块)
mall-order-dev.yml
# seata事务分组
seata:
tx-service-group: mall-order-seata-group
mall-user-dev.yml
# seata事务分组
seata:
tx-service-group: mall-user-seata-group
然后修改nacos中的配置
- AT模式还需要创建undo_log表
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-
数据源代理(不支持自动和手动配置并存,不支持XA数据源自动代理)
client端启动类上添加@EnableAutoDataSourceProxy注解
官方详细步骤 -
最后使用
在需要处理分布式事务的类上面添加
@GlobalTransactional(rollbackFor = Exception.class)即可(默认是AT模式)