保姆级配置 Seata1.2 + Nacos
本篇文章单讲配置,关于分布式事务的文章看我另外一篇。
单机方式就是通过conf文件配置即可,但是Seata配合Nacos,我遇到了个坑,写一下希望有人不会和我一样。
Seata 配置进Nacos
- 下载seata-1.2.0 源码
- 进入\seata-1.2.0\script\config-center目录,配置config.txt
- 登录Nacos,创建一个新的NameSpace
我们需要一个单独的namespace,否则注册进去后你会眼瞎的,还好我nacos使用本地文件存储做了个测试,不然注册进数据库你真得哭。
- 进入\seata-1.2.0\script\config-center\nacos目录,找到nacos-config.py
- 需要编辑一下,因为我们要使用指定的NameSpace,也可以用gitbash运行sh,我这里用的py
- 运行 python nacos-config.py localhost:8848 ec3763fc-a942-4985-9aa9-fe7b71c64dd8
最后那串就是NameSpace的ID
现在知道为什么我说要建单独的NameSpace了吧。一共七页。。。。
注意坑来了
因为我将\seata-server-1.2.0\seata\lib\jdbc的库换成了mysql8的,所以我的URL是这样:jdbc:mysql://127.0.0.1:3306/seata?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
但是脚本进行post请求时会拼接成这样:
content=store.db.url=jdbc:mysql://127.0.0.1:3306/seata?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
因为&没有进行转义,所以导致配置中心认为从&useSSL开始都是参数
所以配置中心明显给我注册错了,它给我注册成了jdbc:mysql://127.0.0.1:3306/seata?characterEncoding=utf8
&后面的都不见了,导致我mysql8无法连接,所以需要去配置中心手动改一下。
vgroupMapping配置
在config.txt中我已经配置过了,所以py脚本注册进Nacos时就有这些
service.vgroupMapping.app1-seata-service-group=default
service.vgroupMapping.app2-seata-service-group=default
service.default.grouplist=127.0.0.1:8091
注意:使用Nacos+Seata,需要将service.default.grouplist这条配置删除,否则会找不到bean,说找不到default服务,具体原因我下面会写
服务端配置(这里不是源码,是编译过的)
- registry.conf
注意application的服务名,并且我只在config中使用了单独的NameSpace
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "my-seata-server"
serverAddr = "localhost"
namespace = ""
cluster = "default"
username = ""
password = ""
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "localhost"
namespace = "ec3763fc-a942-4985-9aa9-fe7b71c64dd8"
group = "SEATA_GROUP"
username = ""
password = ""
}
}
一切就绪 开始使用
这是我之前给2个app创建好的vgroupMapping,注意新版本不是vgroup_mapping
service.vgroupMapping.app1-seata-service-group=default
service.vgroupMapping.app2-seata-service-group=default
pom.xml
只是dependencyManagement
<dependencyManagement>
<dependencies>
<!--这里需要规定一下 不然默认还是1.1-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
yaml
只写seata的
spring:
application:
# app2改一下名就行,如果想指定groupMapping 需要设置tx-service-group
# 默认${spring.application.name}-seata-service-group
name: app1
seata:
registry:
type: nacos
nacos:
server-addr: localhost:8848
application: my-seata-server # 服务名对应服务端配置
config:
type: nacos
nacos:
# config的NameSpace记得填。
namespace: ec3763fc-a942-4985-9aa9-fe7b71c64dd8
group: SEATA_GROUP
server-addr: localhost:8848
enabled: true
enable-auto-data-source-proxy: true
现在@GlobalTransaction 就可以使用了,是不是很简单
关于找不到default服务
我先是专门看了一下配置中心是不是有问题
Configuration config = ConfigurationFactory.getInstance();
String config = config.getConfig("service.vgroupMapping.app1-seata-service-group");
System.out.println(config);
发现没有任何问题,然后断点跟踪发现整个调用链获取也没问题,都是对的,但是当获取服务的时候就会返回个null。最后发现如果使用Nacos,他会根据注册进Nacos的Seata服务名找到服务创建Bean,不需要写service.default.grouplist=127.0.0.1:8091,service.vgroupMapping.app1-seata-service-group对应的实际上是Nacos中的cluster。
因为是半个月前看的,现在也忘了,他获取的服务最后是@my-seata-server@@default,好像是这样的。
也就是说配置中心不能有service.default.grouplist的配置。