Spring Cloud Alibaba Sentinel 熔断降级与OpenFeign整合

news2024/11/26 3:31:38

熔断降级

概述

对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。

重要的是:熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

熔断降级规则参数

熔断降级规则由 DegradeRule 对象定义,其主要参数如下:

Field说明默认值
resource资源名,即规则的作用对象
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值慢调用比例模式下,它表示以毫秒为单位的最大响应时间(RT)。
在异常比率模式中,它表示介于0.0和1.0之间的异常比率。
在异常计数模式下,它表示异常计数
timeWindow熔断时长,单位为 s默认为0,为0不会进入熔断
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)1.0D

熔断策略

grade 的取值有如下几种:

慢调用比例 (RuleConstant.DEGRADE_GRADE_RT值为0):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

异常比例 (RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO值为1):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

异常数 (RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT值为2):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

注意

异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:

Entry entry = null;
try {
 entry = SphU.entry(resource);

 // Write your biz code here.
 // <<BIZ CODE>>
} catch (Throwable t) {
 if (!BlockException.isBlockException(t)) {
   Tracer.trace(t);
 }
} finally {
 if (entry != null) {
   entry.exit();
 }
}

开源整合模块,如 Sentinel Dubbo Adapter, Sentinel Web Servlet Filter 或 @SentinelResource 注解会自动统计业务异常,无需手动调用。

熔断降级事件监听

// name是监听的
EventObserverRegistry.getInstance().addStateChangeObserver("name",
    (prevState, newState, rule, snapshotValue) -> {
            // prevState:断路器的先前状态
            // newState:断路器的新状态
            // rule:关联规则
            // snapshotValue:断路器打开时的触发值(如果新状态为CLOSED或HALF_OPEN,则为空,反之新出发值为OPEN则有值)
    });

断路器的状态说明

  • OPEN:OPEN状态所有请求都将被拒绝。直到熔断时间结速。
  • HALF_OPEN:如果符合熔断规则,将进入OPEN状态,如果不符合熔断规则,则进入CLOSE状态
  • CLOSE:允许所有请求。

与OpenFeign整合

添加依赖

我们在上面说的,熔断降级一般在客户端使用,我们的OpenFeign其实就是客户端,Sentinel提供了对OpenFeign的注解的支持,只需引入相关依赖即可:

        <!-- 添加OpenFeign依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!-- 添加Sentinel依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- 添加Sentinel DataSource Nacos依赖 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.6</version>
        </dependency>

增加配置

# 开启 Sentinel 对 Feign 的支持
feign.sentinel.enabled=true

此设置默认为false。即便设置了@FeignClient 的 fallback 也不会生效

OpenFeign 客户端示例

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "myCloud",fallback = SentinelFeignClient.Fallback.class)
public interface SentinelFeignClient {

    @RequestMapping("/myCloud/conf/getCommonConf")
    String getCommonConf();

    @Component
    class Fallback implements SentinelFeignClient{
        @Override
        public String getCommonConf() {
            return "熔断降级";
        }
    }

}

此示例请求了我们 Spring Cloud alibaba 使用Nacos服务发现 一文中的服务名为 myCloud 的 Provider 集群。

SentinelFeignClient.Fallback.class 为OpenFeign的熔断处理类,其实现规则如下:

  • 实现 @FeignClient 注解的接口
  • 实现接口的方法即为熔断时执行的方法。
  • @Component为必须的,是将Fallback 注册为Bean。
  • fallback还有FallbackFactory的方式来实现(此处不做讲解了)

此处我们除了添加fallback,好像没有定义资源。在Spring Boot 和 Spring Cloud 环境下Sentinel 会自动将我们的url定义为资源,所以我们可以不用使用@SentinelResource 来定义url接口为资源。

Feign 对应的接口中的资源名策略定义:httpmethod:protocol://requesturl。@FeignClient 注解中的所有属性,Sentinel 都做了兼容。我们上面的OpenFeign示例,资源名称对应为:GET:http://myCloud/myCloud/conf/getCommonConf

初始化配置持久化Rule规则

import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreaker;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.EventObserverRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.nacos.api.PropertyKeyConst;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Properties;

@Component
public class SentinelRuleInit {

   @PostConstruct
   public void init(){
       Properties nacosPro = new Properties();
       nacosPro.put(PropertyKeyConst.SERVER_ADDR,"127.0.0.1:8848");

       // remoteAddress 代表 Nacos 服务端的地址
       // groupId 和 dataId 对应 Nacos 中相应配置
       ReadableDataSource<String, List<DegradeRule>> degradeRuleDataSource =
               new NacosDataSource<>(nacosPro, "Sentinel_Demo_Group", "com.yyoo.sentinel.demo.DegradeRule",
                       source -> JSON.parseObject(source, new TypeReference<List<DegradeRule>>(){}));
       DegradeRuleManager.register2Property(degradeRuleDataSource.getProperty());

       EventObserverRegistry.getInstance().addStateChangeObserver("logging",(prevState, newState, rule, snapshotValue)->{
           // prevState:断路器的先前状态
           // newState:断路器的新状态
           // rule:关联规则
           // snapshotValue:断路器打开时的触发值(如果新状态为CLOSED或HALF_OPEN,则为空)
           if(newState.equals(CircuitBreaker.State.OPEN)){
               System.out.println("断路器进入熔断状态");
           }else if(newState.equals(CircuitBreaker.State.HALF_OPEN)){
               System.out.println("断路器进入半熔断状态");
           }else if(newState.equals(CircuitBreaker.State.CLOSED)){
               System.out.println("断路器进入正常状态");
           }
       });
   }

}

Nacos中熔断规则的设置

[{
    "resource" : "GET:http://myCloud/myCloud/conf/getCommonConf",
    "grade": "2",
    "count": "5",
    "timeWindow":"10",
    "statIntervalMs":"60000"
},{
    "resource" : "GET:http://myCloud/myCloud/conf/getCommonConf",
    "grade": "0",
    "count": "2000",
    "timeWindow":"10",
    "statIntervalMs":"60000",
    "slowRatioThreshold":"0.8"
}]

在这里插入图片描述

此处我们为同一个资源设置了两个熔断规则配置

  1. 异常数模式,异常数达到5开启熔断,熔断时长为10s,统计时间为60000ms=1分钟
  2. 慢调用比例模式,RT超过2000ms视为慢调用,熔断时长为10s,统计时间为1分钟,慢调用比例超过80%开启熔断。

注:此处的熔断规则为我们的测试规则,在你的实际生产代码中请按你自己的应用需求进行相关设置。

验证示例

在Provider接口中抛出相应异常或者休眠足够的时长,即可验证我们示例中的两个熔断规则。详细的验证方案此处就不再赘述了。

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

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

相关文章

关于基线长度对双天线GNSS测姿精度的影响

文章目录一、GNSS测姿原理1. 载波相位双差求解基线向量2. GNSS姿态角表示二、基线长度对GNSS测姿精度的影响三、GNSS定向产品精度描述实例四、参考文献在GNSS定向模块或者板卡的指标参数中&#xff0c;我们一般会看到航向的测量精度和基线的长度相关。在实际使用&#xff0c;用…

Python if else条件语句详解

在刚学习 Python 的时候&#xff0c;我们看到的代码都是顺序执行的&#xff0c;也就是先执行第1条语句&#xff0c;然后是第2条、第3条……一直到最后一条语句&#xff0c;这称为顺序结构。 但是对于很多情况&#xff0c;顺序结构的代码是远远不够的&#xff0c;比如一个程序限…

BERT在CNN上也能用?看看这篇ICLR Spotlight论文丨已开源

如何在卷积神经网络上运行 BERT&#xff1f;你可以直接用 SparK —— 字节跳动技术团队提出的提出的稀疏层次化掩码建模 ( Designing BERT for Convolutional Networks: Sparse and Hierarchical Masked Modeling )&#xff0c;近期已被人工智能顶会 ICLR 2023 收录为 Spotligh…

论文投稿指南——中文核心期刊推荐(植物保护)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

JavaScript原型、原型链、原型方法

文章目录原型和原型链prototype、 __ proto __ 、constructor原型链原型方法instanceOfhasOwnPropertyObject.create()、new Object()总结原型和原型链 prototype、 __ proto __ 、constructor 首先我们看下面一段代码 // 构造函数Personfunction Person(name, age) {this.na…

无法访问org.springframework.boot.SpringApplication

问题 更新idea版本后使用过程中发生下面的错误 Error:(3, 32) java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: D:\maven-repository\org\springframework\boot\spring-boot\3.0.0\spring-boot-3.0.0.jar(org/springframework/boot/SpringApplicati…

【ChatGPT】如何使用python调用ChatGPT API?

是什么ChatGPT&#xff1f; ChatGPT 是由 OpenAI 开发的一个语言模型。OpenAI 是一家领先的人工智能研究机构。ChatGPT 基于变换器架构&#xff0c;使用深度学习生成会话风格的文本。该模型在大量文本数据上进行训练&#xff0c;并可以针对特定任务进行微调。例如&#xff0c;它…

2023年,产业互联网八大趋势

从全世界的TO B发展线来看&#xff0c;中国的TO B企业不是脚步最快的&#xff0c;但它们却也正在通过汲取中国数字经济高速发展的养料不断成长&#xff0c;同时主动下沉&#xff0c;成为新的产业数字化的底盘&#xff0c;做撑举起未来数字中国的无名力量。 作者|皮爷 出品|…

UDS 诊断

UDS全称为Unified Diagnostic Services&#xff0c;统一的诊断服务。由ISO-14229系列标准定义。 诊断通信的过程从用户角度来看非常容易理解&#xff0c;诊断仪发送诊断请求(request)&#xff0c;ECU给出诊断响应&#xff08;response&#xff09;&#xff0c;而UDS就是为不同…

1.9实验9:配置虚链路

1.4.4实验9:配置虚链路 实验目的(1) 实现OSPF 虚链路的配置 (2) 描述虚链路的作用 实验拓扑配置虚链路实验拓扑如图1-19所示。[1] 图1-19 配置虚链路 实验步骤

第2集丨Java中的数据类型汇总

目录一、数据类型分类二、基本数据类型取值范围数据类型的转换byte和char的关系三、包装类一、数据类型分类 二、基本数据类型 取值范围 比特(bit位) : 数据运算得最小存储单位字节(byte) : 数据最小存储单位bit和byte可以互相转换得&#xff0c;1 byte 8 bit位默认情况下&am…

2023开学季哪款电容笔值得买?高品质电容笔品牌推荐

我们可以看出&#xff0c;原先的苹果电容笔的价格卖得非常昂贵。事实上&#xff0c;对于那些没有过多预算的人来说&#xff0c;平替电容笔是最好的选择。想象一下&#xff0c;一款原装的苹果电容笔&#xff0c;能够购买四款平替电容笔&#xff0c;而平替电容笔在性能上&#xf…

修改windows系统网卡的MAC地址方法

文章目录前言修改MAC地址验证MAC地址是否修改前言 工作中遇到通过绑定IP地址和MAC地址认证才能上网的网络&#xff0c;需要修改指定的IP地址和MAC地址&#xff0c;修改IP地址比较简单&#xff0c;但是MAC地址之前好像没有改过&#xff0c;浅浅的记录一下 修改MAC地址 首先打…

MicroApp初探

微前端 微前端是一种类似于微服务的架构&#xff0c;它将微服务的理念应用于浏览器端&#xff0c;即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用还可以独立运行、独立开发、独立部署。微前端架构与框架无关&#xff0c;每个微应用都可以使…

VMware虚拟机安装部署CentOS7+Moba远程连接+克隆(步骤)

使用VMware部署centos7操作系统 1. 打开VMware点击“创建新的虚拟机” 2.按提示逐步选择 选择NAT模式&#xff08;只要电脑能联网&#xff0c;虚拟机就能联网&#xff09; 磁盘存为单个文件 点击“使用iso映像文件”&#xff0c;选择已经下载好的镜像文件。 &#xff08;虚…

火爆全网的ChatGPT对话数据可视化,分析数据可视化的应用和发展

ChatGPT为一款由OpenAI开发的人工智能聊天软件。2022年11月30日上映。截至2023年1月底&#xff0c;其月活跃用户超过1亿&#xff0c;是有史以来增长最快的消费应用。今年AIGC&#xff08;是指利用人工智能技术来生成内容&#xff09;频繁出圈&#xff0c;先是一个基于diffusion…

【转载】Visual Studio 下载进度很慢甚至不动怎么办?

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/566305175 现在越来越多的人投身到计算机行业成为了一名码农&#xff0c;对于一个合格的码农来说能熟练的使用Visual Studio&#xff0c;Visual Studio code,idea等是很重要的&#xff0c;也有很多人在软件下载方面就遇到了难…

python【os模块文件读写操作】超详细

一、os 模块是什么&#xff1a;os 模块是python 标准库中整理文件和目录最为常用的模块&#xff0c;该模块提供了非常丰富的方法用来处理文档和目录二、认识文件路径分隔符&#xff1a;- 路径表示"\"在windows操作系统中表示区分文件的存储路径层级关系比如&#xff…

2022爱分析 · DataOps厂商全景报告 | 爱分析报告

报告编委 李喆 爱分析合伙人&首席分析师 廖耘加 爱分析分析师 目录 1. 研究范围定义 2. 市场洞察 3. 厂商全景地图 4. 市场分析与厂商评估 5. 入选厂商列表 1. 研究范围定义 研究范围 在后疫情时代&#xff0c;以数据分析为代表的数据消费场景日益丰富&…

Linux 用户讲解

目录 Linux 用户介绍 Linux用户类型 UID 用户组ID Linux 用户相关命令 id 查看用户信息 useradd 创建新的用户账户 groupadd 创建新的用户组 usermod 修改用户的属性 passwd 修改用户的密码、过期时间等 userdel 删除用户 通过文件的方法新建、编辑用户 /etc/p…