分布式事务02-Seata框架-Spring Cloud微服务添加 AT 分布式事务

1. 启动Seata Server - TC全局事务协调器

1.1 下载Seata Server

Seata Server 就是 TC,直接从官方仓库下载启动即可,下载地址:https://github.com/seata/seata/releases

1.2 修改配置文件

1.2.1 /conf/registry.conf

在这里插入图片描述
在这里插入图片描述

1.2.2 /conf/file.conf

在这里插入图片描述
在这里插入图片描述

1.2.3 /bin/seata-server.bat

在这里插入图片描述

双击seata-server.bat,启动Seata Server

查看eureka注册中心信息
在这里插入图片描述

2. order订单服务添加 Seata AT 事务

在这里插入图片描述

2.1 添加 seata 依赖

order-parent 的 pom.xml 文件中有一段注释掉的 seata 依赖,现在可以打开它
在这里插入图片描述

2.2 配置application.yml

spring:
  cloud:
    alibaba:
      seata:
        tx-service-group: order_tx_group

在这里插入图片描述

2.3 配置registry.conf-注册中心的地址

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"

  nacos {
    serverAddr = "localhost"
    namespace = ""
    cluster = "default"
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    # application = "default"
    # weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = "0"
    password = ""
    cluster = "default"
    timeout = "0"
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    session.timeout = 6000
    connect.timeout = 2000
    username = ""
    password = ""
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3、springCloudConfig
  type = "file"

  nacos {
    serverAddr = "localhost"
    namespace = ""
    group = "SEATA_GROUP"
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    app.id = "seata-server"
    apollo.meta = "http://192.168.1.204:8801"
    namespace = "application"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    session.timeout = 6000
    connect.timeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

2.4 配置file.conf - 事务组使用哪个配置中心

transport {
  # tcp udt unix-domain-socket
  type = "TCP"
  #NIO NATIVE
  server = "NIO"
  #enable heartbeat
  heartbeat = true
  # the client batch send request enable
  enableClientBatchSendRequest = true
  #thread factory for netty
  threadFactory {
    bossThreadPrefix = "NettyBoss"
    workerThreadPrefix = "NettyServerNIOWorker"
    serverExecutorThread-prefix = "NettyServerBizHandler"
    shareBossWorker = false
    clientSelectorThreadPrefix = "NettyClientSelector"
    clientSelectorThreadSize = 1
    clientWorkerThreadPrefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    bossThreadSize = 1
    #auto default pin or 8
    workerThreadSize = "default"
  }
  shutdown {
    # when destroy server, wait seconds
    wait = 3
  }
  serialization = "seata"
  compressor = "none"
}
service {
  #transaction service group mapping
  # order_tx_group 与 yml 中的 “tx-service-group: order_tx_group” 配置一致
  # “seata-server” 与 TC 服务器的注册名一致
  # 从eureka获取seata-server的地址,再向seata-server注册自己,设置group
  vgroupMapping.order_tx_group = "seata-server"
  #only support when registry.type=file, please don't set multiple addresses
  order_tx_group.grouplist = "127.0.0.1:8091"
  #degrade, current not support
  enableDegrade = false
  #disable seata
  disableGlobalTransaction = false
}

client {
  rm {
    asyncCommitBufferLimit = 10000
    lock {
      retryInterval = 10
      retryTimes = 30
      retryPolicyBranchRollbackOnConflict = true
    }
    reportRetryCount = 5
    tableMetaCheckEnable = false
    reportSuccessEnable = false
  }
  tm {
    commitRetryCount = 5
    rollbackRetryCount = 5
  }
  undo {
    dataValidation = true
    logSerialization = "jackson"
    logTable = "undo_log"
  }
  log {
    exceptionRate = 100
  }
}

2.5 创建 seata 数据源代理

在这里插入图片描述

2.5.1 编辑配置类

package cn.tedu.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.zaxxer.hikari.HikariDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class DsAutoConfiguration {

    //创建原始数据源对象 druid, hikari
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }
    
    //使用hikari连接池yml中数据库地址需要更改: url改成jdbcUrl
//    return new HikariDataSource;
    

    //创建AT数据源代理对象
    @Primary//首选对象
    @Bean
    public DataSource dataSource(DataSource dataSource){
        return new DataSourceProxy(dataSource);
    }

}

2.5.2 启动类排除默认数据源配置

package cn.tedu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;


@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan("cn.tedu.mapper")
@EnableFeignClients
public class OrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(OrderApplication.class, args);
	}

}

2.6 启动测试

在OrderServiceImpl实现类添加注解,另外我们一步一步地添加全局事务并测试,这里先把 storage 和 account 调用注掉
@GlobalTransactional
@Transactional

package cn.tedu.service;

import cn.tedu.entity.Order;
import cn.tedu.feign.AccountClient;
import cn.tedu.feign.EasyIdClient;
import cn.tedu.feign.StorageClient;
import cn.tedu.mapper.OrderMapper;
import com.netflix.discovery.converters.Auto;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Random;

@Service
public class OrderServiceImpl implements OrderService{

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private AccountClient accountClient;

    @Autowired
    private StorageClient storageClient;

    @Autowired
    private EasyIdClient easyIdClient;

    @Override
    @GlobalTransactional
    @Transactional
    public void create(Order order) {
        // TODO: 从全局唯一id发号器获得id,这里暂时随机产生一个 orderId
//        Long orderId = Long.valueOf(new Random().nextInt(Integer.MAX_VALUE));
//        order.setId(orderId);

        //调用全局唯一id发号器,获取一个唯一的id
        String s = easyIdClient.nextId("order_business");
        Long orderId = Long.valueOf(s);

        orderMapper.create(order);

        // TODO: 调用storage,修改库存
//        storageClient.decrease(order.getProductId(), order.getCount());
        // TODO: 调用account,修改账户余额
//        accountClient.decrease(order.getUserId(), order.getMoney());

    }

}

调用保存订单,地址:
http://localhost:8083/create?userId=2&productId=2&count=20&money=200
在这里插入图片描述

观察控制台,看到全局事务和订单的分支事务已经启动,并可以看到全局事务ID(XID)和分支事务ID(Branch ID):
在这里插入图片描述
在这里插入图片描述
观察数据库中新添加的订单数据:
在这里插入图片描述

2.7 测试出现异常,回滚的情况

实现类模拟异常,重启order
在这里插入图片描述
在这里插入图片描述

3. storage库存服务添加 Seata AT 事务

3.1 复制order配置文件

与order项目中添加的配置完全相同,请参考订单配置章节配置下面三个文件:
application.yml
registry.conf
file.conf

3.2 AT事务的数据源代理

在这里插入图片描述

3.3 添加@Transactional,启动分支事务

在这里插入图片描述

3.4 启动 storage 项目进行测试

把调用商品库存注释去掉了,现把注释打开:
在这里插入图片描述
调用保存订单,地址:
http://localhost:8083/create?userId=1&productId=1&count=10&money=100
订单会调用库存,这两个服务会分别启动一个分支事务,两个分支事务一起组成一个全局事务:
在这里插入图片描述

在这里插入图片描述
查看控制台:
在这里插入图片描述
查看数据库:
在这里插入图片描述

4. account账户服务添加 Seata AT 事务

4.1 重复之前storage服务的配置服务

4.2 启动 account 项目进行测试

调用保存订单,地址:
http://localhost:8083/create?userId=1&productId=1&count=10&money=100
订单会调用库存和账户,这三个服务会分别启动一个分支事务,三个分支事务一起组成一个全局事务:在这里插入图片描述
查看控制台:
在这里插入图片描述

查看数据库:
在这里插入图片描述

5 总结

AT事务的特点:

  • 全自动事务
  • 对业务无侵入
  • 适用于80%业务场景
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
布谷直播系统源码 布谷一对一视频直播源码 布谷直播源码完全开源 品牌:thinkphp 语言:PHP 数据库:Mysql 移动端:Wap+App+(微信)小程序+自适应 完全开源(含全部源文件) 【2019布谷直播系统源码】 布谷直播源码产品特点:系统设计简洁优美,操作流畅,运行稳定不卡顿,直播盒子的时代少不了布谷。 布谷直播源码产品卖点:有独立的代理专用后台源码,省却大笔推广费用。 布谷直播源码产品功能:专属设计的PK,连麦,美颜,直播守护,座驾商城等运营级功能。 【呆萌直播系统源码】 产品特点:系统UI大气上档次,完全可媲美市面上各种大鳄级品牌。 产品卖点:运行非常稳定,是公司直播类源码产品卖的的一款。 产品功能:有三级分销功能,大大省却了公司购买推广流量的费用。 【2019布谷一对一交友系统源码】 布谷交友系统源码产品特点:国内产品中真正的一对一内核代码视频交友源码程序。 布谷交友系统源码产品卖点:界面设计美观,功能完善,性价比非常高! 产品功能:一键约爱,小视频,直播,家族公会合作等各种功能。 源码介绍: 布谷-对一视频直播源码|手机视频直播平台android源码集视频、语育、动态、直播、社交等功能于一身。 布谷科技全面分析市场趋势、强势推出更符合市场需求的一对-视频聊天交友解决方案一布谷- 对一 视频交友系统。 布谷一对一系统 布谷直播系统源码前端功能说明: 登入注册:手机验证码登入、编辑个人信息、上传头像 首页直播:查看主播用户、一键约爰接单、 搜索主播用户、查看关注主摇、、 查看用户资料、查看用户私照和视频、私信语音和视频功能、离线主播预约、丌通主播守护 语音功能详情:关注该用户、赠送礼物、屏蔽对方语音、查看语音消费、评价该主播 视频功能详情:关闭或开房丰播画面、关闭或开启主播声音、设置前置或者后置摄像头、补物赠送、轮盘抽奖、礼物背包功能、美颜功能 小视频功能:小视频拍摄和上传、观看小视频、关注视频作者、小视频送礼打赏、视频点赞、视频转发、与视频作者视频通话 主播动态:上传自己的动态信息(文字、图片、视频)、动态点赞、动态评论、查看用户信息 消息提醒:查看系统消息、查看离线主播预约信息、查看其他用户私信信息、查看私信用户个人资料 个人设置:上传用户头像、修改个人资料、查看关注用户、查看粉丝、实名认证、上传私照、 充值账户钻石、充值会员、收益提现、邀请好友、推广明细、新手引导、查看等级、创建或加入公会、设置消息免打扰、联系客服、查看用户黑名单、切换语言、退出登入、设置直播间按时收费价格 布谷直播系统源码后功能说明: 首页:站内各项数据统计 系统设置:轮播图管理、文件储存、公共配置、设置系统公告、设置通话标准收费、设置注册成、功钻石获得量、设置视频等级限制、上传视频是否认证、设置私照收费标准、脏、字库添加、是否开启女性聊天付费、设置私聊付费价格、视频聊页面警示信息、短视频收费范围设定、视频通话付费范围设定、自动打招呼活术、是否开启自动J招呼功能、每分钟诘首通话扣费金额、首页是合显示离线用户、设置知视频、每日上传次数、短视频时长限制、设置短视频免费时长 用户管理:添加管理员、设置管理员权限、查看本站用广信息、编辑站内用户资料、查看本站、用户上传视频,管理站内用户(拉黑、推荐、账户管理、禁用头像等)、用户推荐 文章管理:文章编辑、文章发布、文章顶置、管理文章分类、设置添加文章标签、设置vIP规则、 设置VIP用户图标 等级管理:设置等级名称、设置等级升级获得的收益值、设置等级升级需要的钻石数 财务管理:设定充值规则、查看充值记录、查看消费收益记录、查看提现记录、设置支付渠道、设置VIP购买规则 礼物管理:添加礼物分类、设置礼物特效、设置礼物图片、设置礼物价格、设置礼物名称、对现有礼物修改或者删除 系统消息:个人消息配置、系统消息配置、系统消息推送记录 审核认证:查看用户上传视频、审核编辑用户上传视频、查看用户私照、审核编辑用户私照、直播间封面图审核、审核用户认证信息 举报管理:设置举报问题分类、查看举报信息、审核举报信息加盟合作:查看加盟合作用户列表 视频通话列表:查看正在视频通话的主播和用户、可操作正在通话的主播和用户邀请管理:查看邀请记录、查看邀请收益记录 评价管理:设置评价标签、修改原有的评价标签、删除标签 渠道代理:查看渠道代理列表、查看渠道代理提现记录、查看渠道代理注册详情 轮盘管理:设置和添加轮盘礼物、设置轮盘抽奖价格、设置礼物中奖概率、查询中奖记录动态管理:查询动态详情、根据用户ID搜索历史动态详情、删除用户动态详情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Solider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值