前言
上一节我们讲了Sentinel的简介和与Hystrix的对比,本节我们讲解Sentinel的具体使用。
前期准备
- 加入pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
- 修改Nacos的yml配置
sentinel:
transport:
dashboard: localhost:8081
port: 8719
- 启动Sentinel
@echo off
java -Dserver.port=8081 -Dsentinel.dashboard.auth.username=Bifang -Dsentinel.dashboard.auth.password=Bifang -jar sentinel-dashboard-1.7.2.jar
@echo on
4. 启动pay服务
实现流控规则
刚才访问了http://127.0.0.1:9003/OrderPay后,sentinel面板中就出现了服务。
添加流控规则
各项功能参数讲解
添加测试
测试
可以发现当点击速度过快后就能发现返回了默认值,禁止了访问。
其他的功能可根据功能讲解图的提示,来体验一下效果
实现降级规则
各参数讲解图
RT规则编码测试
- 给接口加上等待时间,模拟业务处理时间
@GetMapping("/testD")
public String testD() {
{
try {
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
log.info("testD 测试RT"); return "------testD"; } ;
}
- 设置降级规则
- jmeter工具测试
其他的规则请自行测试
热点规则
根据接口传递的参数限流。
- 代码
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey") public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2)
{
return "------testHotKey";
}
//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){ return "deal_testHotKey";
}
- 配置规则
访问接口测试效果。
系统规则
系统规则只是将限流规则提升到了整个服务层面,配置基本没变,只是对整个系统请求起作用,如QPS限制设置为1,则所有接口超过限制都无法访问。
授权规则
设置调用方调用服务的白名单和黑名单,白名单调用发可不被流控规则限制。
集群流控
为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台)。这时候我们很自然地就想到,找一个 server 来专门来统计总的调用量,其它的实例都与这台 server 通信来判断是否可以调用。这就是最基础的集群流控的方式。
另外集群流控还可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为 10 QPS,理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。
集群流控中共有两种身份:
Token Client:集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流。
Token Server:即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。