部署指南

Seata新手部署指南

Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。

资源目录介绍

点击查看

  • client

存放client端sql脚本 (包含 undo_log表) ,参数配置

  • config-center

各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件

  • server

server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置

注意事项

  • seata-spring-boot-starter
  1. 内置GlobalTransactionScanner自动初始化功能,若外部实现初始化,请参考SeataAutoConfiguration保证依赖加载顺序
  2. 默认开启数据源自动代理,可配置seata.enable-auto-data-source-proxy: false关闭
  • spring-cloud-starter-alibaba-seata

查看版本说明 2.1.0内嵌seata-all 0.7.1,2.1.1内嵌seata-all 0.9.0,2.2.0内嵌seata-spring-boot-starter 1.0.0, 2.2.1内嵌seata-spring-boot-starter 1.1.0

  1. 2.1.02.1.1兼容starter解决方案:
  2. @SpringBootApplication注解内excludespring-cloud-starter-alibaba-seata内的com.alibaba.cloud.seata.GlobalTransactionAutoConfiguration
  • spring-cloud-starter-alibaba-seata推荐依赖配置方式
  1. <dependency>
  2. <groupId>io.seata</groupId>
  3. <artifactId>seata-spring-boot-starter</artifactId>
  4. <version>最新版</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.cloud</groupId>
  8. <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  9. <version>最新版本</version>
  10. <exclusions>
  11. <exclusion>
  12. <groupId>io.seata</groupId>
  13. <artifactId>seata-spring-boot-starter</artifactId>
  14. </exclusion>
  15. </exclusions>
  16. </dependency>

启动Server

Server端存储模式(store.mode)现有file、db、redis三种(后续将引入raft,mongodb),file模式无需改动,直接启动即可,下面专门讲下db和redis启动步骤。
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

步骤一:启动包

  • 点击下载
  • 官方钉钉群(群号:23171167,1群5000人已满,2群, 3群: 32033786),qq群(群号: 254657148,2群: 216012363)群文件共享下载

步骤二:建表(仅db)

全局事务会话信息由3块内容构成,全局事务—>分支事务—>全局锁,对应表global_table、branch_table、lock_table

步骤三:修改store.mode

启动包: seata—>conf—>application.yml,修改store.mode=”db或者redis”
源码: 根目录—>seata-server—>resources—>application.yml,修改store.mode=”db或者redis”

1.5.0以下版本:

启动包: seata—>conf—>file.conf,修改store.mode=”db或者redis”
源码: 根目录—>seata-server—>resources—>file.conf,修改store.mode=”db或者redis”

步骤四:修改数据库连接|redis属性配置

启动包: seata—>conf—>application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。
源码: 根目录—>seata-server—>resources—>application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。

1.5.0以下版本:

启动包: seata—>conf—>file.conf,修改store.db或store.redis相关属性。
源码: 根目录—>seata-server—>resources—>file.conf,修改store.db或store.redis相关属性。

步骤五:启动

  • 源码启动: 执行ServerApplication.java的main方法
  • 命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db

1.5.0以下版本

  • 源码启动: 执行Server.java的main方法
  • 命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db -n 1 -e test
  1. -h: 注册到注册中心的ip
  2. -p: Server rpc 监听端口
  3. -m: 全局事务会话信息存储模式,filedbredis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
  4. -n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
  5. -e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html

注: 堆内存建议分配2G,堆外内存1G

业务系统集成Client

步骤一:添加seata依赖(建议单选)

  • 依赖seata-all
  • 依赖seata-spring-boot-starter,支持yml、properties配置(.conf可删除),内部已依赖seata-all
  • 依赖spring-cloud-alibaba-seata,内部集成了seata,并实现了xid传递

步骤二:undo_log建表、配置参数(仅AT模式)

步骤三:数据源代理(不支持自动和手动配置并存)

  1. 如果使用seata-all

    • 0.9.0版本开始seata支持自动代理数据源

      1. 1.1.0: seata-all取消属性配置,改由注解@EnableAutoDataSourceProxy开启,并可选择jdk proxy或者cglib proxy
      2. 1.0.0: client.support.spring.datasource.autoproxy=true
      3. 0.9.0: support.spring.datasource.autoproxy=true

      如果采用XA模式,@EnableAutoDataSourceProxy(dataSourceProxyMode = "XA")

    • 手动配置可参考下方的例子

      1. @Primary
      2. @Bean("dataSource")
      3. public DataSource dataSource(DataSource druidDataSource) {
      4. //AT 代理 二选一
      5. return new DataSourceProxy(druidDataSource);
      6. //XA 代理
      7. return new DataSourceProxyXA(druidDataSource)
      8. }
  2. 如果使用seata-starter

    • 使用自动代理数据源时,如果使用XA模式还需要调整配置文件
      application.properties

      1. seata.data-source-proxy-mode=XA

      application.yml

      1. seata:
      2. data-source-proxy-mode: XA
    • 如何关闭seata-spring-boot-starter的数据源自动代理?
      application.properties

      1. seata.enable-auto-data-source-proxy=false

      application.yml

      1. seata:
      2. enable-auto-data-source-proxy: false

步骤四:初始化GlobalTransactionScanner

  • 手动
  1. @Bean
  2. public GlobalTransactionScanner globalTransactionScanner() {
  3. String applicationName = this.applicationContext.getEnvironment().getProperty("spring.application.name");
  4. String txServiceGroup = this.seataProperties.getTxServiceGroup();
  5. if (StringUtils.isEmpty(txServiceGroup)) {
  6. txServiceGroup = applicationName + "-fescar-service-group";
  7. this.seataProperties.setTxServiceGroup(txServiceGroup);
  8. }
  9. return new GlobalTransactionScanner(applicationName, txServiceGroup);
  10. }
  • 自动,引入seata-spring-boot-starter、spring-cloud-starter-alibaba-seata等jar

步骤五:实现xid跨服务传递

  • 手动 参考源码integration文件夹下的各种rpc实现 module
  • 自动 springCloud用户可以引入spring-cloud-starter-alibaba-seata,内部已经实现xid传递

业务使用

注解拦截

全局事务

  1. @GetMapping(value = "testCommit")
  2. @GlobalTransactional
  3. public Object testCommit(@RequestParam(name = "id",defaultValue = "1") Integer id,
  4. @RequestParam(name = "sum", defaultValue = "1") Integer sum) {
  5. Boolean ok = productService.reduceStock(id, sum);
  6. if (ok) {
  7. LocalDateTime now = LocalDateTime.now();
  8. Orders orders = new Orders();
  9. orders.setCreateTime(now);
  10. orders.setProductId(id);
  11. orders.setReplaceTime(now);
  12. orders.setSum(sum);
  13. orderService.save(orders);
  14. return "ok";
  15. } else {
  16. return "fail";
  17. }
  18. }

TCC

  1. /**
  2. * 定义两阶段提交 name = 该tcc的bean名称,全局唯一 commitMethod = commit 为二阶段确认方法 rollbackMethod = rollback 为二阶段取消方法
  3. * useTCCFence=true 为开启防悬挂
  4. * BusinessActionContextParameter注解 传递参数到二阶段中
  5. *
  6. * @param params -入参
  7. * @return String
  8. */
  9. @TwoPhaseBusinessAction(name = "beanName", commitMethod = "commit", rollbackMethod = "rollback", useTCCFence = true)
  10. public void insert(@BusinessActionContextParameter(paramName = "params") Map<String, String> params) {
  11. logger.info("此处可以预留资源,或者利用tcc的特点,与AT混用,二阶段时利用一阶段在此处存放的消息,通过二阶段发出,比如redis,mq等操作");
  12. }
  13. /**
  14. * 确认方法、可以另命名,但要保证与commitMethod一致 context可以传递try方法的参数
  15. *
  16. * @param context 上下文
  17. * @return boolean
  18. */
  19. public void commit(BusinessActionContext context) {
  20. logger.info("预留资源真正处理,或者发出mq消息和redis入库");
  21. }
  22. /**
  23. * 二阶段取消方法
  24. *
  25. * @param context 上下文
  26. * @return boolean
  27. */
  28. public void rollback(BusinessActionContext context) {
  29. logger.info("预留资源释放,或清除一阶段准备让二阶段提交时发出的消息缓存");
  30. }

切点表达式

全局事务

  1. @Bean
  2. public AspectTransactionalInterceptor aspectTransactionalInterceptor () {
  3. return new AspectTransactionalInterceptor();
  4. }
  5. @Bean
  6. public Advisor txAdviceAdvisor(AspectTransactionalInterceptor aspectTransactionalInterceptor ) {
  7. AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
  8. pointcut.setExpression("配置切点表达式使全局事务拦截器生效");
  9. return new DefaultPointcutAdvisor(pointcut, aspectTransactionalInterceptor);
  10. }