【微服务】6、限流 熔断

线程隔离与容错处理

本视频主要讲解了在购物车业务中,因商品微服务响应慢导致的问题及解决方案,重点介绍了线程隔离后查询购物车业务不可用的情况,以及如何通过Fallback逻辑进行缓解,包括配置Feign调用为簇点资源、添加Fallback逻辑的步骤及验证过程。

在这里插入图片描述

1. 线程隔离问题回顾与解决方案引出

问题分析

  • 购物车业务需查询商品信息,商品微服务响应慢,并发高时会拖慢购物车服务,故对购物车业务做线程隔离,限制使用少量线程资源。
  • 隔离后查询购物车业务不可用,直接报错,前端无法获取最新数据,虽保护了微服务,但被隔离业务资源耗尽后不可用影响用户体验。

解决方案

使用Fallback逻辑,给查询购物车中查商品的逻辑添加Fallback,当资源耗尽被拒绝时,走Fallback逻辑,提供默认数据或友好提示给用户,提升用户体验。

2. 配置Feign调用成为簇点资源及添加Fallback方式

配置Feign调用为簇点资源

在application.yml中配置feign.sentinel.enabled = true(默认false),开启Feign的Sentinel监控,使Feign调用成为链路中的资源,以便对其进行限流或线程隔离操作。

添加Fallback逻辑

  • 方式选择:Feign客户端添加Fallback有Fallback classFallback Factory两种方式,推荐使用FALLBACKFACTORY,因其更灵活,可提前处理异常,较为优雅。

  • 具体步骤

  • 在这里插入图片描述

    • 定义Fallback factory:实现FallbackFactory接口,泛型指定为要处理的Feign客户端,如user client。在create方法中创建对应Feign客户端的Fallback对象,实现Feign客户端接口方法,编写失败处理逻辑,如返回默认数据、记录日志等。
    • 注册Fallback factory为bean:在配置类中声明一个bean,类型为定义的Fallback factory,返回new的factory对象。
    • 指定Fallback factory属性:在对应的Feign客户端注解里,将fallbackFactory属性指定为定义好的Fallback factory。

在这里插入图片描述

3. 定义item client的Fallback factory及相关处理

定义item client的Fallback factory

在这里插入图片描述

  • fallback包中创建ItemClientFallbackFactory类,实现FallbackFactory接口,泛型为ItemClient。
  • 实现create方法创建ItemClient的Fallback对象,编写查商品接口失败处理逻辑,如查商品失败返回空集合兜底,减库存业务先抛出异常后续处理。

将Fallback factory设为对象并应用

在这里插入图片描述

  • 在API模块的DefaultConfig配置类中注册ItemClientFallbackFactory为bean。
  • 在ItemClient的注解中指定fallbackFactory为定义的ItemClientFallbackFactory,完成Fallback逻辑定义。

在这里插入图片描述

在这里插入图片描述

4. 测试与总结

测试过程

  • 完成改造后重启购物车服务,添加流控规则(如限制线程数为5或6),对查商品的远程Feign调用做线程隔离。
  • 高并发请求购物车服务,查询不抛异常但商品信息可能查不到(查失败返回空信息),修改不受影响,说明查询失败时走了Fallback逻辑,给用户友好结果。

实现Fallback步骤总结

  • 开启Feign客户端资源监控,将Feign远程调用作为簇点链路资源。
  • 编写Fallback逻辑,包括定义Fallback factory、注册为bean、在Feign客户端指定factory属性。

知识拓展

Fallback不仅可结合限流使用,后续还可结合熔断使用


服务熔断

在这里插入图片描述

服务熔断的作用与需求

回顾服务中断与线程隔离

在购物车微服务查询购物车业务中,上节课实现了对查询商品服务远程调用的线程隔离,限制其使用线程数量,防止商品服务故障耗尽购物车服务线程资源,避免拖垮购物车服务。

线程隔离存在的问题与熔断需求

尽管做了线程隔离,但每次请求仍进行耗时远程调用,若服务挂掉还继续请求会浪费资源。因此,需要服务熔断,即当服务故障或异常比例高时,拒绝发起远程调用,直接走Fallback,避免资源浪费。同时,服务恢复正常后应取消熔断。

断路器概念引入

实现熔断和恢复涉及复杂逻辑,断路器可帮助实现该功能,其原理类似电路中的保险丝和空气开关。

断路器原理

断路器状态机

在这里插入图片描述

断路器内部有状态机,包含close、open和half open三个状态。默认处于close状态,此时所有请求正常访问,同时监控请求的异常比例或慢请求比例(可配置)。

状态切换机制

  • 若异常比例或慢请求比例过高达到阈值,从close状态进入open状态,拦截所有请求,直接快速失败走Fallback。open状态为临时状态,持续时间可配置。
  • open状态到期后进入half open状态,放行一次请求检查服务是否恢复。若请求依然异常或慢,则切回open状态;若成功,则进入close状态放行请求并进行下一轮统计。

配置方式

在Sentinel控制台进行配置,找到要设置的资源(如远程调用),点击后面的熔断按钮,在弹出窗口填写熔断规则。
在这里插入图片描述

熔断策略及参数

熔断策略介绍

有慢调用比例、异常比例、异常数三种策略。

慢调用比例策略参数

选定慢调用比例后,需设置最大响应时间(如200ms,超过此时间算慢)、慢调用比例阈值(如0.5,即50%)、熔断时长(如20秒,熔断期间所有请求走Fallback)、最小请求数量(如5次,统计这5次内的比例是否达标)、统计时长(如1秒,在1秒内请求达到一定次数进行统计)。异常比例和异常数策略类似,异常数策略是固定数量达到阈值就熔断。

熔断测试

测试准备

打开JMETER查看未加熔断时的请求情况,如最大响应时长590ms,最小22ms,平均63ms,准备加入熔断后对比效果。

配置熔断规则

按慢调用配置熔断规则,以500ms为慢调用判断标准(超过200ms算慢),阈值0.5,熔断时长20秒(方便观测效果),最小请求数量5,统计时长1秒,可同时配置多个策略。

测试过程与结果

每秒发100个请求,因超时请求会被熔断。熔断后响应速度快,如price为空、状态为旧,未查到最新商品信息,因为根本未进行查商品的远程调用。熔断结束后(超过20秒会放行一次请求)再次查询能查到商品最新信息,若放行请求发现服务仍不好则再次熔断,如此循环,可大大降低响应时间。

熔断总结与拓展

熔断总结

服务熔断是对服务的保护,降低服务消耗和资源浪费,配置方式是在控制台找到资源点击熔断按钮填写规则,包括基于慢调用、异常、异常数等设置比例、熔断时间、请求数量、统计数量和时长等,其余工作由系统自动完成。

Sentinel其他功能提及

Sentinel功能不止于此,浏览器中还显示有热点规则、系统规则、授权规则等多种控制功能,虽强大但使用相对较少。


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

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

相关文章

25年01月HarmonyOS应用基础认证最新题库

判断题 “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。为了实现这一目的,HarmonyOS提供了多端开发环境,多端开发能力以及多端分发机制。 答案:正确 《鸿蒙生态应用开发白皮书》全面阐释…

ELK实战(最详细)

一、什么是ELK ELK是三个产品的简称:ElasticSearch(简称ES) 、Logstash 、Kibana 。其中: ElasticSearch:是一个开源分布式搜索引擎Logstash :是一个数据收集引擎,支持日志搜集、分析、过滤,支持大量数据…

Dubbo-笔记随记一

一、实战 1 . Springboot整合 1.1 服务提供者 1.1.1 依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><dependency&g…

ETCD渗透利用指南

目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3&#xff0c;不同的API结果无论是访问URL还是使用etcdctl进行通信&#xff0c;都会导致问题&#xff0c;例如使用etcdctl和v3进行通信&#xff0c;如果没有实名ETCDCTL_API3指定API版本会直接…

使用VUE3创建个人静态主页

使用VUE3创建个人静态主页 &#x1f31f; 前言&#x1f60e;体验&#x1f528; 具体实现✨ 核心功能&#x1f3d7;️ 项目结构&#x1f680; 用这个项目部署 Git Page &#x1f4d6; 参考 &#x1f31f; 前言 作为开发者或者内容创作者&#xff0c;我们经常需要创建静态网页&a…

llm大模型学习

llm大模型 混合专家模型&#xff08;MoE&#xff09;MoE结构路由router专家expertSwitch Transformer的典型MOE模型最后MoE总结 混合专家模型&#xff08;MoE&#xff09; 模型规模是提升LLM大语言模型性能的关键因素&#xff0c;但也会增加计算成本。Mixture of Experts (MoE…

Linux入门攻坚——43、keepalived入门-1

Linux Cluster&#xff08;Linux集群的类型&#xff09;&#xff1a;LB、HA、HPC&#xff0c;分别是负载均衡集群、高可用性集群、高性能集群。 LB&#xff1a;lvs&#xff0c;nginx HA&#xff1a;keepalived&#xff0c;heartbeat&#xff0c;corosync&#xff0c;cman HP&am…

YOLOv8/YOLOv11改进 添加CBAM、GAM、SimAM、EMA、CAA、ECA、CA等多种注意力机制

目录 前言 CBAM GAM SimAM EMA CAA ECA CA 添加方法 YAML文件添加 使用改进训练 前言 本篇文章将为大家介绍Ultralytics/YOLOv8/YOLOv11中常用注意力机制的添加&#xff0c;可以满足一些简单的涨点需求。本文仅写方法&#xff0c;原理不多讲解&#xff0c;需要可跳…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1&#xff1a;函数体内计算sz&#xff08;sz不作实参传递&#xff09; 3.2 代码示例2&#xff1a;sz作为实参传递 3…

解决“KEIL5软件模拟仿真无法打印浮点数”之问题

在没有外部硬件支持时&#xff0c;我们会使用KEIL5软件模拟仿真&#xff0c;这是是仿真必须要掌握的技巧。 1、点击“Project”&#xff0c;然后点击“Options for target 项目名字”&#xff0c;点击“Device”,选择CPU型号。 2、点击“OK” 3、点击“Target”,勾选“Use Mi…

donet (MVC)webAPI 的接受json 的操作

直接用对象来进行接收&#xff0c;这个方法还不错的。 public class BangdingWeiguiJiluController : ApiController{/// <summary>/// Json数据录入错误信息/// </summary>/// <param name"WeiguiInfos"></param>/// <returns></r…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式&#xff08;Singleton&#xff09; 游戏实现中的唯一对象 在游戏开发过程中…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…

如何让用户在网页中填写PDF表格?

在网页中让用户直接填写PDF表格&#xff0c;可以大大简化填写、打印、扫描和提交表单的流程。通过使用复选框、按钮和列表等交互元素&#xff0c;PDF表格不仅让填写过程更高效&#xff0c;还能方便地在电脑或移动设备上访问和提交数据。 以下是在浏览器中显示可填写PDF表单的四…

ThinkPHP 8高效构建Web应用-获取请求对象

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

23.行号没有了怎么办 滚动条没有了怎么办 C#例子

新建了一个C#项目&#xff0c;发现行号没有了。 想把行号调出来&#xff0c;打开项目&#xff0c;选择工具>选项> 如下图&#xff0c;在文本编辑器的C#里有一个行号&#xff0c;打开就可以了 滚动条在这里&#xff1a;

30天开发操作系统 第 12 天 -- 定时器

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

el-table 实现纵向多级表头

为了实现上图效果&#xff0c;最开始打算用el-row、el-col去实现&#xff0c;但发现把表头和数据分成两大列时&#xff0c;数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样&#xff0c;为保持高度样式一致&#xff0c;就需要我们手动去获取最高格的高度之后再设置…

uni-app深度解码:跨平台APP开发的核心引擎与创新实践

在当今数字化浪潮中&#xff0c;移动应用市场呈现出爆炸式增长。为了满足不同用户群体在不同操作系统上的需求&#xff0c;跨平台 APP 开发成为众多开发者的首选策略。uni-app 作为一款领先的跨平台开发框架&#xff0c;以其独特的优势和创新的实践在众多同类产品中脱颖而出。它…

oxml中创建CT_Document类

概述 本文基于python-docx源码&#xff0c;详细记录CT_Document类创建的过程&#xff0c;以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类&#xff08;MetaClass&#xff09;是Python中的高级特性。元类是什么呢&#xff1f;Python是面向对象编程…