微服务保护之熔断降级

在微服务架构中,服务之间的调用是通过网络进行的,网络的不确定性和依赖服务的不可控性,可能导致某个服务出现异常或性能问题,进而引发整个系统的故障,这被称为 微服务雪崩。为了防止这种情况发生,常用的一些保护措施包括超时处理熔断降级限流线程池隔离信号量隔离等。

(1)超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。

(2)熔断降级:当服务的异常数或异常比例超过了预设的阈值时,熔断器会进入开启状态,暂时中断对该服务的请求,此时走降级方法,能够快速响应,确保系统的基本功能能够继续运行。

(3)限流:限制对服务的请求速率,避免短时间内大量的请求导致系统崩溃。

(4)线程池隔离:给要请求的资源分配一个线程池,通过线程池去控制请求数量

(5)信号量隔离:使用计数器模式,记录请求资源的并发线程数量,达到信号量上限时,禁止新的请求。

信号量隔离适合同步请求,控制并发数,比如:对文件的下载并发数进行控制。

大多数场景都适合使用线程池隔离,对于需要同步操作控制并发数的场景可以使用信号量隔离。

1. 熔断降级的背景

在微服务架构中,服务之间的依赖复杂,任何一个服务的故障都有可能引发连锁反应,导致服务雪崩。为此,引入熔断和降级机制,当某个服务长时间无法响应或者发生错误时,系统可以快速进入降级模式,避免对外提供错误服务。

熔断降级的核心流程包括:

  1. 降级:当远程调用发生异常时,不继续等待,而是直接执行降级逻辑,返回预设的结果。
  2. 熔断:当异常达到某个阈值时,熔断器打开,短时间内不再调用出问题的服务,而是走降级处理,防止继续调用带来更多问题。
  3. 恢复:当经过一段时间后,系统尝试再次调用原服务,如果服务恢复正常,则关闭熔断,恢复正常调用。

2. 熔断降级的具体实现步骤

当远程调用发生异常首先走降级方法,当异常比较或异常数达到阈值将触发熔断,在熔断时间内不再走原来的方法而是走降级方法,可以快速进行响应。

当服务恢复后,熔断时间结束此时会再次尝试请求服务,如果成功请求将关闭熔断,恢复原来的链路。

2.1 在客户端 api 工程定义远程调用接口

在 api 工程中,定义远程调用的接口。这个接口将通过 Feign 进行服务调用。接口通过 @FeignClient 注解进行标注,指定服务名称和请求的路径。

package com.jzo2o.api.user;
 
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
 
// 通过 @FeignClient 指定远程服务的名称 user-service
@FeignClient(name = "user-service", path = "/user/api/users")
public interface UserServiceClient {
 
    // 定义要调用的远程服务的接口,@GetMapping 表示通过 GET 方法访问
    @GetMapping("/{id}")
    User getUserById(@PathVariable("id") Long id);
}

@FeignClient:表示这是一个 Feign 客户端,name 为服务提供者的名称,url 指定服务的地址(可省略,使用服务发现时)。
@GetMapping("/api/users/{id}"):声明需要调用的接口路径。
此接口只定义远程调用的方法,不需要具体实现,Feign 会自动为它生成代理类。

2.2 服务消费者中实现熔断降级

如果在 api 工程定义的远程调用接口中实现统一的熔断降级,则后续所有的消费者都是同一个熔断降级策略,不符合实际工程应用。故在每一个消费者中定义专门远程调用的类实现远程调用、熔断、降级逻辑。

使用@SentinelResource注解定义sentinel监控的资源,@SentinelResource注解的属性具体包括。

value: 用于定义资源的名称,即 Sentinel 会对该资源进行流量控制和熔断降级。

fallback :非限流、熔断等导致的异常执行的降级方法

blockHandler :触发限流、熔断时执行的降级方法

@Component
@Slf4j
public class OrderClient {
 
    @Resource
    private UserServiceClient userServiceClient;
 
    // 通过 UserServiceClient 调用远程的用户服务
    @SentinelResource(value = "getUserInfo", fallback = "detailFallback", blockHandler = "detailBlockHandler")
    public User getUserInfo(Long userId) {
        // 调用 api 中定义的远程服务接口
        return userServiceClient.getUserById(userId);
    }

    //执行异常走
    public User detailFallback(Long id, Throwable throwable) {
        log.error("非限流、熔断等导致的异常执行的降级方法,id:{},throwable:", id, throwable);
        return null;
    }

    //熔断后的降级逻辑
    public User detailBlockHandler(Long id, BlockException blockException) {
        log.error("触发限流、熔断时执行的降级方法,id:{},blockException:", id, blockException);
        return null;
    }
}

2.3 服务消费者调用实现熔断降级的方法

@Service
public class OrderService {
 
    @Resource
    private OrderClient orderClient ;
 
    // 通过 orderClient 调用远程的用户服务
    public User getUserInfo(Long userId) {
        // 调用 OrderClient 的方法
        return orderClient .getUserInfo(userId);
    }
}

2.4 在sentinel中配置熔断规则

进入sentinel控制台,左侧点击簇点链路,然后右侧选择getUserInfo,选择+熔断。

为了方便测试熔断效果配置异常数规则,如下:

5秒以内最少请求2次,有1次异常则进行熔断。熔断时长为30秒。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Debian项目实战——环境搭建篇

Debian系统安装 准备工作 1、系统镜像:根据自己的需要选择合适的版本格式:x86 / arm 架构 | 最好下载离线安装版本 | 清华镜像源 2、制作工具:balenaEtcher 3、系统媒介:16G以上U盘最佳 烧录镜像 打开balenaEtcher进行烧录&am…

克隆GitHub仓库中的一个文件夹

要只克隆GitHub仓库中的一个文件夹&#xff0c;你可以使用 git sparse-checkout 功能。以下是具体步骤&#xff1a; 克隆仓库&#xff08;使用 --no-checkout 选项&#xff0c;避免下载所有内容&#xff09;&#xff1a; git clone --no-checkout <仓库地址> 进入克隆的…

Active Directory 实验室设置第一部分- AD林安装

在之前的文章中&#xff0c;已经讨论了活动目录的基本知识。在这篇文章中&#xff0c;我们将讨论如何设置和配置环境&#xff0c;以便我们可以使用它来执行各种攻击方案和检测。我们将讨论如何通过GUI和CLI方式完成。 # 1、Active Directory 设置 让我们从活动目录实验室设置…

foc原理odrive驱动板的使用,以及功能介绍

文章目录 驱动板引脚&#xff1a;编码器的安装&#xff1a;电机参数编码器设置 odrive控制控制指令设置模式设置输入模式其他指令 调PID调试准则先调整内环&#xff0c;再调整外环在位置模式下调试结论 使用的灯哥开源的odrive驱动板&#xff0c;外接编码器 驱动板引脚&#xf…

泳池软管检测系统源码分享

泳池软管检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【数学分析笔记】第3章第2节 连续函数(4)

3. 函数极限与连续函数 3.2 连续函数 3.2.9 反函数的连续性定理 【定理3.2.2】【反函数连续性定理】设 y f ( x ) yf(x) yf(x)在闭区间 [ a , b ] [a,b] [a,b]上连续且严格单调增加&#xff0c;设 f ( a ) α , f ( b ) β f(a)\alpha,f(b)\beta f(a)α,f(b)β&#xff0…

web基础之RCE

简介&#xff1a;RCE称为远程代码执行漏洞&#xff1b;是互联网的一种安全漏洞&#xff1b;攻击者可以直接向后台服务器远程注入操作系统命令&#xff1b;从而操控后台系统&#xff1b;也是CTF比较常考的一个方面 1、eval执行 &#xff08;1&#xff09;分析后端代码&#xf…

[数据集][目标检测]无人机识别检测数据集VOC+YOLO格式6986张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6986 标注数量(xml文件个数)&#xff1a;6986 标注数量(txt文件个数)&#xff1a;6986 标注…

物流管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;物品分类管理&#xff0c;物流公司管理&#xff0c;物流信息管理&#xff0c;配送信息管理 微信端账号功能包括&#xff1a;系统首页&a…

Mybatis 快速入门(maven)

文章目录 需求建表新建了数据库但是navicat界面没有显示 新建maven项目 注意导入依赖 总结 黑马学习笔记 需求 建表 注意&#xff1a;设置字符集 减少出错 drop database mybatis; create database mybatis charset utf8; use mybatis;drop table if exists tb_user;create…

如何使用MyJWT测试你的JWT是否存在安全问题

关于MyJWT MyJWT是一款针对JSON Web Token&#xff08;JWT&#xff09;的安全检测工具&#xff0c;该工具适用于渗透测试人员、CTF 玩家或开发人员&#xff0c;可以快速针对JWT执行安全扫描与检测。 功能介绍 1、支持将新的 jwt 复制到剪贴板&#xff1b; 2、用户界面&#xf…

人脸活体检测系统源码分享

人脸活体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景 因为组员对于 Electron 打包过程存在比较迷糊的状态&#xff0c;且自己也没主动探索 Electron-vue 打包细节&#xff0c;导致每次打包过程都消耗 5-6 分钟的时间&#xff0c;在需要测试生产打包时&#xff0c;极其浪费时间&#xff0c;为此针对 Electron-vue 打包的几个环…

快手可灵AI全球升级1.5模型:引入“运动笔刷”功能 画质大幅提升

9月19日&#xff0c;快手公司宣布其可灵AI模型进行了全球范围内的重磅升级&#xff0c;推出了1.5版本。新版本在多个方面实现了显著提升&#xff0c;包括视频画质、动态效果、美学表现、运动合理性以及语义理解等。 新升级的1.5模型支持在高品质模式下直接输出1080p高清视频&am…

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…

Unity携程Coroutine用法

一.携程概述 官方的解释是&#xff0c;携程允许你可以在多个帧中执行任务。在Unity中&#xff0c;携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。 二.携程写法 下面示例使用携程和Update打印前5帧的时间间隔&#xff0c;展示了携程的基础写法 using System.Colle…

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明&#xff1a;数据集里面有2/3是增强数据集&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求在下载&#xff0c;分辨率均为640x640 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件…

使用Rust直接编译单个的Solidity合约

这里写自定义目录标题 使用Rust直接编译单个的Solidity合约前言预备知识准备工作示例 使用Rust直接编译单个的Solidity合约 前言 我们知道&#xff0c;我们平常开发Solidity智能合约时一般使用Hardhat框架&#xff0c;但是如果你是一个Rustacean (这是由 “Rust” 和 “crust…

C++速通LeetCode中等第3题-盛最多水的容器

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

Qt与Udp

(1)绑定端口 (2)广播 用udp实现广播通信_udp广播-CSDN博客 数据的发送是面向整个子网的&#xff0c;任何一台在子网中的计算机都可以接收到相同的数据。 如果一台机器希望向其他N台机器发送信息&#xff0c;这时候可以使用UDP的广播。 --------------- 广播地址&#xff1…