【SpringCloud-Alibaba系列教程】16.动态配置yml以及分布式事务

简介: 动态配置yml、分布式事务以及使用seata。

Nacos Config

我们在普通的项目文件中都是使用本地的yml文件进行本地的配置,在nacos中,也是可以将各个微服务的配置文件放进去,从nacos读取配置文件。

首先我们引入nacos config配置依赖

image.png
然后在项目中新建bootstrap.yml需要注意的是bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载
首先我们可以在nacos端配置相关内容。
image.png
新建后我们把项目代码中的yml复制到nacos中。
image.png
image.png
然后就是项目端,需要我们进行修改,在这里为了不影响后续,我直接把application.yml的全部内容注释,然后新建bootstrap.yml
image.png
启动项目,项目正常运行,这样我们就实现了在nacos中配置。
其实这样不会实现自动刷新,意思是在项目启动了以后,如果我们更新了yaml的话,不会刷新相关配置的,那如何配置呢?其实只需要在controller注解@RefreshScope就可以实现实时读取相关配置了。
如何实现不同微服务的配置共享呢?
我们先介绍单个微服务共享
我们其实就和在项目文件中配置一样,我们把公共配置提取出来,在命名上稍有不同。
新建一个配置。名称不带后面具体配置的就可以了。image.png
那不同微服务的配置共享其实需要在bootstrap.yml中配置以下
image.png
在nacos中新建all-service.yaml
image.png
相见分支参考220321_xgc_nacosConfig

seata实现分布式事务。

在传统的单体项目中,多个不同的业务逻辑使用的都是同一个数据源,使用的都是同一个事务管理器,所以不会存在事务问题。
在分布式或者微服务架构中,每个服务都有自己的数据源,使用不同事务管理器,如果A服务去调用B服务,B服务执行失败了,A服务的事务和B服务的事务都会回滚,这时候是不存在事务问题的,但是如果A服务B服务执行成功之后出现异常,A服务的事务会回滚,但是B服务的事务不会回滚,此时就存在分布式事务问题。
(在单体的项目中,有多个不同的数据源,每个数据源中都有自己独立的事务管理器,互不影响,那么这时候也会存在多数据源事务管理:解决方案jta+ atominc)
首先我们需要在官网下载seata,本文使用的seata版本是1.4.2
将下载好的压缩包,解压到指定目录文件夹下。解压之后的目录文件结构
image.png
修改seata解压目录中的bin目录下的file.conf文件
image.png
修改seata解压目录中的bin目录下的registry.conf文件 (可以参考项目分支resource目录下registry.conf文件)
image.png
在本地新建一个seata数据库,导入如下数据库脚本
CREATE TABLE IF NOT EXISTS global_table
(

`xid`                       VARCHAR(128) NOT NULL,
`transaction_id`            BIGINT,
`status`                    TINYINT      NOT NULL,
`application_id`            VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name`          VARCHAR(128),
`timeout`                   INT,
`begin_time`                BIGINT,
`application_data`          VARCHAR(2000),
`gmt_create`                DATETIME,
`gmt_modified`              DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transaction_id` (`transaction_id`)

) ENGINE = InnoDB
DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS branch_table
(

`branch_id`         BIGINT       NOT NULL,
`xid`               VARCHAR(128) NOT NULL,
`transaction_id`    BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id`       VARCHAR(256),
`branch_type`       VARCHAR(8),
`status`            TINYINT,
`client_id`         VARCHAR(64),
`application_data`  VARCHAR(2000),
`gmt_create`        DATETIME(6),
`gmt_modified`      DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)

) ENGINE = InnoDB
DEFAULT CHARSET = utf8;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS lock_table
(

`row_key`        VARCHAR(128) NOT NULL,
`xid`            VARCHAR(96),
`transaction_id` BIGINT,
`branch_id`      BIGINT       NOT NULL,
`resource_id`    VARCHAR(256),
`table_name`     VARCHAR(32),
`pk`             VARCHAR(36),
`gmt_create`     DATETIME,
`gmt_modified`   DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)

) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
或者去官网拷贝数据库脚本,网址:https://github.com/seata/seata/blob/1.2.0/script/server/db/mysql.sql

去官copyconfig.txt配置和nacos-config.sh配置
config.txt 网址:https://github.com/seata/seata/blob/develop/script/config-center/config.txt
nacos-config.sh网址:https://github.com/seata/seata/blob/develop/script/config-center/nacos/nacos-config.sh
将config.txt配置放在安装seata的目录下,与bin目录同级
image.png
将nacos-config.sh copy下来的文件放在安装seata目录下的conf目录
image.png
修改config.txt中的部分配置
数据库的ip以及用户名密码
image.png
新建不同的事务组
image.png
将seata的配置导入到nacos的配置中心
在conf目录下,使用git将seata的配置导入nacos配置中心,前提是电脑环境上安装了git
image.png
使用如下命令进行导入:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 命名空间id这里我的是(e3868230-8c1f-42b8-b433-286408a175d6) -u nacos -w nacos
QQ截图20220322194828.png
QQ截图20220322194810.png
这样我们就可以在nacos中看到配置了
image.png
启动seata(前提nacos启动) 打开bin目录

image.png
进入cmd命令行
输入 seata-server.bat -p 9000 -m file
image.png
然后我们首先需要在数据库初始化一张seata记录日志需要用到表。

然后我们首先需要在数据库初始化一张seata记录日志需要用到表。
CREATE TABLE undo_log (
id bigint NOT NULL AUTO_INCREMENT,
branch_id bigint NOT NULL,
xid varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
context varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
rollback_info longblob NOT NULL,
log_status int NOT NULL,
log_created datetime NOT NULL,
log_modified datetime NOT NULL,
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX ux_undo_log(xid, branch_id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
然后引入seata pom文件 这需要排除之前的自带的seata

image.png

seata是通过代理数据源实现的。
所以要新建DataSourceProxyConfig
image.png
然后在resource目录下添加
image.png
以及相关的bootstrao.yml
image.png
然后只需要在这里添加一个注解,就可以实现全局事务了。
image.png

我们再扣减库存的时候模拟一个异常打一个断点
image.png
然后我们进行正常下单。
可以看到我们进入断点
image.png
又到了扣减库存这里image.png
我们首先看一下订单是不是增加了。
image.png
以及我们的回滚日志也有了
image.png
我们现在放开断点,抛出异常看看会发生什么?
image.png
发现我们的订单被删除了,回滚的log也没了。
其实这样就实现了我们分布式事务了。
具体还需要大家手动实现才能更加理解。
项目源码参考一下分支220321_xgc_seata
Gitee:https://gitee.com/coderxgc/springcloud-alibaba
GitHub:https://github.com/coderxgc/springcloud-alibaba
部分参考https://www.jianshu.com/p/fda8f616ba22

目录
相关文章
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
22天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
22天前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
22天前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
8天前
|
Java 开发工具 对象存储
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
21 2
|
8天前
|
消息中间件 Java 对象存储
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
19 2
|
2月前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
2月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
2月前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
2月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
55 2
下一篇
无影云桌面