SpringCloud Alibaba(中):服务熔断降级-Sentinel

news2025/1/24 11:35:09

在这里插入图片描述

Sentinel

Sentinel是阿里巴巴开源的分布式系统流量防卫防护组件,主要对分布式系统中的流量进行控制、熔断降级等保护操作。Sentinel的目标是成为互联网级别分布式系统的流量防卫防护组件,它与系统的各个部分集成,保护着系统的入口和出口。

概念:
Sentinel是一个分布式系统的流量防卫防护组件,它通过对分布式系统中的流量进行控制、熔断降级等保护操作,保障系统的稳定性和可用性。

背景:
随着分布式系统的广泛应用,系统的复杂度和耦合度越来越高,系统中的流量控制和保护变得越来越重要。Sentinel正是在这样的背景下诞生的,它通过流量控制、熔断降级等手段,保护着分布式系统的入口和出口,保障系统的稳定性和可用性。

运用:
Sentinel可以运用于各种分布式系统中,例如微服务架构、SOA架构等。它对系统的各个部分进行流量控制、熔断降级等保护操作,从而提高系统的可用性和稳定性。

定位:
Sentinel主要定位于分布式系统的流量防卫防护组件,它与系统的各个部分集成,对系统的入口和出口进行保护。它不仅提供流量控制、熔断降级等基础功能,还支持自定义策略和插件扩展,可以满足不同场景下的需求。

使用:
Sentinel的使用非常简单,可以通过配置文件或API进行配置和调用。它提供了丰富的统计数据和监控信息,方便用户对系统进行监控和管理。同时,Sentinel还提供了多种语言的客户端库,方便用户进行集成和使用。

API:
Sentinel提供了丰富的API供用户进行自定义策略和插件扩展。它的API包括流量控制、熔断降级、系统调用等各个方面。用户可以通过调用这些API实现自定义的流量控制和熔断降级策略。
Sentinel可以通过这些 API 来设置流量控制规则、获取系统状态、执行流量控制等操作。例如,FlowRuleManager.loadRules() 方法可以加载流量控制规则;SystemStateManager.getBlockQpsInInterval(String resource, Duration interval) 方法可以获取资源在特定时间段内的被限流次数等。

总结:
Sentinel是一个分布式系统的流量防卫防护组件,它通过对分布式系统中的流量进行控制、熔断降级等保护操作,保障系统的稳定性和可用性。它具有简单易用、灵活可扩展等特点,可以适用于各种分布式系统中。


常见的容错思路

​ 要防止雪崩的扩散,我们就要做好服务的容错,容错说白了就是保护自己不被猪队友拖垮的一些措施, 下面介绍常见的服务容错思路和组件。

常见的容错思路

常见的容错思路有隔离、超时、限流、熔断、降级这几种,下面分别介绍一下。

  • 隔离机制: 比如服务A内限制有100个线程, 现在服务A可能会调用服务B,服务C,服务D.我们在服务A进行远程调用的时候,给不同的服务分配固定的线程,不会把所有线程都分配给某个微服务. 比如调用服务B分配30个线程,调用服务C分配30个线程,调用服务D分配40个线程. 这样进行资源的隔离,保证即使下游某个服务挂了,也不至于把服务A的线程消耗完。比如服务B挂了,这时候最多只会占用服务A的30个线程,服务A还有70个线程可以调用服务C和服务D.

在这里插入图片描述

  • 超时机制: 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,

    就断开请求,释放掉线程。

在这里插入图片描述

  • 限流机制: 限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到

    的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。

在这里插入图片描述

  • 熔断机制: 在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整

    体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。

在这里插入图片描述

服务熔断一般有三种状态:

  • 熔断关闭状态(Closed)

服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制

  • 熔断开启状态(Open)

后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法

  • 半熔断状态(Half-Open)

尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预

期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断开启状

态。

  • 降级机制: 降级其实就是为服务提供一个兜底方案,一旦服务无法正常调用,就使用兜底方案。

在这里插入图片描述


Sentinel流量控制规则

在这里插入图片描述

Sentinel具有流控、热点、降级、授权和系统规则保护等功能。

流控是指控制分布式系统的流量,防止系统被过大的流量击垮。Sentinel可以通过设置流量控制阈值,对超过阈值的流量进行限流操作。

热点是指系统中访问频率较高的部分,通常是系统的瓶颈所在。Sentinel可以通过热点限流功能,对热点流量进行限制,避免热点流量过大导致系统崩溃。

降级是指当系统出现故障或响应过慢时,通过降低部分功能或服务的等级,保证整个系统的可用性。Sentinel可以通过降级功能,对故障的服务进行降级处理,避免故障影响整个系统的运行。

授权是指对不同的用户或服务设置不同的访问权限,保证系统的安全性。Sentinel可以通过设置黑白名单规则,对指定的用户或服务进行授权操作。

系统规则保护是指对系统的入口和出口进行保护,防止系统被恶意攻击或滥用。Sentinel可以通过设置系统保护规则,对系统的入口和出口进行防护操作。


sentinel 自定义异常 + @sentinelresources 注解使用

Sentinel 可以通过自定义异常和 @SentinelResource 注解来提供更加灵活的保护机制。

首先,Sentinel 允许用户自定义异常处理类,通过继承 BlockException 类并重写其中的方法,可以定制异常处理逻辑。同时,在定义资源时,可以使用 @SentinelResource 注解来指定异常处理类,以便在发生异常时执行自定义的异常处理逻辑。

  • FlowException 限流异常

  • DegradeException 降级异常

  • ParamFlowException 参数限流异常

  • AuthorityException 授权异常

  • SystemBlockException 系统负载异常

在shop-order-server项目中定义异常返回处理类

package cn.wolfcode.error;
@Component
public class ExceptionHandlerPage implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        response.setContentType("application/json;charset=utf-8");
        ResultData data = null;
        if (e instanceof FlowException) {
            data = new ResultData(-1, "接口被限流了");
        } else if (e instanceof DegradeException) {
            data = new ResultData(-2, "接口被降级了");
        }else if (e instanceof ParamFlowException) {
            data = new ResultData(-3, "参数限流异常");
        }else if (e instanceof AuthorityException) {
            data = new ResultData(-4, "授权异常");
        }else if (e instanceof SystemBlockException) {
            data = new ResultData(-5, "系统负载异常了...");
        }
        response.getWriter().write(JSON.toJSONString(data));
    }
}
@Data
@AllArgsConstructor//全参构造
@NoArgsConstructor//无参构造
class ResultData {
    private int code;
    private String message;
}

其次,@SentinelResource 注解可以用于定义资源并提供可选的异常处理和 fallback 配置项。通过使用 @SentinelResource 注解,用户可以方便地将特定的类、方法或函数定义为资源,并在其中配置异常处理和 fallback 逻辑。这样,在系统运行时,Sentinel 可以自动对这些资源进行保护,确保系统的稳定性和可用性。

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。

其主要参数如下:

属性作用
value资源名称,必需项(不能为空)
entryTypeentry 类型,可选项(默认为 EntryType.OUT
blockHandler/blockHandlerClassblockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback/fallbackClassfallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
1. 返回值类型必须与原函数返回值类型一致;
2.方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
3.fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultFallback默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
1. 返回值类型必须与原函数返回值类型一致;
2. 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
3. defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
exceptionsToIgnore用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

定义限流和降级后的处理方法

直接将限流和降级方法定义在方法中

package cn.wolfcode.controller;
@RestController
@Slf4j
public class AnnoController {
    @RequestMapping("/anno1")
    @SentinelResource(value = "anno1",
            blockHandler="anno1BlockHandler",
            fallback = "anno1Fallback"
    )
    public String anno1(String name){
        if("wolfcode".equals(name)){
            throw new RuntimeException();
        }
        return "anno1";
    }
    public String anno1BlockHandler(String name,BlockException ex){
        log.error("{}", ex);
        return "接口被限流或者降级了";
    }
    //Throwable时进入的方法
    public String anno1Fallback(String name,Throwable throwable) {
        log.error("{}", throwable);
        return "接口发生异常了";
    }
}

Feign整合Sentinel

  1. 在shop-order-server项目的配置文件中开启feign对Sentinel的支持

    feign:
      sentinel:
        enabled: true
    
  2. 创建容错类

    @Component
    public class ProductFeignFallBack implements IProductFeginService {
        @Override
        public Product findByPid(Long pid) {
            Product product = new Product();
            product.setPid(-1L);
            product.setPname("兜底数据");
            product.setPprice(0.0);
            return product;
        }
    }
    
  3. 在feign接口中定义容错类

    @FeignClient(name = "product-service",fallback = ProductFeignFallBack.class)
    public interface ProductFeignApi {
        @RequestMapping("/product/{pid}")
        public Product findByPid(@PathVariable("pid") Long pid);
    }
    
  4. 停止所有 商品服务,重启 shop-order 服务,访问请求,观察容错效果

可能上面的案例并不是特别恰当,我们只是通过案例来演示Feign集成Sentinel实现降级的效果. 接下来我们具体更贴切的案例来讲解Feign降级的作用.

比如我们在购物的时候,查看商品详情页面的时候,里面包含库存信息,商品详情信息,评论信息,这个需求包含的微服务如下:

在这里插入图片描述

假设现在评论服务宕机了,那是不是意味用户发出查看商品请求也无法正常显示了,商品都看不到了,那用户也无法进行下单的操作了. 但是对于用户来说,评论看不到并不影响他购物,所以这时候我们应该对评论服务进行及·降级处理,返回一个兜底数据(空数据),这样用户的查看商品请求能正常显示,只是评论数据看不到而已,这样的话,用户的下单请求也不会受到影响。

面试题:结合Feign后,你在项目中的降级方法中会实现什么样的操作/功能?

  • 记录操作日志,业务日志
  • 尝试重试操作
  • 记录操作失败信息(MQ),方便后续人工介入
  • 异常提示

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

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

相关文章

金属五要素微型气象仪科技小物大智慧

WX-WQX5S 天气是我们生活中不可忽视的一个因素。冷暖交替,阴晴不定,这款金属五要素微型气象仪,让你随时掌握天气变化,成为生活的智者。 一、外观设计 这款气象仪采用金属材质,不仅耐用,而且具有很高的美观…

百度飞浆环境安装

前言: 在安装飞浆环境之前得先把pytorch环境安装好,不过关于pytorch网上教程最多的都是通过Anaconda来安装,但是Anaconda环境安装容易遇到安装超时导致安装失败的问题,本文将叫你如何通过pip安装的方式快速安装,其实这…

Spring Security OAuth2.0 实现分布式系统的认证和授权

Spring Security OAuth2.0 实现分布式系统的认证和授权 1. 基本概念1.1 什么是认证?1.2 什么是会话?1.2.1 基于 session 的认证方式1.2.2 基于 token 的认证方式 1.3 什么是授权?1.3.1 授权的数据模型 1.4 RBAC 介绍 2. Spring Security2.1 S…

AIGC ChatGPT4 生成Python可视化分析

使用Python进行数据分析,代码可以通过ChatGPT4来完成。 例如Prompt: 产品 销量 P1 48 P2 53 P3 82 P4 57 P5 89 P6 86 P7 30 P8 79 P9 96 将上述数据用Python通过可视化的图表来进行展示 完整代码如下: import matplotlib.pyplot as pltpr…

Java19新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17、Java18 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特…

Unity可视化Shader工具ASE介绍——10、ASE实现曲面细分

阿赵的Unity可视化Shader工具ASE介绍目录   大家好,我是阿赵。   之前介绍地面交互的时候,介绍了曲面细分着色器的使用。这个过程,在ASE里面也是可以实现的。关于曲面细分的具体作用,这里就不再重复,如果有兴趣了解…

【Liunx】部署WEB服务:Apache

【Liunx】部署WEB服务:Apache 概述Apache1.介绍2.Apache文件路径3.Apache详解(1)安装Apache(2)启动Apache(3)配置文件a.Apache主配置文件:vim /etc/httpd/conf/httpd.conf信息:b.基于主机头的虚拟主机 (4)开始演示:a.新建两个网站根目录b.分别…

MySQL MVCC机制详解

MySQL MVCC机制详解 MVCC, 是Multi Version Concurrency Control的缩写,其含义是多版本并发控制。这一概念的提出是为了使得MySQL可以实现RC隔离级别和RR隔离级别。 这里回顾一下MySQL的事务, MySQL的隔离级别和各种隔离级别所存在的问题。 事务是由 …

【图论】最小生成树(python和cpp)

文章目录 一、声明二、简介三、代码C代码Python代码 一、声明 本帖持续更新中如有纰漏望指正! 二、简介 (a)点云建立的k近邻图(b)k近邻图上建立的最小生成树 最小生成树 (Minimum Spanning Tree,简称 M…

Python深度数据挖掘之电力系统负荷预测

文章目录 前言1. 案例背景2. 分析目标3. 分析过程4. 数据准备4.1 数据探索4.2 缺失值处理 5. 属性构造5.1 设备数据5.2 周波数据 6. 模型训练7. 性能度量8. 推荐阅读与粉丝福利 前言 本案例将根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功率等情况&am…

机器视觉工程师,实际上调机仔需要居多,不需要那么多会机器视觉开发的,实际上机器视觉公司根本养不起

不要机器视觉开发等着倒闭,要那么多机器视觉开发是想倒闭,根本养不起。 人力对于机器视觉企业来说,仅仅是成本,也可以是剥削利润。当机器视觉公司开发一款标准软件后,意味着什么?技术可以复制,粘…

亚马逊云AI大语言模型应用下的创新Amazon Transcribe的使用

Transcribe简介 语音识别技术,也被称为自动语音识别(Automatic Speech Recognition,简称ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。语音识别技术已…

星宿UI2.51资源付费变现小程序 支持流量主广告投放

目前,最新版的星宿UI是2.51版本。要搭建星宿UI,您需要准备备用域名、服务器和微信小程序账号。星宿UI提供了多项功能,包括文章展示、文章分类、资源链接下载和轮播图等。此外,还支持直接下载附件功能。这些功能使得星宿UI非常适合…

OpenHarmony Promise详解

一,定义 作为一个android开发人员,刚接触Promise可能不好理解,因为android中的异步操作都是开启线程操作或者kotlin的协程,但是Promise并不是单独去开启一个线程来处理异步任务,它是在同一个线程中去处理异步任务。异…

IntelliJ IDEA cmd和idea Terminal查看java版本不一致

参考:IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解决方案 1、idea清缓存重启 没用 2、删除缓存文件 没试 3、修改环境变量的顺序 没试 4、重启电脑 麻烦,没试 5、项目配置jdk7 没试 按照这个url配置了一个遍 https://blog.csdn…

假如我是Langchain专家,你会问什么来测试我的水平

推荐Langchain YouTube 视频排行榜 1. 假如我是Langchain专家,你会问什么来测试我的水平; 作为Langchain专家,您可能需要回答一系列深入和具体的问题,这些问题旨在测试您对Langchain的理解和实际应用能力。以下是一些可能的问题…

机器学习入门案例(3)之使用决策树预测是否适合打网球

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年,我整理了很多IT技术相关的教程给大家&#xff0…

U-Mail海外邮件中继帮您解决企业邮件退信难题

过去一年,国内外形势严峻复杂,但中国外贸顶住压力、爬坡过坎,进出口规模冲破40万亿元大关,高达42万亿元人民币,中国连续6年位居货物贸易第一大国。随着我国疫情防控措进入新阶段,“拼经济”正在成为各地的一…

【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装

CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包,这里以11.7为例。 打开安装包,在安装选项选择自定义模式,点击下一步。 在自定义安装选项中,仅选择CUDA组件(其中Nsight相关组件用于代码调试与性能分析&#xff…