关于分布式事务 seata集成(springboot+dubbo+zokeeper+seata)
参考博客:https://blog.csdn.net/u010046908/article/details/102661739/
一、下载seata1.3.0服务端 并安装启动 (注意 0.9.0版跟1.X差别很大)
https://github.com/seata/seata/releases/tag/v1.3.0
目录为
.
├──bin
├──conf
└──lib
2.2.2 修改 conf/registry.conf 和file.conf配置,
目前seata支持如下的file、nacos 、apollo、zk、consul的注册中心和配置中心。这里我们以zk 为例。
将 type 改为 zk,1.3.0版本需将集群修改名称,不能用default,可修改成seata-server,注意zk节点中服务名也要修改成相同的名称
registry {
# file zk
type = "zk"
zk {
cluster = "seata-server"
serverAddr = "127.0.0.1:2181"
session.timeout = 6000
connect.timeout = 2000
}
file {
name = "file.conf"
}
}
config {
# file、nacos 、apollo、zk、consul
type = "zk"
zk {
serverAddr = "127.0.0.1:2181"
session.timeout = 6000
connect.timeout = 2000
}
file {
name = "file.conf"
}
}
file.conf 配置:
主要修改了store.mode为db,还有数据库相关的配置
zk-config.properties(该配置在1.3.0版本中无配置,需自己创建,并导入到zokeeper中)
这里主要修改了如下几项:
store.mode :存储模式 默认file 这里我修改为db 模式 ,并且需要三个表global_table、branch_table和lock_table
store.db.datasource=dbcp :数据源 dbcp
store.db.db-type=mysql : 存储数据库的类型为mysql
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true : 修改为自己的数据库url、port、数据库名称
store.db.user=root :数据库的账号
store.db.password=123456 :数据库的密码
#0.9.0版用(vgroup_mapping),1.3.0版本用(vgroupMapping),order-service-seata-service-group这个是每个服务配置里面配置的seata.tx-service-group事务群组名称(为了更好区分,可独立)
service.vgroupMapping.order-service-seata-service-group=seata-server(该名称需与registry.conf中zk配置的cluster相同)
2.2.3:配置好文件后 确保zookeeper服务启动后执行
seata-server 启动
linux启动 :
当前启动:sh seata-server.sh -p 8091 -h 192.168.0.218
后台运行启动:nohup ./seata-server.sh -p 8091 -h 192.168.0.218 >../logs/log.out 2>1 &
无权限:chmod u+x *.sh
linux 关闭:
查看进程: ps -ef|grep seata
杀死进程:kill -9 pid
windows启动:
seata-server.bat -m db
windows关闭
按Ctrl+C
查看进程:
netstat -ano|findstr 8087
杀死进程:
taskkill /pid 11072 /f
若启动未成功,报zookeeper连接失败,若确认zookeeper启动成功,则查看zookeeper服务器主机名,
在seata服务器所在的系统hosts文件中加入zookeeper所在服务器的ip地址
,因zookeeper是用ip地址进行通讯的。
--查看zookeeper是否启动成功
ps -ef |grep zookeeper
进入zokeeper命令
windows:
zkCli.cmd -server 192.168.0.218:2181
查看节点 ls /
ls /seata --可查看配置
linux:
无权限:chmod u+x *.sh
sh zkCli.sh -server 192.168.0.206:2182
启动:./zkServer.sh start
关闭:./zkServer.sh stop
查看进程:./zkServer.sh status
linux查看主机名
[root@zijuan /]# hostname
2.2.4 需要在每个业务服务端的数据库中加入undo_log表,用于记录事务日志。
2.2.5 seata客户端集成到项目中:
1.在pom.xml文件中引入seata1.3.0
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
2.在每个项目服务中的application.properties里配置seata部分配置
#是否开启seata服务
seata.enabled=true
#事务名称id
seata.application-id=seata-server-id
# 事务群组(可以每个应用独立取名,也可以使用相同的名字)
seata.tx-service-group=seata-server-group
seata.registry.file.name=file.conf
seata.registry.type=zk
seata.registry.zk.server-addr=192.168.0.218:2181
seata.config.file.name=file.conf
seata.config.type=zk
seata.config.zk.server-addr=192.168.0.218:2181
3.项目需集成druid服务,seata使用druid代理数据源,写入配置数据
4.项目启动成功后,在业务发起方也就是消费者端的方法上面加入全局事务配置,name名称最好与业务方法名一致
@GlobalTransactional(timeoutMills = 300000, name = "testSeata")
System.out.println("开始全局事务,XID = " + RootContext.getXID());XID不为空说明seata事务开启成功了
2.2.6
关于集成seata1.3.0后遇到的问题。
1.seata服务器连接不上zookeeper.
解决:在seata服务器所在的系统hosts文件中加入zookeeper所在服务器的ip地址,如 192.168.0.11 localhost
2.客户端启动,XID为空。(可能原因 1.数据代理不成功 2.seata导入zk注册中心配置失败。3.seata服务器启动失败。)
解决:原因是由于seata导入zk注册中心配置乱码,需要序例化。在ZkDataInit中改变连接方式
ZkSerializer zkSerializer=new DefaultZkSerializer();
zkClient = new ZkClient("192.168.0.200:2181", 6000, 6000,zkSerializer);
3.多个环境切换会导致全局事务错误。
解决:每个环境需配置不同的seata服务,可连接同一个zookeeper服务,
但cluster名称一定不能相同,因neety是由事务组名称去找seata服务的RM,在TM中使用。(seata服务端可与客户端完全分离。)
4.集成springboot多模块项目,每个模块服务可依赖,可单独运行,打包出现问题。
原因:因业务层依赖了多个服务层,但每个服务可单独运行,打包成jar可执行文件,此时无法依赖业务层,业务层会报找不到服务类的包。
解决:在服务层的项目pom文件中打包插件配置如下
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--因该项目被其他项目依赖,加此配置可生成 exec可执行包-->
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
5.编写linux中.sh文件
问题一: 坏的解释器: 没有那个文件或目录
sed -i 's/\r$//' LPGInfoManageService.sh
问题二: 权限不够
chmod u+x *.sh
问题三:坏的编辑器,权限不够
#!/bin/sh 需换成 #!/bin/bash
6.自动化部署jenkins项目,jar服务包杀死进程报错
原因:pidlist=`ps -ef|grep $Project_name|grep -v "grep"|awk '{print $2}'`
function stop(){
if [ "$pidlist" == "" ]
then
echo "----$Project_name 已经关闭----"
else
echo "$Project_name 进程号 :$pidlist"
kill -9 $pidlist
echo "KILL $pidlist:"
fi
}
该写法打印出来的进程号不止一个,无法kill成功。(可能是jenkins衍生的进程,在shell中无法找到其他两个进程)
解决:换了写法,
BUILD_ID=DONTKILLME #防止自杀
ps -ef | grep $Project_name | grep -v grep | awk '{print $2}' | xargs kill -9
7.seata启动后,第一次运行容易出现连接超时,或者服务失败。(未解决)