Hi各位网友好, 我是享学课堂的James,我下周马上要讲seata相关的实战及源码了, 提前把准备内容先公布出来, 有疑问直接联系我, 文章最后有我的V.
Seata如何结合Naocs完成事务操作呢?
1,下载seata
https://github.com/seata/seata/releases
或到James的网盘下载
链接:https://pan.baidu.com/s/1-18nNRULIR-LwPPyRHsIOg
提取码:l6r9
注意: 先需要把nacos启动
2,安装seata
A>windows:需要先安装python,
Python下载链接:
https://pan.baidu.com/s/1R9noMDxKMT_D6O6ooKpIqg 提取码:jbs2
环境变量: path 加上 D:\Program Files\python
cmd进入doc窗口
cd seata-server-0.9.0\seata\conf
python nacos-config.py 127.0.0.1
B>LINUX环境直接执行:
cd seata-server-0.9.0\seata\conf
sh nacos-config.sh 127.0.0.1
3,seata启动
cmd进入doc窗口
cd seata-server-0.9.0\seata\bin
seata-server.bat -p 9000 -m file
Seata启动成功, 进入nacos界面会发现
服务列表多了一个 serverAddr 就是seata服务
表示seata启动成功
4,Seata如何实现事务控制?
OK那如何使用seata实现事务控制呢?
首先初始化数据表, 然后在我们的数据库中新建一张undo_log表,这张表是Seata记录事务分支日志必用的表.
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) 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;
比如
1,在订单服务要下订单, 先向seata申请BranchID, 写入到undo_log表,提交分支事务状态
2,在扣减库存业务时, 向seata申请另一个BranchID, 写入到undo_log表,提交分支事务状态
Seata启动了, 表也建了, 代码也改了, 现在要在微服务里用seata, 需要引入seata的jar包
1,引入jar包
在需要进行分布式控制的微服务中进行下面几项配置:
在父工程pom.xml引入seata的依赖
<!--seata组件-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<!--config组件-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2,proxy代理数据源配置
在涉及到的微服务(order/product)里, 要加上 代理数据源配置类
DataSourceProxyConfig类
Seata是通过代理数据源实现事务分支的,所以需要配置
io.seata.rm.datasource.DataSourceProxy的Bean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务
package com.enjoy.config;
import com.alibaba.druid.pool.DruidDataSource;
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;
@Configuration
public class SeataDataSoureProxy {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean
public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
3,核心配置拷贝
把磁盘seata/conf下的registry.conf拷贝到(order/product两工程)resources下
4,新建yml文件
在order/product工程的resources目录下, 新建bootstrap.yml
配置如下:
spring:
application:
name: service-order
cloud:
nacos:
config:
server-addr: localhost:8848 # nacos的服务端地址
namespace: public
group: SEATA_GROUP
alibaba:
seata:
tx-service-group: ${spring.application.name}
OK,以上是seata要用的所有准备工作及环境
准备工作完成后, 我们还要准备好nacos, 并准备好2个有调用关系的微服务, 进行测试, 各位如果在微服务和naocs上有问题, 可以关注我的直播间, 也可以直接加我V: enjoy_james