springboot+dubbo+zookeeper+seata1.3.0分布式集成遇到的问题总结

关于分布式事务 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启动后,第一次运行容易出现连接超时,或者服务失败。(未解决)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值