搭建项目Sentinel官方参考文档:https://sentinelguard.io/zh-cn/docs/quick-start.html
注意: 这里我们使用到了Nacos,不会Nacos的小伙伴,可以看我之前的文章,里面有详细的介绍,其实只需要你启动一个端口为8848的Nacos就行
导入依赖:
<!-- Nacos客户端依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- sentinel依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
配置属性:
server:port: 8006spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:#配置Sentinel地址,就是我们的WEB界面dashboard: localhost:8080#Sentinel配置默认8719端口,被占用端口会自动从+1 , 直到找到未被占用的端口port: 8719management:endpoints:web:exposure:include: '*'
测试类:
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestControllerpublic class TestController {@GetMapping("/playA")public String playA() {return "hello my name is playA ,wo shi boy";}@GetMapping("/playB")public String playB(){return "hi my name is playB , me girl";}}
最后在我们的启动类上加上 :@EnableDiscoveryClient,点击启动,然后我们来访问我们的测试地址:
http://localhost:8006/playA
http://localhost:8006/playB
访问之后,我们就能在Sentinel上看到我们的监控信息了,如下所示:
文章插图
Sentinel 流控规则首先我们先来看一张图:
文章插图
上面这张图,就包含了 , 我们要讲解的全部内容,主要分为以下几点:
资源名:流控规则中唯一的名称,默认为我们的请求路径
针对来源:Sentinel 对调用者进行限流 , 填写我们的微服务名,默认为default , 对来源不进行区分
阈值类型/单机阈值:
QPS(每秒请求数量),使用该类型时,QPS达到我们设置的单机阈值,进行限流线程数:当使用该类型时,线程数量达到我们设置的单机阈值,进行限流是否集群:默认否,如果是集群勾选
流控模式:
直接:API达到限流条件时,直接限流,如果我们设置QPS为1 , 如果大于这个数量,直接返回错误关联:当关联的资源达到阈值时 , 限流自己,比如A调用B,B达到了阈值,A进行限流链路:只记录链路上的流量,指定对应的链路路径,从入口开始,如果达到阈值,则进行限流
流控效果:
快速失败:直接抛异常Warm Up:根据冷加载因子codeFactor经过预热时长,才达到设置的QPS阈值排队等待:匀速排队,让请求以匀速速度进行请求 , 阈值类型 , 需要设置为QPS,否则无效
我们先来新增一个流控规则看一下,操作方式有两种
在流控规则中添加在簇点链路中添加
因为方便,我们一般会选择在簇点链路中添加,我们先来试一下QPS的操作:
文章插图
文章插图
这里我们设置单机阈值为1,所以
playA
这个接口一秒中只能被访问一次,如果超过 , 则进行限流操作进行一个阻塞操作,这个效果我们是可以直接看到的,当我们不停的刷新playA
时 , 就会现在如下信息,而没有设置的playB
,则不会文章插图
在这里我们如果设置为线程数会怎么样呢?我们来看一下 。
在这里我们要注意:如果项目重新启动,需要将修改后的
playA
,重新访问后重新,添加流控规则文章插图
同时我们需要在代码中设置延时执行,如果处理太快 , 我们是看不到实际效果的,如果有兴趣的小伙伴可以自己启动线程去跑 , 在这里我们设置
playA
,进行一秒钟的延时操作,@GetMapping("/playA")public String playA() {try {//阻塞1 秒TimeUnit.MILLISECONDS.sleep(1000);}catch (Exception e){e.printStackTrace();}return "hello my name is playA ,wo shi boy";}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 召唤与合成2公测白嫖钻石怎么获得
- 原神游港聚珍活动内容地址介绍
- 三国志战略版黑科技吕布阵容搭配介绍
- 故事 --- Linux和UNIX之间的那些爱恨与情仇
- DevOps|1024程序员节怎么做?介绍下我的思路
- 召唤与合成2燃灯人格对应几号答案是什么
- 黑猫奇闻社奇妙社区推理结论该如何选择具体介绍
- 金铲铲之战冒险霞阵容搭配具体介绍
- 英雄联盟手游10月全场半价活动内容介绍
- 盾之勇者成名录角色实力排行介绍