首页 > 其他分享 >Sentinel基础使用

Sentinel基础使用

时间:2024-03-18 20:00:13浏览次数:20  
标签:请求 spring 基础 nacos sentinel 熔断 使用 Sentinel cloud

1. 概念解释


	限流:对并发访问进行限速。
	限流的一些行为:  1. 拒绝服务:将多余的请求直接拒绝掉
					2.服务降级:降级甚至关闭后台的某些服务
					3.特权请求:在多租户或者对用户进行分级时,考虑让特权用户进行访问
					4.延时处理:可以利用队列把请求进行缓存




	熔断:在分布式系统中,往往需要依赖下游服务,不管是内部系统还是第三方服务。如果下游服务出现问题,此时还盲目请求的话,会失败很多次还是会傻傻去请求,去等待,增加了整个链路的请求时间。
	熔断模式可以防止应用程序不断尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误。熔断模式最牛在于能让应用程序自我诊断下游系统的错误是否已经修正,如果没有,不放量去请求,如果请求成功了,慢慢增加请求,再次尝试调用。比如说A服务调用B服务,B服务是下游的服务提供,或者是第三方服务,容易发生问题。这样既能防止不断的调用,是下游服务更坏,保护了下游方,还能降低自己的执行成本,快速的响应,减少延迟,增加吞吐量。

	降级:为了解决资源不足和访问量增加的矛盾。在有限的资源情况下,为了能抗住大量的请求,就需要对系统做一些牺牲,放弃一些功能,来保证整个系统正常运行。

2. 常见限流算法


  1. 静态窗口限流:限制每秒内请求的数量
  2. 动态窗口限流:限制当前时间1s内请求的数量。例如当前是2.5秒,静态:统计第2秒到现在的请求数;动态:统计第1.5秒到现在的请求数
  3. 漏桶限流:将请求全部放入桶中,使用队列的形式进行消费,会控制消费的速度。(进来的时候可以大流量地接收,出去的时候可以匀速出去)
  4. 令牌桶限流:令牌桶中存放的是令牌,会有一个产生令牌的程序,每秒产生多少个令牌,放入桶中,如果满了,则不再放了。取令牌:每过来一个请求,就取一个令牌,如果取不到令牌,则该请求就会失败
  5. 令牌大闸:在令牌桶的基础上进行控制,一次性产生N个令牌,产生完之后便不再生成。

3. Sentinel基础使用


限流是作用于被调用方,熔断是作用于调用方
Sentinel的使用主要包含两部分:

  1. 核心库:不依赖任何框架/库,能够运行于java8以及以上的版本的运行环境
  2. 控制台:主要负责管理推送规则、监控、管理机制消息等。

Sentinel控制台(github主页有)是一个标准的Springboot应用,以SpringBoot的形式来运行jar包即可,该程序以8080端口运行,打开页面之后账户和密码均为sentinel

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

程序中引入sentinel

  1. 引入依赖:使用的是Spring-Cloud-alibaba
<!-- 限流熔断 -->  
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>  
</dependency>
  1. 定义资源:
    为某个接口加入注解
@SentinelResource("doConfirm")  
public void doConfirm(ConfirmOrderDoReq req){XXX};
  1. 定义规则:使用代码的方式定义规则
    在该模块中定义规则并进行启动
@SpringBootApplication  
@MapperScan("com.monster.business.mapper")  
@ComponentScan("com.monster")  
@EnableFeignClients("com.monster.business.feign")  
@EnableCaching  
public class BusinessApplication {  
  
    private static final Logger LOG= LoggerFactory.getLogger(BusinessApplication.class);  
  
    public static void main(String[] args) {  
        SpringApplication app=new SpringApplication(BusinessApplication.class);  
        Environment env=app.run(args).getEnvironment();  
        LOG.info("启动成功!");  
        LOG.info("地址:\thttp://127.0.0.1:{}{}",env.getProperty("server.port"),env.getProperty("server.servlet.context-path"));  
        initFlowRules();  
        LOG.info("已定义限流规则");  
    }  
  
    private static void initFlowRules(){  
        List<FlowRule> rules = new ArrayList<>();  
        FlowRule rule = new FlowRule();  
        rule.setResource("doConfirm");  
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);  
        // Set limit QPS to 20.  
        rule.setCount(1);  
        rules.add(rule);  
        FlowRuleManager.loadRules(rules);  
    }  
  
}

此时QPS为1,每秒只允许1个请求到达。
所以其他线程的请求就会得到sentinel报出的错误,但是这样不太正常,可以省略这些报错,相应处理如下:

//当被拦截的请求不会执行doConfirm方法,但会去执行doConfirmBlock
@SentinelResource(value="doConfirm",blockHandler = "doConfirmBlock")  
public void doConfirm(ConfirmOrderDoReq req){XXX};

doConfirmBlock方法的定义(返回值也需要一致),参数是有限制的。参数需要和doConfirm方法参数一样的基础上,再加一个BlockException e

public void doConfirmBlock(ConfirmOrderTicketReq req, BlockException e){  
    LOG.info("购票请求被限流:{}",req);  
    throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_FLOW_EXCEPTION);  
}

4. Sentinel控制台&&使用sentinel进行限流


应用与控制台进行交互:在yml文件中进行配置

spring:
	cloud:  
	  sentinel:  
	    transport:  
	      port: 8719  //sentinel启动的固定端口
	      dashboard: localhost:8080  //sentinel-dashboard启动的端口

可以在簇点链路中加入流控规则
![[Pasted image 20240318143230.png]]

但是控台不保存规则,一旦应用重启,之前设置的规则就全部消失

5. Sentinel+Nacos实现限流规则持久化


  1. 引入依赖
<!-- sentinel + nacos -->  
<dependency>  
    <groupId>com.alibaba.csp</groupId>  
    <artifactId>sentinel-datasource-nacos</artifactId>  
</dependency>
  1. 在Business模块增加配置,客户端和nacos做一个关联
    下面的属性需要与nacos中的配置一一对应
spring.cloud.sentinel.datasource.nacos.nacos.serverAddr=127.0.0.1:8848  
spring.cloud.sentinel.datasource.nacos.nacos.namespace=train  
spring.cloud.sentinel.datasource.nacos.nacos.groupId=TRAIN_GROUP  
spring.cloud.sentinel.datasource.nacos.nacos.dataId=sentinel-business-flow  
spring.cloud.sentinel.datasource.nacos.nacos.ruleType=flow
  1. 配置nacos
    ![[Pasted image 20240318150732.png]]

6. Sentinel限流不同的流控效果-Warm Up


默认为快速失败,还有Warm up和排队等待

Warm up效果:coldFactor即为请求QPS从(阈值/3)开始,经过多少预热时长才逐渐升值设定的QPS阈值,比如阈值是100,时长为10秒,则从33开始经过10秒上升到100

![[Pasted image 20240318160425.png]]

设置一个测试类

@RestController  
public class TestController {  
  
    @SentinelResource("hello")  
    @GetMapping("/hello")  
    public String hello()throws InterruptedException{  
        return "Hello World! Business!";  
    }  
}

改变配置文件

spring.cloud.sentinel.datasource.flow.nacos.serverAddr=127.0.0.1:8848  
spring.cloud.sentinel.datasource.flow.nacos.namespace=train  
spring.cloud.sentinel.datasource.flow.nacos.groupId=DEFAULT_GROUP  
spring.cloud.sentinel.datasource.flow.nacos.dataId=sentinel-business-flow  
#flow表示限流  
spring.cloud.sentinel.datasource.flow.nacos.ruleType=flow

在Nacos中配置一个名为sentinel-business-flow 的配置文件

[
{
// 资源名称
"resource": "hello",
//针对来演
"limitApp": "default",
// 按照QPS模式
"grade": "1",
//阈值为10
"count": 10,
// 策略为直接放弃
"strategy": 0,
// 流控模式为1即Warm Up
"controlBehavior": 1,
// 预热时长为2s
"warmUpPeriodSec": 2,
// 集群模式
"clusterMode": false
}
]

一开始的QPS为3,然后慢慢增长到10。这就是预热的效果
![[Pasted image 20240318163025.png]]

7. Sentinel限流不同的流控效果-排队等待


排队等待需要设置一个排队等待时间,默认为500ms。
接收到的(超过阈值的)请求,会进行排队等待,如果在500ms内能够接收请求的话就处理,否则就拒绝
![[Pasted image 20240318163215.png]]

相应的配置文件内容为:设置超时时间为1000ms即1s

[
{
"resource": "hello",
"limitApp": "default",
"grade": "1",
"count": 10,
"strategy": 0,
"controlBehavior": 2,
"maxQueueingTimeMs": 1000,
"clusterMode": false
}
]

设置20个线程去请求,理论上来说是第一秒处理10个请求,然后10个请求进行排队等待,在第二秒进行处理

8. Sentinel+Feign熔断


调用方:Batch模块
被调用方:Business模块的Hello接口

当被调用方不稳定时,调用方会启动备用方案,这就是熔断

为Batch模块加入相关依赖,并进行配置,degrade表示熔断降级的意思

spring.cloud.sentinel.transport.port=8719  
spring.cloud.sentinel.transport.dashboard=localhost:8080  
spring.cloud.sentinel.datasource.degrade.nacos.serverAddr=127.0.0.1:8848  
spring.cloud.sentinel.datasource.degrade.nacos.namespace=train  
spring.cloud.sentinel.datasource.degrade.nacos.groupId=DEFAULT_GROUP  
spring.cloud.sentinel.datasource.degrade.nacos.dataId=sentinel-batch-degrade  
#flow表示限流  
spring.cloud.sentinel.datasource.flow.nacos.ruleType=degrade
# sentinel默认不监控feign,需要配置  
feign.sentinel.enabled=true  
# 上面改为true后,启动会报注入错误,需要改成懒加载  
spring.cloud.openfeign.lazy-attributes-resolution=true

Batch模块远程调用代码为

@Resource  
BusinessFeign businessFeign;  
  
@GetMapping("/hello")  
public String hello() {  
    String businessHello = businessFeign.hello();  
    LOG.info(businessHello);  
    return "Hello World! Batch! " + businessHello;  
}

Batch的nacos配置代码为:

[{
"resource": "GET:http://business/business/hello",
"grade": 0,
"count": 201,
"timeWindow": 11,
"minRequestAmount": 6,
"statIntervalMs": 1000,
"slowRatioThreshold": 0.3
}]

对应的熔断规则如下图所示:
最大RT:表示响应时间,如果响应时间大于201ms,当有百分之三十的请求响应时间大于201ms时出发熔断
熔断时长:表示触发熔断之后,后面的11秒所有的请求会抛出
最小请求数:一秒内必须要超过6个请求时,才会进行熔断判断
统计时长:在多少ms之内进行统计
![[Pasted image 20240318192706.png]]

当请求参数如下时不会发生熔断
![[Pasted image 20240318193751.png]]

当请求参数如下时,会发生熔断
![[Pasted image 20240318193859.png]]

![[Pasted image 20240318193924.png]]

9. Sentinel+Feign熔断后降级处理


当熔断之后,进行降级处理;在FeignClient注解上加上fallback,就是说其降级处理是BusinessFeignFallback.class

@FeignClient(value = "business", fallback = BusinessFeignFallback.class)  
public interface BusinessFeign {  
  
    @GetMapping("/business/admin/daily-train/gen-daily/{date}")  
    CommonResp<Object> genDaily(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date date);  
  
    @GetMapping("/business/hello")  
    String hello();  
  
}
@Component  
public class BusinessFeignFallback implements BusinessFeign {  
    @Override  
    public String hello() {  
        return "Fallback";  
    }  
  
    @Override  
    public CommonResp<Object> genDaily(Date date) {  
        return null;  
    }  
}

远程调用的hello方法定义

@SentinelResource("hello")  
@GetMapping("/hello")  
public String hello()throws InterruptedException{  
    return "Hello World! Business!";  
}

10. 熔断策略


异常比例策略:

比例阈值:0-1之间,
最小请求数:当每秒钟的请求数大于6时
当出现异常的请求数大于比例阈值时会进行熔断,熔断时间为3秒
![[Pasted image 20240318194650.png]]

异常数:

区别在于异常数和比例阈值,在异常数策略中,只要异常请求达到3个便会触发熔断
![[Pasted image 20240318195352.png]]

标签:请求,spring,基础,nacos,sentinel,熔断,使用,Sentinel,cloud
From: https://blog.csdn.net/weixin_45440755/article/details/136819573

相关文章

  • 前端基础之HTTP协议介绍
    HTTP协议介绍HTTP协议(HyperTextTransferProtocol,超文本传输协议),用来规定服务端和浏览器之间的数据交互的格式,也是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。该协议构建于TCP/IP协议族之上,属于应用层协议。主要用于传输与超文本相关的资源文件......
  • 【nload】nload的安装和使用
    目录一、nload介绍二、nload下载和安装安装依赖环境远程下载nload安装包解压文件编译安装三、命令用法参数实例:运行nload之后,可以使用的快捷键:一次显示多个设备,不显示流量图设置计算时间窗口的长度(以秒为单位)设置显示的刷新间隔(以毫秒为单位,默认值为500)一、n......
  • Docker部署Django项目——基础
    1.服务器配置1.1centos7系统的安装centos-7-isos-x86_64安装包下载)VMware安装自定义配置选择对应的系统镜像一般选择内核4核、内存8g、硬盘80g相关配置1.2.网络配置1.2.1查看win电脑虚拟机VMnet8的ip使用ipconfig查看虚拟机的ip1.2.2配置虚拟机VMne......
  • 数学建模--MATLAB基本使用
    1.线性方程组这个是一个线性方程组(属于线性代数的范畴),Ax=b类型的方程,如果使用MATLAB进行求解,就需要分别表示A矩阵(线性方程组未知数前面的系数),b矩阵(表示等式右边的结果),inv是这个软件里面的一个函数,用来进行求解A的逆矩阵,因为Ax=b,那么x=A-1次方乘上b另外,我们也可以使用这个......
  • 新人基础笔记css的文本属性及字体样式
    css的字体属性 1.字体系列CSS使用font-family属性定义文本的字体系列。语法:p{font-family:“微软雅黑”;}div{font-family:Arial,“MicrosoftYahei”,"微软雅黑";}各种字体之间必须使用英文状态下的逗号隔开一般情况下,如果有空格隔开的多个单词组成的字体,加引号......
  • Kotlin 协程基础使用学习
    原文:Kotlin协程基础使用学习-Stars-One的杂货小窝本篇阅读可能需要以下知识,否则可能阅读会有些困难客户端开发基础(Android开发或JavaFx开发)Java多线程基础kotlin基础本文尽量以使用为主,以代码为辅讲解,不提及过深协程底层代码逻辑,仅做一个基础入门来快速上手学习......
  • My97DatePicker日期插件WdatePicker.js的使用方法
    原文链接:https://blog.csdn.net/honghailiang888/article/details/51384929一、先来最简单的配置方法:(1)下载WdatePicker.js(包括lang和skin文件夹)。(2)在html页面中导入WdatePicker.js。//同时引入了WdatePicker.css文件(3)在输入框input元素上加入class="Wdate"onFocus="WdatePic......
  • mysql索引(索引失效,遵循最左前缀,使用1.全值匹配 2.覆盖索引,失效:索引加函数,范围查询右边
    1.遵循联合索引最左列原则当表中创建了一个联合索引idx_name_age_position案例演示1.当我们在执行sql语句:以name为where条件时,我们可以用到索引EXPLAINSELECT*FROMemployeesWHEREname='LiLei';2.当我们在执行sql语句:以age为where条件时,索引就会失效......
  • 一个用于强化学习的卷积神经网络基础结构示例
    classGomokuNet(nn.Module):def__init__(self,input_dim,action_space):super(GomokuNet,self).__init__()#定义网络层self.conv1=nn.Conv2d(1,32,kernel_size=3,padding=1)self.conv2=nn.Conv2d(32,64,kerne......
  • 第一章TypeScript初始化和基础类型
    初始化1.安装node和typescript1.1node安装 Node.js(nodejs.org)Node.js下载安装及环境配置教程【超详细】_nodejs下载-CSDN博客1.2typescript安装npminstalltypescript-g安装完成后初始化文件,就会有package.json文件npminit然后再初始化tstsconfig.jsonts......