美文网首页
分布式事务框架Seata---demo搭建指南

分布式事务框架Seata---demo搭建指南

作者: liujianhuiouc | 来源:发表于2019-04-11 16:25 被阅读0次

    分布式事务框架(Seata)介绍

    Seata:Simple Extensible Autonomous Transaction Architecture,简易可扩展的自治式分布式事务管理框架,其前身是fescar。阿里巴巴GTS的开源版实现,是一种分布式事务的解决方案,详情请参看seata官方文档
    seata主要由三个重要组件组成:
    Transaction Coordinator(TC):管理全局的分支事务的状态,用于全局性事务的提交和回滚。
    Transaction Manager(TM):事务管理器,用于开启全局事务、提交或者回滚全局事务,是全局事务的开启者。
    Resource Manager(RM):资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务。

    典型事务流程图

    依赖环境准备

    Demo代码下载

    Demo下载地址:github
    代码下载后结构:

    samples代码结构
    MySQL安装

    请参考MySQL环境安装
    笔者安装的时候的MySQL版本是8.0.15

    库表的创建

    MySQL完成创建后,接下来创建Demo中依赖的库表。


    链接MySQL
    1. 创建fescar库

    create database fescar;
    use fescar;

    1. 创建相关的业务表和undo_log


      表的初始化SQL
    DROP TABLE IF EXISTS `storage_tbl`;
    CREATE TABLE `storage_tbl` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `commodity_code` varchar(255) DEFAULT NULL,
      `count` int(11) DEFAULT 0,
      PRIMARY KEY (`id`),
      UNIQUE KEY (`commodity_code`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    DROP TABLE IF EXISTS `order_tbl`;
    CREATE TABLE `order_tbl` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` varchar(255) DEFAULT NULL,
      `commodity_code` varchar(255) DEFAULT NULL,
      `count` int(11) DEFAULT 0,
      `money` int(11) DEFAULT 0,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    DROP TABLE IF EXISTS `account_tbl`;
    CREATE TABLE `account_tbl` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` varchar(255) DEFAULT NULL,
      `money` int(11) DEFAULT 0,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- 注意此处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,
      `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;
    
    MySQL连接信息的修改
    1. 修改pom.xml中mysql-connector的版本信息,原始的是5.1.37,根据你连接的MySQL的版本修改此处的版本信息。
     <mysql-connector.version>8.0.15</mysql-connector.version>
    
    1. 修改jdbc.properties的连接信息,jdbc.properties文件位于dubbo子项目下的resources文件夹下面


      jdbc.properties

      将用户名密码和库改为我们上面创建的即可,fescar_demo改为fescar。

    jdbc.account.url=jdbc:mysql://localhost:3306/fescar
    jdbc.account.username=root
    jdbc.account.password=12345678
    jdbc.account.driver=com.mysql.jdbc.Driver
    # storage db config
    jdbc.storage.url=jdbc:mysql://localhost:3306/fescar
    jdbc.storage.username=root
    jdbc.storage.password=12345678
    jdbc.storage.driver=com.mysql.jdbc.Driver
    # order db config
    jdbc.order.url=jdbc:mysql://localhost:3306/fescar
    jdbc.order.username=root
    jdbc.order.password=12345678
    jdbc.order.driver=com.mysql.jdbc.Driver
    

    服务的启动

    启动fescar-server
    1. 下载fescar-server相关的安装包,https://github.com/alibaba/fescar/releases
    2. 解压缩后,启动server数据
      sh fescar-server.sh 8091 /home/admin/fescar/data/
      端口设置为8091,如果此处为别的接口,需要修改file.conf中的default.grouplist的配置项,此处默认就可以,不用修改。
    service {
      #vgroup->rgroup
      vgroup_mapping.my_test_tx_group = "default"
      #only support single node
      default.grouplist = "127.0.0.1:8091"
      #degrade current not support
      enableDegrade = false
      #disable
      disable = false
    }
    
    启动分布式服务调用
    1. 启动DubboAccountServiceStarter,在IDE中启动即可,启动中要加入-Djava.net.preferIPv4Stack=true优秀选择ipv4,下面的服务启动也需要添加这个参数
    2. 启动DubboOrderServiceStarter
    3. 启动DubboStorageServiceStarter
    4. 启动DubboBusinessTester

    上面前三步完毕后,可以在数据库中查看到下面的记录。


    account
    storage

    执行完毕后会出现异常。

    log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Exception in thread "main" java.lang.RuntimeException: xxx
        at com.alibaba.fescar.samples.dubbo.service.impl.BusinessServiceImpl.purchase(BusinessServiceImpl.java:48)
        at com.alibaba.fescar.samples.dubbo.service.impl.BusinessServiceImpl$$FastClassBySpringCGLIB$$ec52ad64.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
        at com.alibaba.fescar.spring.annotation.GlobalTransactionalInterceptor$2.execute(GlobalTransactionalInterceptor.java:97)
        at com.alibaba.fescar.tm.api.TransactionalTemplate.execute(TransactionalTemplate.java:64)
        at com.alibaba.fescar.spring.annotation.GlobalTransactionalInterceptor.handleGlobalTransaction(GlobalTransactionalInterceptor.java:94)
        at com.alibaba.fescar.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:66)
    

    不用担心,代表你已经全部成功了,此处只是为了测试回滚主动抛出的异常,你可以去掉BusinessServiceImpl中相关的异常即可。

    至此,Seata的本地Demo环境的全部搭建完毕,接下来我们会进行相关源码的解读。

    喜欢请关注,欢迎大家转载!

    相关文章

      网友评论

          本文标题:分布式事务框架Seata---demo搭建指南

          本文链接:https://www.haomeiwen.com/subject/tqbtwqtx.html