秒杀项目之网关服务限流熔断降级分布式事务

news2024/11/26 0:43:23

目录

  • 一、网关服务限流熔断降级
  • 二、Seata--分布式事务
    • 2.1 分布式事务基础
      • 2.1.1 事务
      • 2.1.2 本地事务
      • 2.1.3 分布式事务
      • 2.1.4 分布式事务场景
    • 2.2 分布式事务解决方案
      • 2.2.1 全局事务
        • 可靠消息服务
      • 2.2.2 最大努力通知
      • 2.2.3 TCC事事务
  • 三、Seata介绍
  • 四、 Seata实现分布式事务控制
    • 4.1 案例基本代码(异常模拟)

一、网关服务限流熔断降级

  1. 启动sentinel-dashboard控制台和Nacos注册中心服务

启动sentinel-dashboard控制台
首先放sentinel文件夹文件路径出输入cmd,里面输入

java -jar sentinel-dashboard-1.8.4.jar
  1. 在网关服务中引入sentinel依赖
<!-- sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 在网关服务application.yml中配置sentinel
spring:
  application:
    name: zmall-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        port: 9998 #跟控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: localhost:8080 # 指定控制台服务的地址
      eager: true #当服务启动时是否与sentinel建立连接
      web-context-unify: false # 关闭URL PATH聚合
  1. 通过域名直接访问商品服务,并登陆到sentinel控制台配置服务流控等信息
    在这里插入图片描述
    打开浏览器输入地址:http://zmall.com/index.html

进入sentinel控制台,选中簇点链路。在搜索框中输入搜索关键字index
在这里插入图片描述

这个时候会发现流控操作只能针对具体服务资源链路,而不能针对具体整个服务本身进行流控操作。所以,阿里特此推出了网关限流方式来解决以上问题。

  1. 重新在网关服务模块pom.xml中加入依赖
<!-- sentinel gateway -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
  1. 重新刷新商品服务,再进入sentinel控制台查看链路情况
    在这里插入图片描述
    这是直接针对该微服务进行网关限流等操作。直接点击流控,设置QPS=1、流控模式=直接(默认)、流控效果=快速失败(默认)等,最后快速刷新商品服务地址即可查看流控效果。同时,也可以配置流控的流控效果为排队等待方式,当流量多大时以排队等待方式慢慢去消化请求,从而可以起到一个流量削锋的目的。

  2. 举例
    加入有人恶意攻击网站,那么我们加入流控
    在这里插入图片描述
    在这里插入图片描述

当有人恶意刷新网站时,网站就会自动断开

在这里插入图片描述

二、Seata–分布式事务

2.1 分布式事务基础

2.1.1 事务

事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作
都成功,要么所有的操作都被撤销。简单地说,事务提供一种“要么什么都不做,要么做全套”机制。

2.1.2 本地事务

本地事物其实可以认为是数据库提供的事务机制。说到数据库事务就不得不说,数据库事务中的四
大特性:

  • A:原子性(Atomicity),一个事务中的所有操作,要么全部完成,要么全部不完成
  • C:一致性(Consistency),在一个事务执行之前和执行之后数据库都必须处于一致性状态
  • I:隔离性(Isolation),在并发环境中,当不同的事务同时操作相同的数据时,事务之间互不影响
  • D:持久性(Durability),指的是只要事务成功结束,它对数据库所做的更新就必须永久的保存下来

数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个不可分割的执行单元,该执行单
元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚

2.1.3 分布式事务

分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布
式系统的不同节点之上。
简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同
的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

2.1.4 分布式事务场景

  • 单体系统访问多个数据库
    一个服务需要调用多个数据库实例完成数据的增删改操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUhyIGnM-1676028166309)(springcloud_alibaba\1014.png)]

  • 多个微服务访问同一个数据库
    多个服务需要调用一个数据库实例完成数据的增删改操作

请添加图片描述

  • 多个微服务访问多个数据库
    多个服务需要调用一个数据库实例完成数据的增删改操作

请添加图片描述

2.2 分布式事务解决方案

2.2.1 全局事务

全局事务基于DTP模型实现。DTP是由X/Open组织提出的一种分布式事务模型——X/Open
Distributed Transaction Processing Reference Model。它规定了要实现分布式事务,需要三种角色:

  • AP: Application 应用系统 (微服务)
  • TM: Transaction Manager 事务管理器 (全局事务管理)
  • RM: Resource Manager 资源管理器 (数据库)

整个事务分成两个阶段:

  • 阶段一: 表决阶段,所有参与者都将本事务执行预提交,并将能否成功的信息反馈发给协调者。
  • 阶段二: 执行阶段,协调者根据所有参与者的反馈,通知所有参与者,步调一致地执行提交或者回
    滚。

在这里插入图片描述

优点

  • 提高了数据一致性的概率,实现成本较低

缺点

  • 单点问题: 事务协调者宕机

  • 同步阻塞: 延迟了提交时间,加长了资源阻塞时间

  • 数据不一致: 提交第二阶段,依然存在commit结果未知的情况,有可能导致数据不一致

    可靠消息服务

    基于可靠消息服务的方案是通过消息中间件保证上、下游应用数据操作的一致性。假设有A和B两个
    系统,分别可以处理任务A和任务B。此时存在一个业务流程,需要将任务A和任务B在同一个事务中处
    理。就可以使用消息中间件来实现这种分布式事务。
    在这里插入图片描述

    第一步: 消息由系统A投递到中间件

  1. 在系统A处理任务A前,首先向消息中间件发送一条消息
  2. 消息中间件收到后将该条消息持久化,但并不投递。持久化成功后,向A回复一个确认应答
  3. 系统A收到确认应答后,则可以开始处理任务A
  4. 任务A处理完成后,向消息中间件发送Commit或者Rollback请求。该请求发送完成后,对系统A而
    言,该事务的处理过程就结束了
  5. 如果消息中间件收到Commit,则向B系统投递消息;如果收到Rollback,则直接丢弃消息。但是
    如果消息中间件收不到Commit和Rollback指令,那么就要依靠"超时询问机制"。

超时询问机制
系统A除了实现正常的业务流程外,还需提供一个事务询问的接口,供消息中间件调
用。当消息中间件收到发布消息便开始计时,如果到了超时没收到确认指令,就会主动调用
系统A提供的事务询问接口询问该系统目前的状态。该接口会返回三种结果,中间件根据三
种结果做出不同反应:
提交:将该消息投递给系统B
回滚:直接将条消息丢弃

处理中:继续等待

第二步: 消息由中间件投递到系统B
消息中间件向下游系统投递完消息后便进入阻塞等待状态,下游系统便立即进行任务的处理,任务
处理完成后便向消息中间件返回应答。

  • 如果消息中间件收到确认应答后便认为该事务处理完毕
  • 如果消息中间件在等待确认应答超时之后就会重新投递,直到下游消费者返回消费成功响应为止。

一般消息中间件可以设置消息重试的次数和时间间隔,如果最终还是不能成功投递,则需要手工干
预。这里之所以使用人工干预,而不是使用让A系统回滚,主要是考虑到整个系统设计的复杂度问
题。
基于可靠消息服务的分布式事务,前半部分使用异步,注重性能;后半部分使用同步,注重开发成本。

2.2.2 最大努力通知

最大努力通知也被称为定期校对,其实是对第二种解决方案的进一步优化。它引入了本地消息表来
记录错误消息,然后加入失败消息的定期校对功能,来进一步保证消息会被下游系统消费。
在这里插入图片描述

第一步: 消息由系统A投递到中间件

  1. 处理业务的同一事务中,向本地消息表中写入一条记录
  2. 准备专门的消息发送者不断地发送本地消息表中的消息到消息中间件,如果发送失败则重试

第二步: 消息由中间件投递到系统B

  1. 消息中间件收到消息后负责将该消息同步投递给相应的下游系统,并触发下游系统的任务执行
  2. 当下游系统处理成功后,向消息中间件反馈确认应答,消息中间件便可以将该条消息删除,从而该
    事务完成
  3. 对于投递失败的消息,利用重试机制进行重试,对于重试失败的,写入错误消息表
  4. 消息中间件需要提供失败消息的查询接口,下游系统会定期查询失败消息,并将其消费

这种方式的优缺点:

  • 优点: 一种非常经典的实现,实现了最终一致性。
  • 缺点: 消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。

2.2.3 TCC事事务

TCC即为Try Confirm Cancel,它属于补偿型分布式事务。TCC实现分布式事务一共有三个步骤:

  • Try:尝试待执行的业务
    这个过程并未执行业务,只是完成所有业务的一致性检查,并预留好执行所需的全部资源
  • Confirm:确认执行业务
    确认执行业务操作,不做任何业务检查, 只使用Try阶段预留的业务资源。通常情况下,采用TCC
    则认为 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。若Confirm阶段真的
    出错了,需引入重试机制或人工处理。
  • Cancel:取消待执行的业务
    取消Try阶段预留的业务资源。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若
    Cancel阶段真的出错了,需引入重试机制或人工处理。

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

TCC两阶段提交与XA两阶段提交的区别是:
XA是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。
TCC是业务层面的分布式事务,最终一致性,不会一直持有资源的锁。
TCC事务的优缺点:

  • 优点:把数据库层的二阶段提交上提到了应用层来实现,规避了数据库层的2PC性能低下问题。

  • 缺点:TCC的Try、Confirm和Cancel操作功能需业务提供,开发成本高。

三、Seata介绍

2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And
Rollback),其愿景是让分布式事务的使用像本地事务的使用一样,简单和高效,并逐步解决开发者们
遇到的分布式事务方面的所有难题。后来更名为 Seata,意为:Simple Extensible Autonomous
Transaction Architecture,是一套分布式事务解决方案。
Seata的设计目标是对业务无侵入,因此从业务无侵入的2PC方案着手,在传统2PC的基础上演进。
它把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分
支事务达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本身就是一个关系数据
库的本地事务。

2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。

在这里插入图片描述

Seata主要由三个重要组件组成:

  • TC:Transaction Coordinator 事务协调器,管理全局的分支事务的状态,用于全局性事务的提交
    和回滚。
  • TM:Transaction Manager 事务管理器,用于开启、提交或者回滚全局事务。
  • RM:Resource Manager 资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分
    支事务的状态,接受TC的命令来提交或者回滚分支事务。

在这里插入图片描述

用例说明:

用户购买商品的业务逻辑:

  • Storage服务:对给定的商品扣除仓储数量。

  • Order服务:根据采购需求创建订单。

  • Account服务:从用户帐户中扣除余额。

  • Business服务:创建订单的同时需完成对商品库存扣减及用户账号余额扣除操作。

Seata的执行流程如下:

  1. Business业务服务TM申请向TC开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID

  2. Storage服务的RM向TC注册分支事务,并及其纳入XID对应全局事务的管辖

  3. Storage服务执行分支事务,向数据库做操作,对给定的商品扣除仓储数量

  4. Order服务的RM向TC注册分支事务,并及其纳入XID对应全局事务的管辖

  5. Order服务执行分支事务,向数据做操作,创建订单

  6. Order服务开始远程调用Account服务,此时XID会在微服务的调用链上传播

  7. Account服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖

  8. Account服务执行分支事务,向数据库做操作,从用户账户中扣除余额

  9. 全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚

  10. TC协调其管辖之下的所有分支事务, 决定是否回滚

Seata实现2PC与传统2PC的差别:

  1. 架构层次方面,传统2PC方案的 RM 实际上是在数据库层,RM本质上就是数据库自身,通过XA协
    议实现,而 Seata的RM是以jar包的形式作为中间件层部署在应用程序这一侧的。
  2. 两阶段提交方面,传统2PC无论第二阶段的决议是commit还是rollback,事务性资源的锁都要保
    持到Phase2完成才释放。而Seata的做法是在Phase1 就将本地事务提交,这样就可以省去Phase2
    持锁的时间,整体提高效率。

四、 Seata实现分布式事务控制

本示例通过Seata中间件实现分布式事务,模拟电商中的下单和扣库存的过程
我们通过订单微服务执行下单操作,然后由订单微服务调用商品微服务扣除库存

在这里插入图片描述

4.1 案例基本代码(异常模拟)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】Binder的理解

1.Binder是什么&#xff1f; 对于android而言&#xff0c;是跨进程传输的通道&#xff0c;是封装好的java类&#xff0c;可以直接继承和使用。 从组成、模型来讲&#xff0c;我认为是连接Server层、Client层、ServerManager层的纽带&#xff0c;也是驱动。 2.Binder的基础概…

RMI攻击Registry的两种方式

概述 RMI(Remote Method Invocation) &#xff1a;远程方法调用 它使客户机上运行的程序可以通过网络实现调用远程服务器上的对象&#xff0c;要实现RMI&#xff0c;客户端和服务端需要共享同一个接口。 基础 Client 和 Regisry 基于 Stub 和 Skeleton 进行通信&#xff0c…

ContextCapture Master 倾斜摄影测量实景三维建模

ContextCapture实景建模大师是一套无需人工干预&#xff0c;通过影像自动生成高分辨率的三维模型的软件解决方案。它集合了全球最先进数字影像处理、计算机虚拟现实以及计算机几何图形算法&#xff0c;在易用性、数据兼容性、运算性能、友好的人机交互及自由的硬件配置兼容性等…

花1分钟配置远程DEBUG,开发效率翻倍,妹子直呼绝绝子

当把一个工程部署到远程服务器后有可能出现意想不到错误&#xff0c;日志打印过多或者过少都影响问题排查的效率&#xff0c;这个时候可以通过远程调试的方式快速定位bug&#xff0c;提升工作效率。本文主要讲解如何使用Idea开发工具进行远程调试&#xff0c;希望对你有帮助。 …

微信小程序授权登录流程

自我介绍我是IT果果日记&#xff0c;微信公众号请搜索 IT果果日记一个普通的技术宅&#xff0c;定期分享技术文章&#xff0c;欢迎点赞、关注和转发&#xff0c;请多关照。首先&#xff0c;我们要了解什么是微信小程序登录&#xff1f;它的作用是什么&#xff1f;用户登录微信小…

使用Fetch时,post数据时,后端接收的Content-Type为text/plain

在使用 Fetch做一个前端的post请求时&#xff0c;直接从网上抄了一段代码 export async function postData(url, data){const response await fetch(url, {method: POST, // *GET, POST, PUT, DELETE, etc.mode: no-cors, // no-cors, *cors, same-originheaders: { Content-…

xshell 工具连接不上本地的 Centos 7虚拟机,4种情况,逐个分析

导读 小编之前使用过 VMware workstation 工具搭建 Centos 7 版本的虚拟机集群&#xff0c;各项功能都正常&#xff0c;用完了也就清除了&#xff08;节约本地空间&#xff09;。因为最近学习大数据&#xff0c;需要从新安装虚拟机&#xff0c;结果发现并不如第一次那么顺利。所…

TDengine时序数据库的简单使用

最近学习了TDengine数据库&#xff0c;因为我们公司有硬件设备&#xff0c;设备按照每分钟&#xff0c;每十分钟&#xff0c;每小时上传数据&#xff0c;存入数据库。而这些数据会经过sql查询&#xff0c;统计返回展示到前端。但时间积累后现在数据达到了百万级数据&#xff0c…

Qt使用workflow

Qt工程设置 QMAKE_CFLAGS_DEBUG -MTd QMAKE_CXXFLAGS_DEBUG -MTd上述内容必须设置&#xff0c;否则会报错&#xff1a;error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug。 libworkflow.pri的文件内容如下&#xff1a; …

算法第十五期——动态规划(DP)之各种背包问题

目录 0、背包问题分类 1、 0/1背包简化版 【代码】 2、0/ 1背包的方案数 【思路】 【做法】 【代码】 空间优化1&#xff1a;交替滚动 空间优化2&#xff1a;自我滚动 3、完全背包 【思路】 【代码】 4、分组背包 核心代码 5、多重背包 多重背包解题思路1:转化…

MySQL8 创建用户,设置修改密码,授权

MySQL8 创建用户,设置修改密码,授权 MySQL5.7可以 (创建用户,设置密码,授权) 一步到位 &#x1f447; GRANT ALL PRIVILEGES ON *.* TO 用户名% IDENTIFIED BY 密码 WITH GRANT OPTION&#x1f446;这样的语句在MySQL8.0中行不通, 必须 创设和授权 分步执行&#x1f447; CR…

如何动态生成列字段?请看向这里哟

&#x1f343; 场景前言 &#x1f420;一般而言&#xff0c;某个简单查询接口涉及到得表结构不超过三个。如果不是单表操作的话&#xff0c;多个表中间用到联合查询的SQL也可以解决相关问题。但是&#xff0c;事与愿违的是我们的业务是跟着场景走的&#xff0c;并不是所有的业务…

python+django宠物销售商城网站vue

宠物销售商城,在宠物销售商城可以查看首页、商品信息、商品资讯、个人中心、后台管理、购物车、在线客服等内容 用户登录、用户注册,通过注册获取用户名、密码、姓名、联系电话等信息进行注册、登录 商品信息,在商品信息页面可以查看商品名称、商品分类、图片、品牌、规格、价…

java易错题锦集二

源码 补码 int i 5; int j 10; System.out.println(i ~j);有个公式&#xff0c;-n~n1 另一种解题思路 ~代表对n按位取反 10的源码是: 00000000 00000000 00000000 1010 所以对10按位取反就是 11111111 11111111 11111111 0101 由于计算机中-1表示为 11111111 11111111 111…

[docker]笔记-镜像 管理

1、镜像管理 docker search xxxx ①查找镜像,例如查找httpd [rootlocalhost ~]# docker search httpd ②下载镜像 docker pull xxxx [rootlocalhost ~]# docker pull httpd ③列出本地镜像 docker images [rootlocalhost ~]# docker images ④删除镜像 docker rmi xxx…

Linux(十)线程安全 上

目录 一、概念 二、互斥锁实现互斥 三、条件变量实现同步 银行家算法 生产者与消费者模型 一、概念 概念&#xff1a;在多线程程序中&#xff0c;如果涉及到了对共享资源的操作&#xff0c;则有可能会导致数据二义性&#xff0c;而线程安全就指的是&#xff0c;就算对共享…

【MFC】菜单与状态栏(15)

菜单 一般菜单的使用步骤&#xff1a; 1.编辑菜单资源&#xff0c;设置菜单属性&#xff08;包括菜单名和ID&#xff09;&#xff1b; 2.用ClassWizard自动映射菜单消息和成员函数&#xff1b; 3.手工编辑成员函数&#xff0c;加入菜单消息处理代码。 单文档窗口可以设置默…

2年时间,涨薪20k,想拿高薪还真不能老老实实的工作...

2016年开始了我的测试生活。 2016年刚到公司的时候&#xff0c;我做的是测试工程师。做测试工程师是我对自己的职业规划。说实话&#xff0c;我能得到这份工作真的很高兴。 来公司的第一个星期&#xff0c;因为有一个项目缺人&#xff0c;所以部门经理提前结束了我的考核期&a…

C语言预处理

文章目录 目录 文章目录 前言 一、程序编译的过程 二、编译阶段 1.预处理(*.i&#xff09; 2.编译(*.s) 3.汇编(*.o) 4.链接 总结 前言 提示&#xff1a;使用vs code(gcc编译器)与vs2022来演示c语言的预处理 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

KEIL编译报错,解决方法汇总

目录 背景 最近在跟着野火码uCosiii的代码时&#xff0c;感觉非常完美&#xff0c;结果一编译&#xff0c;报了120个莫名其妙的问题&#xff0c;下面是踩过的坑&#xff0c;一起记录下&#xff0c;免得下次又掉进去了~ 1. 编译汇编文件&#xff0c;报错 error: unexpected t…