Spring Cloud Alibaba学习笔记

一、Spring Cloud Alibaba相关介绍:

1、简介:

(1)、SpringCloud Netflix项目进入了维护模式。意味着SpringCloud Netflix 将不再开发新的组件。维护中的组件将通过平行组件所替代

(2)、Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。使用Spring Cloud Alibaba,只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

组件

技术

服务注册中心

× Eureka(已停更)

√ Zookeeper

√ Consul

√ Nacos(推荐)

 

服务调用

√ Ribbon

√ LoadBalancer

 

服务调用2

× Feign(已停更)

√ OpenFeign

 

服务降级

× Hystrix(已停更)

√ resilience4j

√ sentienl

 

服务网关

× Zuul(已停更)

! Zuul2

√ gateway

 

服务配置

× Config(已停更)

√ Nacos

 

服务总线

× Bus(已停更)

√ Nacos

 

2、特点:

(1)、Flow control and service degradation(流量控制和服务降级):默认支持Servlet、RestTemplate、Dubbo和RocketMQ限流降级功能的介入,可以在运行时通过控制台修改限流降级规则,还支持查看限流降级的Metrics监控。

(2)、Service registeration and discovery(服务注册与发现):适配SpringCloud服务注册与发现标准,默认集成了 Ribbon 的支持。

(3)、Distributed configuration(分布式配置管理):支持分布式系统中的外部化配置,配置更改时自动刷新。

(4)、RPC Service(RPC 服务):远程调用服务。

(5)、Event-driven(消息驱动):基于SpringCloud Stream为微服务应用构建消息驱动能力。

(6)、Alibaba Cloud Object Storage(阿里云对象存储):阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

(7)、Alibaba Cloud SchedulerX(阿里云调度器):提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如:网格任务,网格任务支持海量子任务均匀分布到所有的 Woker(schedulerx-client)上执行。

(8)、Alibaba Cloud SMS(阿里云短信):提供阿里云短信服务支持。

 

二、Nacos服务注册与配置中心:

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。即是注册中心与配置中心的组合。

1、Nacos单机模式:

(1)、下载地址:

Nacos服务器是独立安装部署的,因此需要下载相应的Nacos服务端程序:下载地址

(2)、解压启动:

IDEA-Terminal控制台启动与关闭:

#打开nacos的bin目录
cd \nacos\bin\
# nacos独立模式启动
.\startup.cmd -m standalone
#nacos关闭
.\shutdown.cmd:

(3)、访问注册中心:

地址:http://localhost:8848/nacos/index.html默认的用户名和管理员密码都是nacos

(4)、可采用配置方式启动:

-m standalone

注:

在单节点的情况下,Nacos将数据存放在自带的一个嵌入式数据库中

2、Nacos服务注册与发现:

父工程POM对SpringCloudAlibaba依赖进行统一管理:

            <!-- 引入SpringCloud依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 引入SpringCloudAlibaba依赖,2021.0.1.0版本支持SpringBoot2.6.X -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

相关微服务注册到nacos注册中心,添加依赖:

        <!--nacos服务发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

YML配置:

服务发现:

注:

OpenFeign实现服务远程调用与负载均衡需导入相关依赖:

3、Nacos临时与非临时实例:

(1)、概述:

Nacos是一个服务发现和配置管理平台,它支持两种类型的实例:临时实例和非临时实例。

  • 1)、临时实例:

临时实例是指在Nacos注册的服务实例,它们的生命周期与服务提供者的生命周期相同。采用心跳机制向Nacos发送请求保持在线状态,一旦心跳停止,即服务提供者关闭或崩溃时,临时实例将自动注销。临时实例适用于短期任务或临时服务。

  • 2)、非临时实例:

非临时实例是指在Nacos注册的服务实例,它们的生命周期不受服务提供者的影响,由Nacos主动进行联系,如果连接失败,那么不会移除实例信息,而是将健康状态设定为false,相当于会对某个实例状态持续地进行监控。非临时实例适用于长期任务或持久服务。

(2)、非临时实例配置:

配置声明:

4、Nacos服务配置中心:

SpringCloud Config可以通过配置服务来加载远程配置,实现在远端对配置文件的集中管理,利用bootstrap.yml中的配置获取远程配置文件,再进入到配置文件加载环节,而Nacos同样支持这样的操作。

(1)、发布配置信息文件:

命名规则:服务名称-环境.yaml

(2)、客户端获取配置信息:

添加相关依赖:

        <!-- nacos注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos注册中心/服务注册功能  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

bootstrap.yml实现配置文件远程获取:

注:bootstrap.yml在application.yml之前加载,且可同时存在,最后无论是远端配置还是本地配置都会被加载

(3)、配置信息热更新:

Nacos支持配置文件的热更新,即在配置文件中添加一个属性,而此时可能需要实时修改,并在后端实时更新,可通过Spring Cloud原生注解@RefreshScope实现配置自动更新。

5、Nacos的多环境配置方案:

(1)、Data Id方案:

默认的namespace命名空间和默认的group分组的条件下,通过修改 spring.profiles.active属性就能进行多环境下配置文件的获取。即通过修改 spring.profiles.active 属性就能获取不同环境(dev、test、prod等)的配置信息。

(2)、Group分组方案:

在默认namespace命名空间和相同的 Data Id 的情况下,通过修改分组(不同分组),能够获取相同Data Id 的配置文件信息。

(3)、Namespace 命名空间方案:

通过Namespace、Group与Data Id 确定完整的配置获取路径

  • 1)、新建Namespace命名空间:

  • 2)、在不同的命名空间下,实例和配置都是相互之间隔离的,可以在配置文件中指定当前的命名空间:

6、Nacos 高可用集群与持久化配置:

(1)、Nacos 集群架构:

在所有的Nacos服务端之前建立一个负载均衡(Nginx),通过访问负载均衡服务器来间接访问到各个Nacos服务器

(2)、Nacos的数据存储模式(持久化配置):

在单节点的情况下,Nacos实际上是将数据存放在自带的一个嵌入式数据库中,而这种模式只适用于单节点。

在多节点集群模式下采用此模式,数据存储是存在一致性问题的。为了解决这个问题,Nacos 采用集中式存储的方式来支持集群化部署,目前只支持MySQL的存储

(3)、Nacos 高可用集群:

  • 1)、Linux服务器准备:

JDK安装、Nginx安装、MySQL安装

相关操作,利用Nginx实现负载均衡

 

Nacos高可用配置流程:
1、修改Nacos基础配置:../nacos/conf/application.properties
2、修改Nacos的集群配置:../nacos/conf/cluster.conf
3、修改Nginx的负载均衡配置:/etc/nginx/nginx.conf

7、Nacos的CAP原则:

Nacos 支持AP和CP模式的切换:

Nacos 集群默认采用AP模式,当集群内均是非临时实例时采用CP模式

注:

分布式系统中无法同时保证一致性和可用性的,要同时保证可用性和一致性,代表着某个节点数据更新之后,需要立即将结果通知给其他节点,并且要尽可能的快,这样才能及时响应保证可用性,这就对网络的稳定性要求非常高,但是实际情况下,网络很容易出现丢包等情况,并不是一个可靠的传输,如果需要避免这种问题,就只能将节点全部放在一起,但是这显然违背了分布式系统的概念,因此,对于分布式系统而言,分区容错性是一个最基本的要求,我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍

(1)、一致性(C):分布式系统中所有数据备份同一时刻值都相同。

(2)、可用性(A):负载过大后,集群整体中非故障节点还能响应客户端的读写请求。

(3)、分区容错性(P):服务间相互调用问题,分布式系统节点之间组成的网络本来应该是连通的,当遇到某节点或网络分区故障(比如网络丢包等)的时候,仍然能够对外提供满足一致性或可用性的服务。由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。

 

三、Sentinel服务降级熔断与限流:

Sentinel:分布式系统的流量防卫兵。随着微服务的流行,服务与服务之间的稳定性变得越来越重要,Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,解决服务雪崩、降级、熔断与限流等问题

1、Sentinel服务安装与部署:

(1)、下载地址:

Sentinel服务器是独立安装部署的,因此需要下载相应的Sentinel服务端程序:相关地址

(2)、解压启动Sentinel控制台:

(3)、访问Sentinel管理界面:

地址:http://localhost:8858/#/dashboard,默认的用户名和管理员密码都是sentinel

(4)、初始化服务监控:

相关微服务连接到Sentinel控制台进行监控,添加依赖:

 

        <!--sentinel监控-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

YML配置:

初始化监控:

注:

只有当被监控的服务发起请求调用后才会被Sentinel监控到,Sentinel是懒加载机制

2、Sentinel限流与异常处理:

由于机器不可能无限制的接受和处理客户端的请求,如果不加以限制,当发生高并发情况时,系统资源将很快被耗尽。为了避免这种情况,可以添加流量控制(也可以说是限流),当一段时间内的流量到达一定的阈值的时候,新的请求将不再进行处理,这样不仅可以合理地应对高并发请求,同时也能在一定程度上保护服务器不受到外界的恶意攻击。

(1)、流控规则——限流

备注

说明

单机阈值

请求的次数

QPS限流

当每秒钟的请求数量达到设定的阈值的时候,则进行限流操作

并发线程数限流

当排队的线程数达到设定的阈值的时候,则进行限流操作

一、流控模式:

1)、直接(默认)模式:

只针对于当前接口

阈值类型

结论

QPS

表示1秒钟向API接口发送请求超出设定次数2,就直接-快速失败,报默认错误【报错:Blocked by Sentinel (flow limiting)】,反之,正常执行

并发线程数

表示1秒内访问该 API 接口的线程数,当排队的线程数达到设定的阈值的时候,则进行限流操作,通常出现在接口访问响应慢的时候。如果操作很快,也不会出现限流。

 

2)、关联模式:

与当前接口关联的其他接口超过设定阈值时,会导致当前接口被限流。

备注:适用于下单接口(当前的A)、支付接口(关联的B)。密集请求B ,然后访问A,结果啊A出现了流控报错

3)、链路模式:

更细粒度的限流,能精确到具体的方法,使用@SentinelResource注解标注某方法,那么该方法就会被监控,当从指定接口链路过来的资源请求达到限流条件时,则开启限流。

注:限流是在方法执行之前进行的

  • 添加方法监控:

@SentinelResource: 监控指定方法,无论被谁执行都在监控范围内,该注解可以加在任何方法上,包括Controller中的请求映射方法,value是自定义名称。

  • 配置关闭Context收敛,实现不同链路的单独控制:

  • 添加链路限流规则:

 

  • 限流返回错误信息:

 

二、流控效果

1)、快速失败:

直接失败,抛出异常(默认)

 

2)、Warm up(预热):

请求从(指定阈值除以codeFactor(默认值为3))开始,经预热时长逐渐升至指定阈值,形成一个缓冲保护。

备注:阈值设置为10 ,预热时长设置为5秒。系统初始化的阈值为10/3,经过5秒后阈值慢慢升高至10。适用于秒杀系统在开启的瞬间,会有很多流量上来,可能导致系统崩溃,预热的方式就是为了保护系统,可以慢慢的把请求的流量放进来,慢慢的把初始化阈值 QPS/3增长到指定设置的阈值。

3)、排队等待:

匀速排队,让请求一均匀的速度通过,阈值类型必须设置为 QPS,否则无效。

备注:接口每秒5次请求,超过的话就排队等待,等待超时时间为200毫秒,超过200毫秒 没有响应就报错

(2)、热点规则——热点参数限流:

由于不同参数被携带访问的频率是不一样的,所以需要设置对应的热点规则,当访问指定资源名的时,携带有指定参数索引(指资源方法的第几个参数,从0开始计数),并且在指定时间窗内QPS达到阈值时进行精准限流。目前热点key规则仅支持QPS限流模式。

备注:不仅实现对请求携带的热点参数的限流,还实现对热点参数携带特定值的特例限流

(3)、自定义返回限流的异常信息:

Sentinel限流异常默认:

自定义限流异常信息:

  • 1)、默认限流异常信息自定义:

  • 2)、链路模式限流异常信息自定义:

3、Sentinel服务降级与熔断:

(1)、Sentinel服务熔断策略:

熔断策略有三种模式

1)、慢调用比例(SLOW_REQUEST_RATIO):

选择以慢调用比例作为阈值,需要设置允许的慢调用最大RT(即最大的响应时间),当请求的响应时间大于最大RT(即最大的响应时间)则统计为慢调用,并且统计时长内请求数大于设置的最小请求数,慢调用的比例(慢调用次数 / 调用次数)大于设定的比例阈值,则会触发熔断策略,在接下来的熔断时长内请求会自动被熔断。经过熔断时长之后,熔断器会进入探测恢复状态(HALF-OPEN 半开状态),若接下来的一个请求响应时间小于设置的慢调用RT则结束熔断,若大于设置的慢调用RT则会再次被熔断。

属性

说明

最大RT(毫秒)

最大响应时间,指系统对请求作出最大响应的时间

比例阈值

慢调用次数 / 调用次数,阈值范围是 [0.0, 1.0]

2)、异常比例 (ERROR_RATIO):

统计时长内请求数大于设置的最小请求数,并且异常的比例大于设定的比例阈值,则会触发熔断策略,在接下来的熔断时长内请求会自动被熔断。经过熔断时长之后,熔断器会进入探测恢复状态(HALF-OPEN 半开状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

属性

说明

比例阈值

异常调用次数 / 调用次数,阈值范围是 [0.0, 1.0]

3)、异常数 (ERROR_COUNT):

只要统计时长内的异常数超过设定的异常数就会自动进行熔断。经过熔断时长之后,熔断器会进入探测恢复状态(HALF-OPEN 半开状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

(2)、Sentinel服务降级策略:

1)、采用声明自定义异常信息方式实现降级:

参考自定义返回限流的异常信息设置,在@SentinelResource中配置blockHandler参数,进行方法级别细粒度的限制,blockHandler的目的就是处理这种Sentinel机制上的异常,所以这里其实和之前的限流配置是一个道理,因此下面熔断配置也应该对value自定义名称的资源进行配置,才能作用到此方法上

2)、采用OpenFeign集成Sentinel方式实现降级:

OpenFeign对远程调用声明的接口进行实现(即接口实现类的方法,为降级策略执行方案)

开启feign支持:

对应服务接口类:

4、Sentinel系统规则:

系统规则(限流总控)是从应用级别的入口流量进行控制,从单台机器的LOAD、CPU使用率、平均RT、入口QPS和并发线程数等几个维度监控应用指标,让系统尽可能泡在最大吞吐量的同时保证系统整体稳定性。系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如Web服务或Dubbo服务端接收的请求,都属于入口流量。

系统规则模式

说明

Load自适应(仅对Linux/Unix-like机器生效)

系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量才会触发系统保护(BBR 阶段)。系统容量有系统的 maxQps * minRt估算得出。设定参考值一般是 CPU cores (CPU核数) * 2.5。

CPU usage(1.5.0+ 版本)

当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。

平均RT

当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。

并发线程数

当单台机器上所有入口流量的并发线程数达到阈值基础法系统保护。

入口QPS

当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

5、Sentinel规则持久化:

当项目重启后,Sentinel规则就消失了,因此生产环境需要将配置的规则进行持久化。控制台将配置的规则推送到远程的配置中心(Nacos),Sentinel客户端通过监听Nacos,获取配置变更的推送消息,完成本地配置更新。

(1)、添加相关依赖:

        <!--Sentinel 规则持久化配置-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

(2)、配置Sentinel数据源与规则信息:

在application.properties或application.yml配置文件中,配置相关信息。

(3)、持久化信息:

(4)、参考:

相关参考

 

四、Seata分布式事务框架:

官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html

1、分布式事务问题:

在传统的单体服务应用中,事务的控制非常简单,Spring框架提供@Transactional注解就能进行相应的事务控制,但是由于每个服务(单体)内部的数据一致性是由本地事务来保证的,对于全局的数据一致性却没办法保证,总而言之,一次业务操作需要跨多个数据源或需要跨多个服务进行远程调用,就会产生分布式事务问题。

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

2、Seata分布式事务处理机制:

属性

说明

XID(TranSaction ID)

全局唯一的事务 ID

RM(Resource Manager)

资源管理器。管理分支(单体)事务处理的资源,与 TC(事务协调器)交互,注册分支事务和状态汇报。接受 TC 的指令,并驱动分支(单体)事务的提交与回滚

TM(Transaction Manager)

事务管理器。定义全局事务的范围:开始全局事务、提交或回滚全局事务。即全局事务发起者(分布式事务的核心管理者)

TC(Transaction Coordinator)

事务协调器。即Seata服务器,用于全局控制,维护全局事务的运行状态,负责协调并驱动全局事务的提交和回滚。

处理流程:

(1)、TM向TC申请开启一个全局事务,TC会生成一个全局唯一的XID作为该全局事务的编号;(XID会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起)

(3)、RM请求TC将本地事务注册为全局事务的分支事务,通过全局事务的XID进行关联;

(4)、TM请求TC告诉XID对应的全局事务是进行提交还是回滚;

(5)、TC驱动RM将XID对应的自己的本地事务进行提交还是回滚;

3、Seata四种事务模式:

官网文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html

事务模式

说明

AT模式

最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式

XA模式

强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入

TCC模式

最终一致的分阶段事务模式,有业务侵入

SAGA模式

长事务模式,有业务侵入

(1)、AT模式:

 

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷,本质上就是2PC的升级版,在 AT 模式下,用户只需关心自己的“业务SQL”

  • 1)、阶段一RM的工作:

注册分支事务

记录undo-log(数据快照,在业务数据被更新前,将其保存为 before image,在业务数据更新之后,其保存成 after image,最后生成行锁)

执行业务sql并提交

报告事务状态

  • 2)、阶段二提交时RM的工作:

删除undo-log即可(将一阶段保存的快照数据与行锁删掉,完成数据清理)

  • 3)、阶段二回滚时RM的工作:

根据undo-log恢复数据到更新前(使用before image 还原业务数据;但在还原前要校验脏写,对比数据库当前数据和after image,如果两份数据完全一致就说明没有脏写,可以还原业务数据;如果不一致就说明有脏写,出现脏写就需要转人工处理)

(2)、AT模式的优缺点:

优点:

  • 1)、一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 2)、利用全局锁实现读写隔离
  • 3)、没有代码侵入,框架自动完成回滚和提交

缺点:

  • 1)、两阶段之间属于软状态,属于最终一致
  • 2)、框架的快照功能会影响性能,但比XA模式要好很多

(3)、基于NACOS模式部署:

1)、seata-server下载地址:https://github.com/seata/seata/releases/tag/v1.4.2

 

2)、将Source code源文件目录下的script整个文件夹(官方提供的上传脚本)拷贝放到seata-server的解压目录下,便于后续操作。

3)、修改conf目录下的file.conf 配置文件:

自定义事务组名称+事务日志存储模式为db+数据库连接信息,实现seata server 高可用

4)、创建数据库:seata_server

 

插入相应表:

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
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_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- 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 = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('HandleAllSession', ' ', 0);
View Code

5)、修改conf目录下的registry.conf配置文件:

NACOS配置:

registry.conf配置:

6):修改/script/config-center/config.txt配置信息:

 

7)、配置参数同步到NACOS:

执行相应脚本:源码包路径\script\config-center\nacos

 

#Window下执行:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 130a27c2-e58b-41ab-bf88-adfe719f0552 -u nacos -w nacos

8)、Seata启动:

Windows环境下:

直接双击解压目录下的bin目录下的 seata-server.bat即可完成 seata 服务的启动。

Linux 环境下:

sh ${SEATAPATH}/bin/seata-server.sh -h localhost -p 8091 -m db -n 1 -e dev

9)、Seata实现分布式事务:

添加相关依赖:

        <!--Seate的客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

配置声明:

在相应服务连接的数据库下创建undo-log表(数据快照,分支提交回滚):

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;

开启分布式事务:

在方法上添加@GlobalTransactional注解开启分布式事务:

 

通过在栈追踪信息中查看seata相关的包,那么说明分布式事务已经开始工作了

 

 

posted on 2024-05-30 02:06  爱文(Iven)  阅读(111)  评论(0编辑  收藏  举报

导航