Warning : Trying to access array offset on value of type bool in
/www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/inc/theme_plus.php on line
286
一,Seata Server的搭建
部署高可用的Seata集群服务采用DB+Nacos的方式
一,Seata数据源的配置
Server端存储模式(store.mode)支持三种:
file(默认):单机模式,全局事务会话信息从内存中读写并持久化到本地文件root.data,性能较高(默认)
db(5.7以上版本):高可用模式(集群模式),全局事务会话信息通过db共享,性能较差(开发的通用存储方式)
redis:Seata-Server 1.3及以上版本支持,性能较高,但存在事务信息丢失的风险,需要提前配置redis的RDB,AOF持久化
client:存放client端的SQL脚本,参数配置
config-center:各个配置中心参数导入脚本,config.txt(包含server和client)为通用参数文件
server:server端数据库脚本及各个容器配置
修改数据源的步骤:
导入seata的sql文件到数据库
配置数据源
1,导入seata的sql文件
通过source或者工具导入数据库:
2,修改数据源
在./conf/file.conf文件中修改数据源:
store {
mode = "db"
db {
datasource = "druid"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata_data"
user = "root"
password = "123456789"
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}
二,Seata对Nacos的配置
Seata整合Nacos的作用:
通过Nacos保存Seata集群配置文件,这样就不需要单机分别配置
注册Seata服务到Nacos,事务参与者,客户端等可用通过nacos访问Seata服务集群(负载均衡)
在传统的方式中使用file.conf的方式维护每一个节点,每一个节点都需要用这个文件进行维护,使用Nacos之后可以统一配置
配置的步骤:
修改conf/registry.conf文件,配置注册中心和配置中心
下载config.txt文件(在里面是seata的配置信息)并进行修改
将config.txt配置信息导入到(1,下载导入脚本 2,执行脚本导入)
config.txt主要保存一些静态变量,具体的变量含义官方文档有具体解释
① 修改./conf/registry.conf文件进行配置
registry {#注册中心
#注册中心的类,有file 、nacos 、eureka、redis、zk、consul、etcd3、sofa供选择
type = "nacos"
#注册中心对Seata集群的负载均衡策略,默认是轮询
loadBalance = "RandomLoadBalance"
nacos {
application = "seata-server"
#nacos的服务地址
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = "nacos"
password = "nacos"
}}
config {#配置中心
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
}
}
② 修改config.txt(只需要修改数据源,其他默认即可)
store.mode=db
store.db.url=jdbc:mysql://127.0.0.1:3306/seata_data?useUnicode=true
store.db.user=root
store.db.password=123456789
③ 将config.txt导入Nacos配置中心
1,下载导入脚本
2,执行脚本
执行命令:
./nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 12daxw21-asd1
参数说明:
-h:host 默认值localhost
-p:port 默认8848
-g:配置分组,默认值为"SEATA_GROUP"
-t:租户信息,对应Nacos的命名空间ID字段,默认值为空""
④ 查看nacos是否导入配置信息成功
三,Seata的启动
启动文件:seata/bin/seata-server.sh
启动参数:
参数
全写
作用
备注
-h
--host
指定在注册中心注册的IP
不指定时获取当前的IP,外部访问部署在云环境和容器中的server建议指定
-p
--port
指定server启动的端口
默认为8091
-m
--storeMode
事务日志存储方式
支持file,db,redis默认为file,注redis需要seata-server1.3版本以上
-n
--serverNode
用于指定seata-server的节点ID
默认为1
-e
--seataEnv
指定seata-server运行环境
如:dev,test等服务启动时会使用registry-dev.conf这样的配置
启动:
./seata-server.sh -p 8091
查看seata server是否启动成功:
二,Seata Client的使用
具体的代码在github上:https://github.com/WQL-KXJ/Dome/tree/master/SpringCloud-dome/cloudalibaba-seata-test
一,环境搭建
准备两个库并在库中分别建两个表:
1,seata_order库的tb_order表
2,seata_stock库的tb_stock表
新建两个服务:
order订单服务
stock库存服务
当order创建一个订单时,对库存进行相应的减少
依赖配置省略,具体Github有
核心调用:
① order(创建订单并调用库存服务)
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
orderDao orderDao;
@Autowired
orderfeign orderfeign;
@Override
@Transactional
public boolean setOrder(orderpojo orderpojo) {
boolean b = orderDao.insert_order(orderpojo);
//远程调用库存服务
orderfeign.dw(orderpojo.getProductId());
return b;
}
}
② stock(减少库存方法)
@Service
public class StockServiceImpl implements StockService {
@Autowired
stockDao stockDao;
@Override
@Transactional
public boolean setStock(int productid) {
boolean b = stockDao.update_stock(productid);
return b;
}
}
分布式事务问题:
在上面的order代码中的调用库存之后加一个int a= 10/0的异常, 调用运行之后,订单表没有更改,但库存已经减1了
二,seata客户端的使用
① 加入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
② 在数据库中添加一个回滚表undo_log(这个表字段在seata的在scritp中)
③ 配置事务分组
分组在之前安装服务端的时候那个config.txt文件中有一系列的变量配置,其中就有一个分组service.vgroupMapping.my_test_tx_group=default
客户端分组要和服务端一样,config导入到nacos配置中心后,可以去nacos查看
④ application配置
spring:
application:
name: seata-order
cloud:
nacos:
discovery:
server-addr: 192.168.68.134:8848
alibaba:
seata:
tx-service-group: my_test_tx_group
seata: #配置seata
registry: #注册中心配置
consul:
server-addr: 192.168.68.134:8848 #nacos的服务地址
application: seata-server #seata在nacos中的服务名
username: nacos #nacos的用户名
password: nacos #nacos密码
group: SEATA_GROUP #seata服务所在的分组名称
config: #配置中心
nacos:
server-addr: 192.168.68.134:8848 #nacos的服务地址
username: nacos #nacos的用户名
password: nacos #nacos密码
group: SEATA_GROUP #seata配置所在的分组名称
配置这三步就可以使用@GlobalTransactional注解
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
orderDao orderDao;
@Autowired
orderfeign orderfeign;
@Override
@GlobalTransactional
public boolean setOrder(orderpojo orderpojo) {
boolean b = orderDao.insert_order(orderpojo);
orderfeign.dw(orderpojo.getProductId());
int a= 10/0;//就算订单不成功,调用的库存服务也能回滚,不好导致订单没有创建而库存减少的情况
return b;
}
}
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109