sentinel与seata组件在微服务中的基本作用

微服务基础内容:

在微服务中,首先学习了微服务的横向拆分与纵向拆分,纵向拆分指按照功能拆分模块,横向拆分指将高复用的模块单独拆分,使纵向拆分的模块去调用这部分内容。

学习了基本拆分后,需要知道微服务之间的关系是多对多的消费者生成者模型,每个模块互为消费者与生产者,为了微服务之间传递的可靠性,需要用到nacos组件。nacos组件的主要充当一个中介——注册中心,nacos与生产者间通过心跳协议维护一张服务表单,当消费者需要生产者的调用时,nacos会给消费者提供相应的生产者表单,这个表单维护了多个完成消费者服务的端口号,消费者根据负载均衡选择一个端口号进行建立连接,从而调用生产者。

学习了基本拆分与nacos后,拿到了具体的生产者的端口号,引入了openfeign组件,这个组件实际上就是http转发工具,因为不同微服务之间是相互隔离的,拥有自己的数据库与服务器,所以不同微服务之间的调用需要采用网络请求,openfeign的作用就是这个。通过端口号以及对应的openfeign转发,从而构建不同微服务之间的连接与调用。

学习了上述内容之后,开始思考如何进行鉴权。还是由于微服务的隔离性,不同服务之间如何拿到鉴权信息?回顾单体架构的鉴权方式,使用的是springmvc拦截器,通过在拦截器中获取http.request.header中的授权信息后,在后端将授权信息比对,从而将需要的权力信息(比如userInfo)存储在ThreadLocal中,然后在线程执行期间就可以随时在鉴权页面拿到想要的内容。

在微服务架构中采用网关来实现上述操作,不仅如此,网关还可以解决前后端端口号不一致的矛盾。前端只会访问网关,网关来负责转发给不同的微服务。

以鉴权举例,网关通过拦截器拿到userInfo,存储在threadLocal中,当本次调用的微服务要调用下一个微服务,并且需要userInfo时,会使用openfeign工具,将userInfo存储在这个网络请求的请求头中,转发的请求仍然再一次访问网关,网管拦截器拿到userInfo,提取出放入该微服务执行线程的threadlocal中。从而实现,多个微服务之间的数据传递。

开始:

上述内容都是微服务的基本内容,现在需要考虑微服务的一些弊端。

一、首先微服务显然会出现雪崩的场景,当某个微服务A宕机后,后续调用该微服务B调用A时也会卡在请求A的过程中,后续又有C调用B,C也卡住(继续向后叠加奖池)从而造成A/B/C的资源一直在请求中无法释放,最终造成服务器资源耗尽而崩溃。

sentinel组件就是用于解决这个问题的,sentinel组件也是alibaba旗下的,与nacos配合服用。

sentinel的操控在控制台中,只需要导包与配置,方便快捷,在管理面板添加相应的配置项后,甚至可以免服务部署来更新对应的参数。说一说sentinel的作用,sentinel的作用主要分为限流与熔断。

1.限流包含限制访问请求数以及为微服务分配的线程数,限制请求数就是限定QPS,这个很好理解。

2.限制线程数为每个微服务分配固定的线程数,请求到了微服务,首先去线程池中取线程,如果没有线程,那么就会返回报错。

3.针对返回报错导致用户体验不好的弊端,在openfeign中又定义了一个错误处理,这个可以理解为单体架构中的异常处理,代码案例如下:

@Slf4j
public class CartToItemFallback implements FallbackFactory<ItemClient>{@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemById(Collection<Long> ids) {log.error("查询商品失败",cause);return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {log.error("扣减库存失败",cause);throw new RuntimeException(cause);}};}
}

这个内容会被对应的ItemClient生成注解并标记。需要理解的是,我们进行fallback处理的是微服务调用之间的问题,而宕机的微服务不是通过fallback进行处理的。当微服务A调用宕机微服务B时,A这个时候因为限流没有拿到B的资源,这时直接fallback返回,不会出现报错,A中的其余项目继续处理即可。

4.sentinel中除了限流还有熔断机制,限流只是为了防止未出现故障的微服务A调用已经宕机的微服务B而造成整个系统崩溃,但是A还是会去调用B,只不过A没有调用成功而已,这个请求的过程仍然在耗费资源。

而使用熔断机制后,能够直接不让A发送请求。熔断机制会监控一段时间或一定次数内的调用失败率(或错误次数),比如在sentinel中就有TTL,当连接响应超过设置的TTL以及持续多少秒后(达到阈值),就将熔断器置为 Open 状态,此时所有对微服务 B 的调用都会被短路快速失败,不再真正发送请求。经过一个休眠时长后,熔断器进入 Half-Open,允许少量请求恢复探测;如果恢复良好,则关闭熔断器,否则继续保持 Open。

二、在学习了sentinel后知道了如何处理单个微服务的崩溃问题,继续学习微服务中的事务问题。

微服务的事务问题和单体架构的事务问题很相似,举个例子:

支付操作:对用户扣款,将订单状态修改为已支付。

这个例子中,用户服务会去调用订单服务,如果用户扣款服务正常执行,但是执行订单状态修改时出现了问题,从而导致数据库不一致。

这个解决的方案就是使用seata组件,来对事务进行控制。

想要进行事务,简单分析就是让多个微服务进行提交的同步或者回滚的同步,就如同数据库中的提交与回滚类似,只不过在这里的事务不完全保证原子性(如AT方法)

seata组件支持两种方式来进行事务控制,分别是XA和AT:

XA方式:

XA方式是最早的传统方式,方式比较粗暴,首先RM注册分支事务到TC(也就是告诉TC我是一个多服务时间,需要XA管理),然后RM去执行对应的sql操作,但是此时不进行提交,RM 向 TC 发送服务运行结果,TC比对这个时间所有RM的执行结果,进行统一的提交和回滚。
显然这个方式很好的保证了多个微服务的sql操作同步性,但是弊端也比较明显,这种方式即使对应的微服务已经完成工作并且发送给TC其成功状态,仍然还需要等待其余RM执行完毕,造成资源的浪费。优点是不会出现数据库的不一致,保证结果的完全可靠。

TA方式:

TA方式是现在国内用的比较多的一种方式,TA方式不同点在于 所有RM注册后,会对当前的环境生成相应的快照undo-log,说白了就是备份当前数据库环境。
然后每个RM分别执行自己的,执行完后自行提交,提交由RM自行完成,提交完后向TC报告执行状态。


当所有RM进行报告后,TC会来验收,如果有RM出现故障,就会回滚到最初的快照状态。
TA方式优势很明显,每个RM结束后就会立刻释放资源,不会造成资源的浪费。
缺点也比较明显,TA方式会导致短暂的数据不一致(在RM提交后到TC检查到错误并回滚之前)

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

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

相关文章

微信点餐小程序—美食物

本项目是基于WAMP Server 和PHP 动态网页技术构建的微信小程序点餐系统&#xff0c;该系统主要分为前端&#xff08;微信小程序&#xff09;和后端&#xff08;基于PHPMySQL服务器端&#xff09; 整体架构流程 1、前端部分 用户界面&#xff1a;展示菜品、处理用户点餐操作、…

记录Idea运行控制台乱码处理方案

记录Idea运行控制台乱码处理方案 方法1&#xff1a;修改运行配置 打开 Run/Debug Configurations在对应的运行配置中 → 找到 VM Options → 添加&#xff1a; -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8重新运行程序 方法2&#xff1a;强制指定输出流编码 在代码中显…

JVM对象内存分配机制全解析

jvm创建对象的内存分配过程 1、逃逸对象在栈上分配 通过在栈上为对象分配内存,使对象占用的内存空间随着方法结束栈帧弹出而销毁,避免了GC垃圾收集器回收对象,减小GC的压力; 栈上分配内存依赖逃逸分析和标量替换。 逃逸分析: 分析对象的动态作用域逃逸:当一个对象在方…

揭秘OSPF核心:LSA类型与路由计算

一、区域内路由计算 同一区域内中的所有路由器有相同的LSDB LSA关键字段&#xff1a; 【1】LS Age&#xff08;链路状态老化时间&#xff09;&#xff1a;LSA生存的时间&#xff0c;单位秒 【2】Option&#xff08;选项字段&#xff09; 【3】LS Type&#xff08;链路状…

英文摘要给成中文摘要模型

你现在使用的 UNIMO 项目&#xff08;PaddlePaddle/Research/NLP/UNIMO&#xff09;&#xff0c;默认是做英文摘要任务&#xff0c;如你在 README 中看到的数据集是 CNN/DailyMail&#xff0c;它是一个 英文摘要数据集。不过&#xff0c;这个项目的架构完全支持中文&#xff0c…

前端面试专栏-主流框架:13.vue3组件通信与生命周期

&#x1f525; 欢迎来到前端面试通关指南专栏&#xff01;从js精讲到框架到实战&#xff0c;渐进系统化学习&#xff0c;坚持解锁新技能&#xff0c;祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 Vue3组件通信与生命周期深度解析 在Vue3的开发体系…

自动化交易优化网格策略

一、动态参数调整 1. 网格间距优化 - 波动率自适应&#xff1a;使用平均真实波幅&#xff08;ATR&#xff09;指标动态调整间距。例如&#xff0c;当ATR值上升20%时&#xff0c;将间距从原定的1%扩大至1.5%&#xff1b;ATR下降时则缩小间距至0.8%。可通过Python的TA-Lib库实时计…

测试平台ui自动化demo说明

1. 要启动celery worker windows 开发时&#xff0c;用第二行 。&#xff08;试过&#xff0c;可以&#xff09;&#xff0c;第一行的没试过。 celery -A myproject worker --loglevelinfo # windows电脑用下面的&#xff0c;并且settings中还要加那个solo celery -A your_p…

五大主要Token类型之字符标记Token

如大家所了解的&#xff0c;在数字化时代&#xff0c;我们每天都会与Token&#xff08;令牌&#xff09;打交道——无论是在线支付、登录社交媒体&#xff0c;还是调用API接口&#xff0c;都离不开这一关键技术。 今天我们主要来学习&#xff1a;字符标记Token 在自然语言处理…

可理解性输入:洗澡习惯

一、开场与淋浴准备 Today we’re going to learn bathroom English. Let’s get started. So the first thing we want to do. Make sure we have our towel and we’ll hang it on the towel rack before we have a shower. Because if we have a shower and then forget ou…

GO Echo框架面试题及参考答案

目录 Echo 框架的核心结构是什么?Echo 和 Context 分别扮演什么角色? 如何创建一个 Echo 实例?简述常见配置项。 e.Start () 与 e.StartServer () 的区别是什么? Echo 如何实现基于先后顺序路由匹配? 如何注册 GET、POST、PUT、DELETE 等不同 HTTP 方法的路由? Echo…

Java 中LinkedList 总结

406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高…

大模型微调:从零到实践,掌握AI大模型的核心技能

大模型微调&#xff1a;从零到实践&#xff0c;掌握AI大模型的核心技能 引言 大规模语言模型&#xff08;如DeepSeek、通义千问&#xff09;的出现&#xff0c;彻底改变了自然语言处理的格局。这些模型不仅在学术界取得了突破性进展&#xff0c;在工业界也得到了广泛应用。 …

Flutter - 原生交互 - 相册

环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 iOS 13.4.1 iOS 18.5 集成image_picker 在Flutter中可以使用image_picker插件实现从相册中获取图片 添加插件 flutter中访问相册image_picker插件 flutter pub add image_pickerflutter pub getXcode工程的GenerateP…

node.js在vscode的配置

文章目录 概要1. 使用和webstrom一样的快捷键2. 让vscode的主题变成webstrom3. 如何在 Node.js 环境下写代码3.1 使用 ESLint配置规则3.2 配置.vscode/settings.json 4. Prettier安装5. 其它问题解决 概要 node.js在webstrom编辑器中可以完美使用代码提示、错误提示等功能&…

Android14音频子系统-Audio HAL分析

文章目录 1&#xff09;概述2&#xff09;HAL的打开流程3&#xff09;HAL库的实现(Qualcomm)4&#xff09;tinyalsa5&#xff09;数据结构6&#xff09;代码流程 1&#xff09;概述 1、回顾HAL、tinyalsa与linux driver的关系 2、与AudioFlinger的关系 3、 1、如何判断当前…

前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

【AI智能体】新手教程-通过 Chat SDK 搭建网页在线客服

通过扣子搭建的智能体可以一键发布为 Chat SDK&#xff0c;快速部署到你的自建网站中&#xff0c;作为在线智能客服面向网站的用户提供 AI 答疑服务。本文档介绍通过 Chat SDK 搭建网页版在线客服的详细操作步骤。 场景说明 网站作为企业和组织与用户互动的重要平台&#xff…

flask静态资源与模板页面、模板用户登录案例

案例代码 import flask# template_folder 模板文件夹(静态页面 html页面渲染) # static_folder 静态资源文件夹主要存放的是类似静态数据、音频、视频、图片等 app flask.Flask(__name__, static_folderstatic, template_foldertemplate)app.route(/) def index():# render_t…

【工具教程】识别PDF中文字内容,批量识别文字并保存到Excel表格中的操作步骤和方法

在日常办公和文件管理中&#xff0c;我们常常会遇到需要处理大量 PDF 文件的情况。有时&#xff0c;为了更好地管理和查找这些文件&#xff0c;需要根据 PDF 文件中特定区域的文字内容对文件进行重命名。例如&#xff0c;在企业档案管理中&#xff0c;合同文件可能需要根据合同…