Spring Cloud Alibaba Sentinel 简单使用

Sentinel

  • Sentinel 主要功能
  • Sentinel 作用
  • 常见的流量控制算法
    • 计数器算法
    • 漏桶算法
  • 令牌桶算法
  • Sentinel 流量控制
  • Sentinel 熔断
  • Sentinel 基本使用
    • 添加依赖
    • 定义资源
    • 定义限流规则
    • 定义熔断规则
    • 如何判断熔断还是限流
    • 自定义 Sentinel 异常
      • 局部自定义异常
      • 全局自定义异常
      • 系统自定义异常
    • 使用 Nacos 存储配置
      • 引入依赖
      • 设置配置文件
      • Nacos 中设置配置信息

Sentinel 主要功能

  1. 流量控制: 可以通过配置规则对接口的访问进行限制, 避免因流量过高而导致的系统崩溃.
  2. 服务熔断: 当后端服务不可用或异常时, 可以通过配置熔断规则快速失败并返回错误信息, 避免连锁故障.
  3. 系统负载保护: 根据系统负载情况, 自动控制流量的通过, 防止系统出现过载.
  4. 统计和监控: 提供实时的流量控制和熔断信息统计

Sentinel 作用

  1. 防止雪崩效应: 当访问发生异常时 Sentinel 可以通过熔断机制返回错误信息, 从而防止其他服务也出现故障.
  2. 流量控制: Sentinel 可以通过限流机制, 限制并发请求数量, 来防止突然出现大量请求导致系统过载.
  3. 保护系统稳定性: Sentinel 可以对请求进行限流和熔断, 避免某个服务发生故障从而导致系统不可用.

常见的流量控制算法

计数器算法

计数器算法是在一定时间内记录请求次数, 当超过规定时间后计数器就会清零然后重新开始计算, 当请求超过间隔时间内最大次数时就会拒绝访问
计数器算法的特点是: 实现简单, 但是存在"突刺现象"

漏桶算法

漏桶算法工作原理类似于一个底部有小孔的桶, 无论流入多少水, 流出的速度始终保持恒定. 当桶满时, 新的水会溢出, 即超出的流量被丢弃, 这种算法能够平滑突发流量, 常用于限制数据的传输速度
漏桶算法提供了一种机制, 可以让突发流量被整形, 以便为系统提供稳定的请求. 如: Sentinel 中流量整形(匀速排队功能)
image.png

令牌桶算法

令牌桶算法中, 存在一个固定大小的令牌桶, 该桶会以恒定的速率源源不断地产生令牌, 当系统需要发送数据时, 会从令牌桶中取出一个令牌, 如果桶中没有可用的令牌, 那么该次数据发送就会被限制, 这种机制确保了即使面临突发流量, 系统也能保持稳定运行
image.png
令牌桶算法和漏桶算法的区别是: 漏桶算法是匀速的处理请求, 而令牌桶算法可以应对突发的流量.

Sentinel 流量控制

image.png
流量控制的三种效果:

  1. 快速失败: 当请求触发限流规则后, 会被理解拒绝并抛出 FlowException. 这种方法适用于对系统处理能力确切已知的情况.
  2. 排队等待(匀速通过): 排队等待会控制请求的间隔时间, 让请求稳定并且匀速通过. 这种方法可以用来处理间隔性突发的高流量.
  3. 冷启动(Warm Up): 该方法是通过让流量缓慢增加, 在一定时间内逐渐增加到阈值上限, 从而防止流量突然增加时, 直接把系统拉升到高水位可能瞬间把系统压垮.

Sentinel 熔断

image.png
熔断策略也是三种:

  1. 慢调用比例: 在统计时长内, 如果时间超过最大RT则为慢请求, 如果慢请求超过阈值, 并且请求数量大于最小请求数, 就会触发熔断
  2. 异常比例: 在统计时长内, 如果请求的比例大于阈值, 并且请求数大于最小请求数, 就会触发熔断
  3. 异常数: 在统计时长内, 如果异常数大于阈值, 并且请求数大于最小请求数, 就会触发熔断

Sentinel 基本使用

添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

定义资源

定义资源可通过代码或者注解实现
通过代码方式定义资源:

@RequestMapping("/getid")
public String getId() {try(Entry entry = SphU.entry("getid")) { // 定义资源return "getId: " + new Random().nextInt(100);}catch (BlockException e) {// 当前资源已经被限流或熔断return "被限制";}
}

通过注解方式定义资源:

@SentinelResource(value = "getname", blockHandler = "myBlockHandler")@RequestMapping("/getname")public String getName() throws InterruptedException {Thread.sleep(100);return "getName: " + new Random().nextInt(100);}/*** 限流之后的执行方法* @param blockException* @return*/public String myBlockHandler(BlockException blockException) {if (blockException instanceof FlowException) {return "限流";} else if (blockException instanceof DegradeException) {return "熔断";}return "被限制";}

注意:

  1. myBlockHandler 的返回类型和参数必须和绑定的方法一致, 否则就会报错
  2. myBlockHandler 必须包含 BlockException 参数

@SentinelResource 属性说明

  • value: 资源名称(必填)
  • entryType: 资源调用的流量类型 EntryType.IN/EntryType.OUT(默认)
  • blockHandler: 限流或熔断执行时对应的方法
  • fallback/fallbackClass: 非 BlockException 时, 其他非限流/熔断是异常对应的方法
  • exceptionsToIgnore: 用于指定哪些异常被排除掉, 不好计入异常统计和 fallback 逻辑中

定义限流规则

    private static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("getname"); // 必须, 资源名rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 必须, 限流指标 QPS/线程数rule.setCount(1); // 必须, 限流数量: 上一步线程数或QPS值rules.add(rule);FlowRuleManager.loadRules(rules);}

定义熔断规则

    private static void initDegradeRules() {List<DegradeRule> rules = new ArrayList<>();DegradeRule rule = new DegradeRule();rule.setResource("getname"); // 资源名rule.setGrade(RuleConstant.DEGRADE_GRADE_RT); // 熔断策略rule.setCount(10); // RT值rule.setStatIntervalMs(1000); // 统计时长rule.setSlowRatioThreshold(0.5); // 阈值rule.setMinRequestAmount(1); // 最小请求数rule.setTimeWindow(5); // 熔断时长 单位为秒rules.add(rule);DegradeRuleManager.loadRules(rules);}

如何判断熔断还是限流

if (blockException instanceof FlowException) {return "限流";
} else if (blockException instanceof DegradeException) {return "熔断";
}

自定义 Sentinel 异常

Sentinel 异常分为三种: 局部自定义异常, 全局自定义异常, 系统自定义异常

局部自定义异常

    @SentinelResource(value = "getname", blockHandler = "myBlockHandler")@RequestMapping("/getname")public String getName() throws InterruptedException {Thread.sleep(100);return "getName: " + new Random().nextInt(100);}/*** 限流之后的执行方法* @param blockException* @return*/public String myBlockHandler(BlockException blockException) {if (blockException instanceof FlowException) {return "限流";} else if (blockException instanceof DegradeException) {return "熔断";}return "被限制";}

局部自定义异常只需要创建一个方法然后在@SentinelResource 中设置即可

全局自定义异常

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;/*** 定义 Sentinel 全局自定义异常*/
@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {int code = HttpStatus.TOO_MANY_REQUESTS.value();String msg = "未知异常";if (e instanceof FlowException) {msg = "被限流";} else if (e instanceof DegradeException) {msg = "被熔断";} else if (e instanceof ParamFlowException) {msg = "请求触发了热点限流";} else if (e instanceof AuthorityException) {code = HttpStatus.UNAUTHORIZED.value();msg = "暂无权限";}httpServletResponse.setContentType("application/json;charset=utf-8");httpServletResponse.setStatus(code);httpServletResponse.getWriter().println("{\"code\":" + code + ", \"msg\":\"" + msg +"\"}");}
}

全局自定义异常需要实现 BlockExceptionHandler 接口然后重写 handle 方法

系统自定义异常

如果只配置熔断和限流的情况下配置全局自定义异常即可, 但是配置一些特殊的规则如: 热点规则, 全局自定义异常就不会起作用, 就需要配置系统自定义异常

import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Objects;/*** 自定义系统异常*/
@RestControllerAdvice
public class SystemException {@ExceptionHandler(ParamFlowException.class)public HashMap<String, Object> ParamFlowException(ParamFlowException e) {return new HashMap<>(){{put("code", HttpStatus.TOO_MANY_REQUESTS.value());put("msg", "热点限流");}};}
}

使用 Nacos 存储配置

Sentinel 配置的规则默认存储到内存中, 会随着项目的重启而清空, 所以就需要对这些规则进行持久化配置

引入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

设置配置文件

spring:application:name: sentinel-democloud:sentinel:transport:dashboard: localhost:18080datasource:ds:nacos:server-addr: localhost:8848username: nacospassword: nacosdata-id: ${spring.application.name}-flow-rulesgroup-id: DEFAULT_GROUPdata-type: jsonrule-type: flowds2:nacos:server-addr: localhost:8848username: nacospassword: nacosdata-id: ${spring.application.name}-degrade-demogroup-id: DEFAULT_GROUPdata-type: jsonrule-type: degrade

image.png

Nacos 中设置配置信息

限流:

[{"resource":"/user/getname","limitApp":"default","grade":1,"count":2,"strategy":0,"controlBehavior":0,"clusterMode":false},{"resource":"/user/getid","limitApp":"default","grade":1,"count":2,"strategy":0,"controlBehavior":0,"clusterMode":false}
]

image.png
熔断:

[{"resource":"/user/getname","grade":0,"count":10,"timeWindow":5,"minRequestAmount":1,"statIntervalMs":1000,"slowRationThreshold":0.5
}]

image.png

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

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

相关文章

基于Apache部署虚拟主机网站

文章目录 Apache释义Apache配置关闭防火墙和selinux 更改默认页内容更改默认页存放位置个人用户主页功能基于口令登录网站虚拟主机功能基于ip地址相同ip不同域名相同ip不同端口 学习本章完成目标 1.httpd服务程序的基本部署。 2.个人用户主页功能和口令加密认证方式的实现。 3.…

树与二叉树堆:树

目录 树&#xff1a; 树的概念&#xff1a; 树的相关概念&#xff1a; 1、结点的度&#xff1a; 2、叶节点&#xff1a;度为0的节点 3、非终端节点或分支节点&#xff1a; 4、父节点和子节点&#xff1a; 5、兄弟节点&#xff1a; 6、树的度&#xff1a; 7、树的层次或…

JS--localStorage设置过期时间的方案(有示例)

原文网址&#xff1a;JS--localStorage设置过期时间的方案(有示例)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用localStorage设置数据的过期时间。 问题描述 localStorage是不支持设置过期时间的&#xff0c;cookie虽然支持设置过期时间但它存的数据量很小。所…

Deep Learning for Monocular Depth Estimation: A Review.基于深度学习的深度估计

传统的深度估计方法通常是使用双目相机&#xff0c;计算两个2D图像的视差&#xff0c;然后通过立体匹配和三角剖分得到深度图。然而&#xff0c;双目深度估计方法至少需要两个固定的摄像机&#xff0c;当场景的纹理较少或者没有纹理的时候&#xff0c;很难从图像中捕捉足够的特…

网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪

01 字节跳动 招聘岗位&#xff1a;网络虚拟化高级研发工程师 职责描述&#xff1a; 1、负责字节跳动虚拟网络产品的研发&#xff0c;包括但不局限于网络VPC、NAT、LB负载均衡等&#xff1b; 2、负责字节跳动网络基础平台的研发&#xff0c;包括但不局限于网络控制面系统、容器…

如何通过算法模型进行数据预测

当今数据时代背景下更加重视数据的价值&#xff0c;企业信息化建设会越来越完善&#xff0c;越来越体系化&#xff0c;以数据说话&#xff0c;通过数据为企业提升渠道转化率、改善企业产品、实现精准运营&#xff0c;为企业打造自助模式的数据分析成果&#xff0c;以数据驱动决…

Sentinel 系统规则 (SystemRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

Nacos介绍与使用

Nacos介绍与使用 文章目录 Nacos介绍与使用一. 什么是Nacos1 Nacos功能1.1 配置中心1.2 注册中心 2.为什么要使用Nacos 二.Nacos 部署安装1. Nacos 部署方式2. Nacos 安装3. 配置数据源4. 开启控制台授权登录&#xff08;可选&#xff09; 三. Nacos配置中心的使用1. 创建配置信…

2023年【T电梯修理】考试题及T电梯修理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理考试题是安全生产模拟考试一点通总题库中生成的一套T电梯修理考试报名&#xff0c;安全生产模拟考试一点通上T电梯修理作业手机同步练习。2023年【T电梯修理】考试题及T电梯修理考试报名 1、【多选题】GB/T1…

红队攻防之Goby反杀

若结局非我所愿&#xff0c;那就在尘埃落定前奋力一搏。 本文首发于先知社区&#xff0c;原创作者即是本人 一、弹xss 为了方便&#xff0c;本次直接使用 PhpStudy 进行建站&#xff0c;开启的web服务要为MySQLNginx&#xff0c;这里的 PhpStudy 地址为 http://x.x.x.x&…

Hibernate 一级缓存,二级缓存,查询缓存

概念&#xff1a; 1.什么是缓存呢&#xff1f; 缓存&#xff1a;是计算机领域的概念&#xff0c;它介于应用程序和永久性数据存储源之间。 缓存&#xff1a;一般人的理解是在内存中的一块空间&#xff0c;可以将二级缓存配置到硬盘。用白话来说&#xff0c;就是一个存储数据的…

Web前端—移动Web第三天(移动Web基础、rem、less、综合案例—极速问诊)

版本说明 当前版本号[20231120]。 版本修改说明20231120初版 目录 文章目录 版本说明目录移动 Web 第三天01-移动 Web 基础谷歌模拟器屏幕分辨率视口二倍图适配方案 02-rem简介媒体查询rem 布局flexible.jsrem 移动适配 03-less注释运算嵌套变量导入导出禁止导出 04-综合案例…

GNSS技术在灾害监测与应急响应中的关键作用

全球导航卫星系统&#xff08;GNSS&#xff09;技术在灾害监测与应急响应领域发挥着重要作用&#xff0c;为预防、监测和应对自然灾害提供了关键数据支持。本文将深入探讨GNSS技术在灾害监测与应急响应中的作用&#xff0c;并分析其对提高应对灾害能力的重要性。 一、GNSS在灾害…

InnoDB 的一次更新事务是怎么实现的?

大体流程&#xff1a; 步骤: 1.加载数据到缓存中&#xff08;Buffer Pool&#xff09;&#xff1a; 在进行数据更新时&#xff0c;InnoDB首先会在缓冲池&#xff08;Buffer Pool&#xff09;中查找该记录是否已经在内存中。如果记录不在内存中&#xff0c;会将需要更新的数据…

2021年03月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 小猫在沙漠中旅行好不容易找到了一杯水,初始位置如下图所示,下面哪个程序可以帮助它成功喝到水? A: B: C: D:

基于像素特征的kmeas聚类的图像分割方案

kmeans聚类代码 将像素进行聚类&#xff0c;得到每个像素的聚类标签&#xff0c;默认聚类簇数为3 def seg_kmeans(img,clusters3):img_flatimg.reshape((-1,3))# print(img_flat.shape)img_flatnp.float32(img_flat)criteria(cv.TERM_CRITERIA_MAX_ITERcv.TERM_CRITERIA_EPS,2…

stack和queue简单实现(容器适配器)

容器适配器 stack介绍stack模拟实现queue 介绍queue模拟实现deque stack介绍 stack模拟实现 以前我们实现stack&#xff0c;需要像list,vector一样手动创建成员函数&#xff0c;成员变量。但是stack作为容器适配器&#xff0c;我们有更简单的方法来实现它。 可以利用模板的强大…

练习六-使用Questasim来用verilog使用function函数

[TOC](使用Questasim来用verilog使用function函数 1&#xff0c;verilog中使用函数function2&#xff0c;RTL代码3&#xff0c;测试代码4&#xff0c;输出波形 1&#xff0c;verilog中使用函数function 目的&#xff1a; &#xff08;1&#xff09;了解函数的定义和在模块设计中…

【面试】测试/测开(未完成版)

1. 黑盒测试方法 黑盒测试&#xff1a;关注的是软件功能的实现&#xff0c;关注功能实现是否满足需求&#xff0c;测试对象是基于需求规格说明书。 1&#xff09;等价类&#xff1a;有效等价类、无效等价类 2&#xff09;边界值 3&#xff09;因果图&#xff1a;不同的原因对应…

日常办公:批处理编写Word邮件合并获取图片全路径

大家在使用Word邮件合并这个功能&#xff0c;比如制作席卡、贺卡、准考证、员工档案、成绩单、邀请函、名片等等&#xff0c;那就需要对图片路径进行转换处理&#xff0c;此脚本就是直接将图片的路径提取出来&#xff0c;并把内容放到txt格式的文本文档里&#xff0c;打开Excel…