【微服务】6、限流 熔断

news/2025/1/11 4:19:48/

线程隔离与容错处理

本视频主要讲解了在购物车业务中,因商品微服务响应慢导致的问题及解决方案,重点介绍了线程隔离后查询购物车业务不可用的情况,以及如何通过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.ppmy.cn/news/1562149.html

相关文章

QT-TCP-server

为了实现高性能的TCP通讯&#xff0c;以下是一个基于Qt的示例&#xff0c;展示如何利用多个线程、非阻塞I/O、数据分块和自定义协议进行优化。该示例以TCP服务器和客户端的形式展示&#xff0c;能够承受高负载并实现快速数据传输。 高性能TCP Server示例 #include <QTcpSe…

算法5--位运算

目录 基础经典例题[面试题 01.01. 判定字符是否唯一](https://leetcode.cn/problems/is-unique-lcci/description/)[268. 丢失的数字](https://leetcode.cn/problems/missing-number/description/)[371. 两整数之和](https://leetcode.cn/problems/sum-of-two-integers/descrip…

Redis数据结构ZipList和QuickList原理解析

大家好&#xff0c;我是袁庭新。 在数据库的世界里&#xff0c;Redis 以其高效和灵活备受瞩目。而其中的 ZipList 和 QuickList 数据结构更是独具魅力。它们在内存管理和数据存储方面有着独特的设计理念&#xff0c;深入探究这些结构&#xff0c;能让我们更好地理解 Redis 的强…

(回溯法)leetcode39组合总和

第一个2开头&#xff0c;下面的子节点的集合元素均为2,5,3 但是在5开头&#xff0c;下面的子节点集合元素均为5,3 带着这个图的思路确定i和index的传递值 backtracking(i, nums,8,sum);用的是i而不是i1 // ConsoleApplication3.cpp : 此文件包含 "main" 函数。程序…

智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之21 项目主页:基于资源的交互系统--以RESTful 风格设计构建 聊天窗口

本文要点 基于 RESTful 风格设计一个“为 AI 聊天工具添加一个知识树系统”的项目主页 本项目&#xff08;为AI聊天工具添加一个知识树系统&#xff09;的主页页面的三个页面版块( 注&#xff1a;一个项目的基础版本&#xff0c;它明确给出建模限制 what(where&#xff0c;ho…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

Selenium,一个Web自动化测试的Python库!

Selenium&#xff0c;一个Web自动化测试的Python库 大家好&#xff0c;我是景墨。今天咱们来聊聊一个超级实用的Python库&#xff1a;Selenium。这个库可以帮我们实现Web自动化测试&#xff0c;简直是测试工程师和爬虫开发者的神器&#xff01;保证学会了这个&#xff0c;你的…

Node.js JXcore 打包教程

Node.js JXcore 打包教程 介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许开发者使用 JavaScript 编写服务器端和网络应用程序。JXcore 是一个流行的 Node.js 发行版,它支持将 Node.js 应用程序打包成单一的可执行文件,使得部署和分发变得更加容易…