SpringCloud-服务保护和分布式事务

news2024/11/25 16:37:35

一、雪崩问题

(1)雪崩问题

1.雪崩问题产生的原因是什么?

①微服务相互调用,服务提供者出现故障或阻塞。

②服务调用者没有做好异常处理,导致自身故障。

③调用链中的所有服务级联失败,导致整个集群故障。

2.解决问题的思路有哪些?

①尽量避免服务出现故障或阻塞。

保证代码的健壮性; 保证网络畅通; 能应对较高的并发请求;

②服务调用者做好远程调用异常的后备方案,避免故障扩散

(2)解决方案

解决雪崩问题的常见方案有哪些?

①请求限流:限制流量在服务可以处理的范围,避免因突发流量而故障。

②线程隔离:控制业务可用的线程数量,将故障隔离在一定的范围。

③服务熔断:将异常比例过高的接口断开,拒绝所有请求,直接走fallback。

④失败处理:定义fallback逻辑,让业务失败时不在抛出异常,而是返回默认数据或友好提示。

二、Sentinel

(1)初始Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件。

微服务整合Sentinel

①引入依赖

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

②配置控制台

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true # 开启请求方式前缀

簇点链路:就是单机调用链路,是一次请求进入服务后经过的每一个被Sentinel监控的资源链。

默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径,Restful风格的API请求路径一般都相同,这会导致簇点资源名称重复。因此我们要修改配置,把请求方式+请求路径作为簇点资源名称。

(2)请求限流

在簇点链路后面点击流控按钮,即可对其做限流配置。我们利用Jemeter做限流测试,可以看出GET:/carts这个接口的通过QPS稳定在6附近,而拒绝的QPS在4附近,符合我们的预期。

(3)线程隔离

在sentinel控制台中,会出现Feign接口的簇点资源,点击后面的流控按钮,即可配置线程隔离,注意,这里勾选的是并发线程数限制,也就是说这个查询功能最多使用5个线程,而不是5QPS。如果查询商品的接口每秒处理2个请求,则5个线程的实际QPS在10左右,而超出的请求自然会被拒绝。

将FeignClient作为Sentinel的簇点资源:

feign:
  okhttp:
    enabled: true
  sentinel:
    enabled: true

FeignClient的Fallback有两种配置方式:

方式一:FallbackClass,无法对远程调用的异常做处理

方式二:FallbackFactory,可以对远程调用的异常做处理,通常都会选择这种

①自定义类,实现FallbackFactory,编写对某个FeignClient的fallback逻辑

@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {

    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("查询商品失败!",cause);
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
            log.error("扣减商品库存异常",cause);
            throw new RuntimeException(cause);
            }
        };
    }
}

②将刚刚定义的ItemClientFallbackFactory注册为一个Bean

    @Bean
    public ItemClientFallbackFactory itemClientFallbackFactory(){
        return new ItemClientFallbackFactory();
    }

③在ItemClient接口中使用ItemClientFallbackFactory

@FeignClient(value = "item-service",fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {

(4)服务熔断

 熔断是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

点击控制台中簇点资源后的熔断按钮,即可配置熔断策略。

三、分布式事务

(1)介绍

在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。

(2)初始Seata

分布式事务解决思路:

利用事务协调者,解决分布式事务,各个子事务之间必须能感知到彼此的事务状态,才能保证状态一致。

(3)部署TC服务

准备数据库表,准备配置文件,需要注意,要确保nacos、mysql都在hm-net网络中。如果某个容器不再hm-net网络,可以参考下面的命令将某容器加入指定网络:

docker network connect [网络名] [容器名]Docker部署:
docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=1.12.232.19 \
-v ./seata:/seata-server/resources \
--privileged=true \
--network hm-net \
-d \
seataio/seata-server:1.5.2

(4)微服务集成Seata

①引入依赖

<!--统一配置管理-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
  <!--读取bootstrap文件-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
  <!--seata-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  </dependency>

②改造配置

首先在nacos上添加一个共享的seata配置,命名为shared-seata.yaml,

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 192.168.150.101:8848 # nacos地址
      namespace: "" # namespace,默认为空
      group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
      application: seata-server # seata服务名称
      username: nacos
      password: nacos
  tx-service-group: hmall # 事务组名称
  service:
    vgroup-mapping: # 事务组与tc集群的映射关系
      hmall: "default"

然后,改造trade-service模块,添加bootstrap.yaml

spring:
  application:
    name: trade-service # 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 192.168.150.101 # nacos地址
      config:
        file-extension: yaml # 文件后缀名
        shared-configs: # 共享配置
          - dataId: shared-jdbc.yaml # 共享mybatis配置
          - dataId: shared-log.yaml # 共享日志配置
          - dataId: shared-swagger.yaml # 共享日志配置
          - dataId: shared-seata.yaml # 共享seata配置

可以看到这里加载了共享的seata配置。

然后改造application.yaml文件,内容如下

server:
  port: 8085
feign:
  okhttp:
    enabled: true # 开启OKHttp连接池支持
  sentinel:
    enabled: true # 开启Feign对Sentinel的整合
hm:
  swagger:
    title: 交易服务接口文档
    package: com.hmall.trade.controller
  db:
    database: hm-trade

(5)XA模式

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的关系型数据库都对 XA 规范 提供了支持。Seata的XA模式如下:

一阶段的工作:

①RM注册分支事务到TC

②RM执行分支业务sql但不提交

③RM报告执行状态到TC

二阶段的工作:

①TC检测各分支事务执行状态

如果都成功,通知所有RM提交事务

如果有失败,通知所有RM回滚事务

②RM接收TC指令,提交或回滚事务

XA模式的优点是什么?

①事务的强一致性,满足ACID原则。

②常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

①因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差

②依赖关系型数据库实现事务

实现XA模式的步骤:

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

①修改application.yaml文件(每个参与事务的微服务)(可在nacos的全局配置中修改),开启XA模式

seata:
  data-source-proxy-mode: XA # 开启数据源代理的XA模式

②给发起全局事务的入口方法添加@GobalTransaction注解

@Override
@GlobalTransactional
public Long createOrder(OrderFormDTO order) {
    // 创建订单 ... 略
    // 清理购物车 ...略 
    // 扣减库存 ...略
    return order.getId();
}

(6)AT模式

Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

阶段一RM的工作:

①注册分支事务

②记录undo-log(数据快照)

③执行业务sql并提交

④报告事务状态

阶段二提交时RM的工作:

    删除undo-log即可

阶段二回滚时RM的工作:

    根据undo-log恢复数据到更新前

简述AT模式与XA模式最大的区别是什么?

①XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。

②XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。

③XA模式强一致;AT模式最终一致

实现AT模式:

①首先,添加资料中的seata-at.sql(表)到微服务对应的数据库中

CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

②修改application.yml文件,将事务模式修改为AT模式(默认为AT模式):

seata:
  data-source-proxy-mode: AT # 开启数据源代理的AT模式

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

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

相关文章

57_2设置Servlet模板、Servlet线程安全问题、跳转

设置Servlet模板 再创建类就有了 模板代码 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j…

java开发环境搭建基础番外篇之----Maven在windows的安装及配置

一.背景 公司安排了带徒弟任务&#xff0c;写点基础的环境搭建这些吧。搭建基础开发环境&#xff0c;主要是jdk、eclipse、git、maven、mysql。后续再考虑编写jenkins、nexus、docker、1panel等CI/CD环境搭建。 本次主要内容是maven在window是系统中的安装及配置。我的开发环境…

电梯节能(能量回馈)样板间,现场勘察效果

一、现场勘察&#xff1a;电表倒转回馈 二、真实数据 三、真实现场勘察情况&#xff1a; 【电梯机房背景】 2023-07-26日&#xff0c;电梯机房勘察&#xff08;该机房控制2部电梯&#xff0c;分为【内外】间&#xff0c;各有1台电梯控制柜控制1台电梯&#xff09;。 【发热电…

美股收涨英伟达大涨,美联储降息预期升温

昨夜美股三大股指集体收涨&#xff0c;受“小非农”数据与鲍威尔为9月开启降息背书的利好影响&#xff0c;英伟达大涨近13%&#xff0c;引领科技股强势反弹。 一、大盘动态 截至收盘&#xff0c;道指涨0.24%&#xff0c;纳指涨2.64%&#xff0c;标普涨1.58%。美国十年国债收益…

记一次mybatisplus和postgresql自增主键冲突的问题解决

问题出现前提&#xff1a; 1. postgresql设置字段自增 2. springboot项目集成mybatisplus向表中新增数据 现象&#xff1a;db中字段没有自增且无规律。 springboot项目中实体类如下&#xff1a; 其中id为本次要自增的字段。 整个设置字段自增的过程&#xff1a; 首先&…

el-table-column 遍历 如何将 year 作为表头 processstatus为值

使用 Vue 的计算属性来动态生成列&#xff0c;并使用 v-for 在 <el-table> 的 <el-table-column> 上来遍历这些列。此外&#xff0c;我们还需要一个方法来处理每行数据的显示&#xff0c;因为每行的数据&#xff08;sonList&#xff09;需要根据年份来显示对应的 p…

uniapp使用uView的单选框自定义图片标题和副标题

效果图&#xff1a; 我这边是在一个弹框里面&#xff0c;需要一个单选框 实现代码&#xff1a; html代码&#xff1a; <u-popup :round"15" mode"center" :closeOnClickOverlay"false" bgColor"transparent"><view class&…

水泥电阻在电源电路中的作用

水泥电阻是将电阻线绕在无碱性耐热瓷件上&#xff0c;外面加上耐热、耐湿及耐腐蚀之材料保护固定并把绕线电阻体放入方形瓷器框内&#xff0c;用特殊不燃性耐热水泥充填密封而成。水泥电阻的外侧主要是陶瓷材质&#xff08;一般可分为高铝瓷和长石瓷&#xff09;。 水泥电阻器…

navicat 17 安装

百度网盘 链接: https://pan.baidu.com/s/1nFFQzWhjxRUM_X6bVlWNGw?pwd8888 提取码: 8888 1.双击运行安装包 2.点击下一步 2.勾选我同意&#xff0c;点击下一步 3.自定义安装路径&#xff0c;点击下一步 4.注意勾选桌面快捷方式&#xff0c;点击下一步 5.点击安装 6.点击完…

游戏类型有哪些?游戏分类详细解说(二)

在游戏行业中&#xff0c;对游戏进行分类可以帮助玩家、开发者和市场分析师更好地理解市场趋势、玩家偏好和游戏设计元素。 游戏分类可以从多个维度进行&#xff0c;上一期跟大家分享了目前现有的游戏品类&#xff0c;本期跟大家分享具体游戏分类维度&#x1f447; 1、题材维度…

要抓住国际白银现货行情 以下这几点需要注意

国际白银现货行情最近表现不甚稳定&#xff0c;在七月上旬出现了比较强势的上涨&#xff0c;但随后出现强势的下跌&#xff0c;跌破了30关口。如果我们要抓住国际白银现货行情&#xff0c;那么以下这几点我们就需要注意。 一&#xff0c;建立交易计划&#xff0c;并且按计划执行…

Day1-软件包管理及shell命令

1. Linux介绍 1.1 Linux的发展 在Unix基础上发展而来 GNU GUN is Not Unix GPL General Public License 1.2 各种Linux发行版本 Red Hat Ubuntu 1.3 Linux体系结构 1.4命令终端 在桌面环境下的命令终端仿真器程序很多&#xff0c;它们各有特色&#xff0c;拥有各自的用户…

QT——常用的窗口相关知识点

1. 常用的窗口标志设置 设置窗口无标题栏 // 设置窗口无标题栏this->setWindowFlags(Qt::CustomizeWindowHint);设置窗口无边框 // 设置窗口无边框setWindowFlags(Qt::FramelessWindowHint);设置窗口置顶 // 设置窗口置顶setWindowFlags(Qt::FramelessWindowHint|Qt::Windo…

Harbor镜像仓库教程(单节点)

1.前置内容 1.1 harbor概述 众所周知&#xff0c;docker镜像仓库被墙了&#xff0c;所以部署我们私有环境内的Registry也是非常必要的。 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;相比docker官方拥有更丰富的权限权利和完善的架构设计&#xff…

Linux笔记 --- 组合数据类型

结构体 简单的定义结构体的方法 struct student {char name;int age;float score; };//使用student模板创建两个结构体变量 struct student Jack,Rose; 结构体中可以存放除了函数以外的任何数据类型的数据&#xff0c;在创建结构体时student被称为结构体模板名称&#xff0c;…

CRM是什么?如何用CRM管理好客户?

在企业的销售运营中&#xff0c;客户是是贯穿始终的主体。客户的需求、偏好与满意度&#xff0c;指引着企业未来改变、优化的方向。而企业销售运营的核心&#xff0c;就是“客户至上”。 面对庞杂的客户信息&#xff0c;如何快速高效的进行客户管理呢&#xff1f;那就是要有一…

windows下在线预览服务kkFileView4.4.0问题记录

前几天找到一个开源项目&#xff1a;kkFileView&#xff0c;感觉可能以后可能会用到&#xff0c;所以尝试了下。 通过git下载下来&#xff0c;版本是4.4.0&#xff0c;通过idea打开项目&#xff0c;发现老是无法找到组件aspose-cad&#xff0c;版本是23.9. 找了好多文章&#x…

MyBatis-Plus是啥?有啥用?让 MyBatis 开发更简单、更高效!

让 MyBatis 开发更简单、更高效! 在当今快节奏的软件开发世界中,提高开发效率是每个程序员都追求的目标。而 MyBatis-Plus 则是一款能够帮助开发者在 MyBatis 项目中事半功倍的神奇工具。本文将为您深入探索 MyBatis-Plus 的核心特性和强大功能,助您在 MyBatis 开发之路上驰骋畅…

计算word文件打印页数 VBA实现

目录 场景复现环境说明实现原理计算当前文件夹下所有word文件页数总和利用递归计算当前文件夹所有work文件页面数量几个BUG计算结果软件报价后话 场景复现 最近需要帮我弟打印高考资料&#xff0c;搜集完资料去网上打印&#xff0c;商家发出了这个计算页数的界面。我就好奇怎么…

Robotaxi火了,中国智驾公司冲击全球无人车第一股

作者 |芦苇 编辑 |德新 全球Robotaxi第一股要来了&#xff0c;中国的文远知行可能比Waymo、Cruise更早上市。 7月末&#xff0c;文远知行向美国SEC提交招股书&#xff0c;此次发行由摩根士丹利、摩根大通及中金公司牵头&#xff0c;股票代码「WRD」。 作为全球第一家上市的R…