一个人可以走的很快,一群人可以走的很远
点赞➕评论➕收藏 ➕关注== 养成习惯(一键四连)
欢迎关注一起学习一起讨论⭐️一起进步
作者水平有限,欢迎各位大佬指点,相互学习进步!
本篇主要介绍Sentinel如何实现Spring Cloud应用的限流操作。
官网:https://sentinelguard.io/zh-cn/
通过代码来限流
org.springframework.boot
spring-boot-starter-parent
2.4.5
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
2021.1
3.创建一个REST接口,并通过@SentinelResource配置限流保护资源
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SentinelController {
@SentinelResource(value = "sentinel",blockHandler = "exceptionHandler")
@GetMapping("/sentinel")
public String sentinel(){
return "sentinel";
}
public String exceptionHandler(BlockException e ){
return "请求过于频繁";
}
}
在上面代码中,配置限流资源有几种情况:
● Sentinel starter在默认情况下会为所有HTTP服务提供限流埋点,所以如果只想对HTTP服务进行限流,只需要添加依赖即可。
● 如果想要对特定的方法进行限流或者降级,则需要通过@SentinelResource注解来实现限流资源的定义
● 可以通过SphU.entry()方法来配置资源。
4.手动配置流控规则,可以借助Sentinel的InitFunc SPI扩展接口来实现,只需要实现自己的InitFunc接口,并在init方法中编写规则加载的逻辑即可。
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import java.util.ArrayList;
import java.util.List;
public class FlowRuleInitFunc implements InitFunc {
@Override
public void init() throws Exception {
List rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setCount(1);
rule.setResource("sentinel");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitApp("default");
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
SPI是扩展点机制,如果需要被Sentinel加载,那么还要在resource目录下创建META-INF/services/com.alibaba.csp.sentinel.init.InitFunc文件,文件内容就是自定义扩展点的全路径
com.sentinel.springcloud.demo.FlowRuleInitFunc
按照上述配置好之后,在初次访问任意资源的时候,Sentinel就会自动加载getIpInfo资源的流控规则。
6.启动服务后,访问http://localhost:8881/sentinel方法,当访问频率超过设定阈值的时候,就会触发限流。
上述配置过程是基于手动配置来加载流控规则的,还有一种方式就是通过Sentinel Dashboard来进行配置。
基于Sentinel Dashboard来实现流控配置
启动:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
基于Sentinel Dashboard来配置流控规则,可以实现流控规则的动态配置,执行步骤如下:
1、启动Sentinel Dashboard
2、添加配置
server.port=8882
spring.application.name=sentinel-spring-cloud-demo
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.eager=true
spring.cloud.sentinel.transport.dashboard指向的是Sentinel Dashboard的服务器地址,可以实现流控数据的监控和流控规则的分发。
3、提供一个REST接口:
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SentinelController {
@SentinelResource(value = "sentinel",blockHandler = "requestTooFast")
@GetMapping("/sentinel")
public String sentinel(){
return "sentinel";
}
public String requestTooFast(BlockException e){
return "请求太频繁了。。。。";
}
}
此处不需要添加任何资源埋点,在默认情况下Sentinel Starter会对所有HTTP请求进行限流。
启动服务后,此时访问http://localhost:8882/sentinel,不存在任何限流行为。
至此,Spring Cloud集成Sentinel的配置就完成了,接下来就可以进入Sentinel Dashboard去实现限流规则的配置。
● 访问local host:8080进入Sentinel Dashboard。
● 进入spring.application.name对应的菜单,访问“簇点链路”,如下图所示,在该列表下可以看到/dash这个REST接口的资源名称。
针对/sentinel这个资源,点击最右边的操作栏中的“流控”按钮设置流控规则,如下图所示:
新增规则中的所有配置信息,实际就是FlowRule中对应的属性配置。
新增完成后,再次访问http://localhost:8882/sentinel,当超过设置的阈值的时候,就可以看到限流的效果,并获得如下输出: