在使用微服务中,单体事务注解@Transactional 就不适用了,需要采用分布式事务解决方案,本文介绍分布式事务Seata的安装。Seata一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

seata版本: 1.5.2

前提准备

Seata是一个分布式事务,seata服务端也是一个微服务,需要和其他微服务一样需要注册中心配置中心。同时事务回滚,需要数据库日志记录。

  • 注册中心和配置中心: nacos
  • 数据库: mysql

1.下载

进入Seata官网下载,下载版本是1.5.2,找到seata-server-1.5.1.tar.gz下载。解压文件后进入seata文件。

2.建表

新建数据库seata,然后在seata文件夹里面的script文件,找到server —> db —> mysql.sql,在数据库中执行sql语句:

  1. -- the table to store GlobalSession data
  2. CREATE TABLE IF NOT EXISTS `global_table`
  3. (
  4. `xid` VARCHAR(128) NOT NULL,
  5. `transaction_id` BIGINT,
  6. `status` TINYINT NOT NULL,
  7. `application_id` VARCHAR(32),
  8. `transaction_service_group` VARCHAR(32),
  9. `transaction_name` VARCHAR(128),
  10. `timeout` INT,
  11. `begin_time` BIGINT,
  12. `application_data` VARCHAR(2000),
  13. `gmt_create` DATETIME,
  14. `gmt_modified` DATETIME,
  15. PRIMARY KEY (`xid`),
  16. KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
  17. KEY `idx_transaction_id` (`transaction_id`)
  18. ) ENGINE = InnoDB
  19. DEFAULT CHARSET = utf8mb4;
  20. -- the table to store BranchSession data
  21. CREATE TABLE IF NOT EXISTS `branch_table`
  22. (
  23. `branch_id` BIGINT NOT NULL,
  24. `xid` VARCHAR(128) NOT NULL,
  25. `transaction_id` BIGINT,
  26. `resource_group_id` VARCHAR(32),
  27. `resource_id` VARCHAR(256),
  28. `branch_type` VARCHAR(8),
  29. `status` TINYINT,
  30. `client_id` VARCHAR(64),
  31. `application_data` VARCHAR(2000),
  32. `gmt_create` DATETIME(6),
  33. `gmt_modified` DATETIME(6),
  34. PRIMARY KEY (`branch_id`),
  35. KEY `idx_xid` (`xid`)
  36. ) ENGINE = InnoDB
  37. DEFAULT CHARSET = utf8mb4;
  38. -- the table to store lock data
  39. CREATE TABLE IF NOT EXISTS `lock_table`
  40. (
  41. `row_key` VARCHAR(128) NOT NULL,
  42. `xid` VARCHAR(128),
  43. `transaction_id` BIGINT,
  44. `branch_id` BIGINT NOT NULL,
  45. `resource_id` VARCHAR(256),
  46. `table_name` VARCHAR(32),
  47. `pk` VARCHAR(36),
  48. `status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
  49. `gmt_create` DATETIME,
  50. `gmt_modified` DATETIME,
  51. PRIMARY KEY (`row_key`),
  52. KEY `idx_status` (`status`),
  53. KEY `idx_branch_id` (`branch_id`),
  54. KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
  55. ) ENGINE = InnoDB
  56. DEFAULT CHARSET = utf8mb4;
  57. CREATE TABLE IF NOT EXISTS `distributed_lock`
  58. (
  59. `lock_key` CHAR(20) NOT NULL,
  60. `lock_value` VARCHAR(20) NOT NULL,
  61. `expire` BIGINT,
  62. primary key (`lock_key`)
  63. ) ENGINE = InnoDB
  64. DEFAULT CHARSET = utf8mb4;
  65. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
  66. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
  67. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
  68. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

全局事务会话由:全局事务、分支事务、全局锁,对应表分别为global_tablebranch_tablelock_table

3.配置 nacos

nacos控制台添加新的命名空间:

添加一条seata命名空间ID在后面需要用到:

3.1 上传配置至Nacos配置中心

进到seata目录中,找到nacos-config.sh文件,路径:script -> config-center -> nacos -> nacos-config.sh。执行nacos-config.sh脚本:

  1. sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t xxxx -u username -w password

参数详解:

  • -h nacos服务IP
  • -p nacos服务端口
  • -u nacos登录名
  • -w nacos登录密码
  • -g nacos 配置的分组名称,默认设置SEATA_GROUP
  • -t 上一步配置的命名空间ID

执行脚本之后,输出以下脚本:

  1. Set server.maxCommitRetryTimeout=-1 successfully
  2. Set server.maxRollbackRetryTimeout=-1 successfully
  3. Set server.rollbackRetryTimeoutUnlockEnable=false successfully
  4. Set server.distributedLockExpireTime=10000 successfully
  5. Set server.xaerNotaRetryTimeout=60000 successfully
  6. Set server.session.branchAsyncQueueSize=5000 successfully
  7. Set server.session.enableBranchAsyncRemove=false successfully
  8. Set server.enableParallelRequestHandle=false successfully
  9. Set metrics.enabled=false successfully
  10. Set metrics.registryType=compact successfully
  11. Set metrics.exporterList=prometheus successfully
  12. Set metrics.exporterPrometheusPort=9898 successfully

再去nacos控制台查看配置:

说明配置上传成功。上传不成功,大部分原因是配置没有配置成功,比如命名空间ID没配置正确。

4.修改 appplication.yml

找到appplication.yml文件,路径为:seata -> conf -> application.yml,以下三个小节分别配置storeconfigregistry:

4.1 seata.store

seata.store配置seata的存储,修改store.mode="db":

  1. seata:
  2. store:
  3. # support: file 、 db 、 redis
  4. mode: db

修改数据库连接,将 seata -> conf -> application.example.yml中附带额外配置,将其db相关配置复制至application.yml,修改store.db相关属性。数据库是步骤一配置的数据库:

  1. seata:
  2. store:
  3. # support: file 、 db 、 redis
  4. mode: db
  5. db:
  6. datasource: druid
  7. db-type: mysql
  8. driver-class-name: com.mysql.jdbc.Driver
  9. url: jdbc:mysql://xxxxx:3306/seata?rewriteBatchedStatements=true
  10. user: xxxx
  11. password: xxx
  12. min-conn: 5
  13. max-conn: 100
  14. global-table: global_table
  15. branch-table: branch_table
  16. lock-table: lock_table
  17. distributed-lock-table: distributed_lock
  18. query-limit: 100
  19. max-wait: 5000

4.2 seata.config

seata.config是配置nacos配置中心相关的配置。将seata.config.type修改成nacos

  1. seata:
  2. config:
  3. # support: nacos, consul, apollo, zk, etcd3
  4. type: nacos

然后添加seata.config.nacos相关的配置:

  1. seata:
  2. config:
  3. # support: nacos, consul, apollo, zk, etcd3
  4. type: nacos
  5. nacos:
  6. server-addr: 127.0.0.1:8848
  7. group : "SEATA_GROUP"
  8. namespace: "xxxxx"
  9. username: "xxx"
  10. password: "xxx"

其中namespace是步骤3中的命名空间ID

4.3 seata.registry

seata.registry是配置注册中心相关字段,将seata服务作为一个微服务注册到注册中心。将registry.type改成nacos,配置如下:

  1. seata:
  2. registry:
  3. # support: nacos, eureka, redis, zk, consul, etcd3, sofa
  4. type: nacos
  5. nacos:
  6. application: "seata-server"
  7. serverAddr: 127.0.0.1:8848
  8. group: "SEATA_GROUP"
  9. namespace: "xxxxxx"
  10. username: "xxxx"
  11. password: "xxx"

namespace也是步骤3中的命名空间ID

启动

找到seata文件中的bin目录,执行启动命令:

  1. seata-server.sh -h 127.0.0.1 -p 8091 -m db

控制台输出:

  1. apm-skywalking not enabled
  2. seata-server is starting, you can check the /opt/seata/logs/start.out

打开start.out日志:

系统启动成功,再登录 http://127.0.0.1:7091,就能看到seata控制台信息。

nacos控制台服务列表新增了一个服务,说明seata服务成功注册到了nacos注册中心:

总结

  • seata安装版本是1.5.2,版本不同,安装流程也可能不同,这里的版本需要保持一致
  • 执行sql创建数据表
  • 使用脚本添加配置到nacos配置中心
  • 修改application.yml文件,分别修改storeconfigregistry相关配置。
  • 启动服务,成功登陆seata控制台。
  • 查看nacos控制台,服务列表新增seata服务。

参考

Seata 环境搭建的更多相关文章

  1. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  2. Azure Service Fabric 开发环境搭建

    微服务体系结构是一种将服务器应用程序构建为一组小型服务的方法,每个服务都按自己的进程运行,并通过 HTTP 和 WebSocket 等协议相互通信.每个微服务都在特定的界定上下文(每服务)中实现特定的 ...

  3. rnandroid环境搭建

    react-native 环境搭建具体步骤这个大家已经玩烂了,这个主要是记录下来自己做win7系统遇到的坑 1.com.android.ddmlib.installexception 遇到这个问题,在 ...

  4. python开发环境搭建

    虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...

  5. springMVC初探--环境搭建和第一个HelloWorld简单项目

    注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...

  6. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  7. Nexus(一)环境搭建

    昨天,成功搭建了自己的 Maven 环境(详见:Maven(一)环境搭建),今天就来研究和探讨下 Nexus 的搭建! 使用背景: 安装环境:Windows 10 -64位 JDK版本:1.7 Mav ...

  8. 「译」JUnit 5 系列:环境搭建

    原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发:Linesh 的博客:环境搭建 我的 Gith ...

  9. appium+robotframework环境搭建

    appium+robotframework环境搭建步骤(Windows系统的appium自动化测试,只适用于测试安卓机:ios机需要在mac搭建appium环境后测试) 搭建步骤,共分为3部分: 一. ...

随机推荐

  1. HDU2065 “红色病毒”问题 (指数型母函数经典板题)

    题面 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶, ...

  2. C#基础_变量的命名规则

    变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型    变量名=赋值: 3.常用的数据类型:  int   整数类型  取值范围:最大2147483647;最小-214748364 ...

  3. C#基础_VS常用快捷键

    Shift+End,Shift+Home,跳转到当前代码的行尾和行首. 1.窗口快捷键 记忆诀窍: 凡跟窗口挂上钩的快捷键必有一个W(Windows): Ctrl+W,W:  浏览器窗口 (浏览橱窗用 ...

  4. 【java】学习路径39-Buffered缓冲输出流

    import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; pu ...

  5. django_day07

    django_day07 django form组件 form组件的定义 class RegForm(forms.Form): user = forms.CharField(label='用户名') ...

  6. Sqoop 组件安装与配置

    下载和解压 Sqoop Sqoop相关发行版本可以通过官网 https://mirror-hk.koddos.net/apache/sqoop/ 来获取 安装 Sqoop组件需要与 Hadoop环境适 ...

  7. KingbaseES V8R6集群维护案例之---停用集群node_export进程

    案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...

  8. 如何结合整洁架构和MVP模式提升前端开发体验(三) - 项目工程化配置、规范篇

    工程化配置 还是开发体验的问题,跟开发体验有关的项目配置无非就是使用 eslint.prettier.stylelint 统一代码风格. formatting and lint eslint.pret ...

  9. 大规模数据分析统一引擎Spark最新版本3.3.0入门实战

    @ 目录 概述 定义 Hadoop与Spark的关系与区别 特点与关键特性 组件 集群概述 集群术语 部署 概述 环境准备 Local模式 Standalone部署 Standalone模式 配置历史 ...

  10. Andrej Karpathy | 详解神经网络和反向传播(基于 micrograd)

    只要你懂 Python,大概记得高中学过的求导知识,看完这个视频你还不理解反向传播和神经网络核心要点的话,那我就吃鞋:D Andrej Karpathy,前特斯拉 AI 高级总监.曾设计并担任斯坦福深 ...