sentinel的官方文档:quick-start
demo搭建:
首先搭建一个springboot项目,springboot的版本号要和spring-cloud的对应,在pom.xml中引入sentinel相关jar(文章最后有代码链接)
<!-- 引入spring-cloud --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 引入spring-cloud sentinal --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.8.RELEASE</version> </dependency>
springboot版本我用的和sentinel一样的版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.8.RELEASE</version> <relativePath/> </parent>
然后在 application.properties 中设置端口和名称以及 映射到 控制台的地址:
spring.application.name=sentinel-test server.port=18083 spring.cloud.sentinel.transport.dashboard=localhost:8080
本地代码demo的目录及代码如下:
SentinelDemoApplication(默认的,不做修改): @SpringBootApplication public class SentinelDemoApplication { public static void main(String[] args) { SpringApplication.run(SentinelDemoApplication.class, args); } }
OrderController: @Controller @RequestMapping("/order") public class OrderController { //blockHandlerClass 和 blockHandler 设置被限流后 的处理方法和类,也可以不配置使用系统默认处理; @SentinelResource(value = "order_hello",blockHandler ="handleException",blockHandlerClass={ExceptionUtil.class}) @RequestMapping("/hello") @ResponseBody public String hello() throws InterruptedException{ System.out.println("接收到请求"); return "hello"; } }
ExceptionUtil: public class ExceptionUtil { public static String handleException(BlockException ex){ System.out.println("0ops:"+ex.getClass().getCanonicalName()); return "此方法被限流了"; } }
application.properties
spring.application.name=sentinel-test server.port=18083 spring.cloud.sentinel.transport.dashboard=localhost:8080
sentinel控制台:
1、下载 sentinel-dashboard.jar 后通过 cmd控制台 java -jar sentinel-dashboard.jar 运行
2、在这个jar包中指定了需要的jdk版本,在 META-INF\MANIFEST.MF 文件中,如果安装了多个jdk,可能启动报错,可以使用以下命令启动:
java --add-opens java.base/java.lang=ALL-UNNAMED -jar sentinel-dashboard.jar
3、打开sentinel控制台 http://localhost:8080, 首次打开sentinel控制台看不到任何内容,根据应用名搜索会出现相关的菜单,菜单出现后“新增流控规则”、“新增降级规则”等按钮是不可以点击的,访问一次本地方法http://localhost:18083/order/hello)后才可以点击
4、在 流控规则 中 新增流控规则,流控规则中的资源名要和 方法上 @SentinelResource 的值 或 方法请求路径一样,如以下方法的资源名是 order_hello 或 /order/hello,如果方法上没有@SentinelResource这个注解,则流控规则无效;
新增 流控规则 后(我是用QPS:每秒钟能访问的次数),然后多次在浏览器输入http://localhost:18083/order/hello ,连续刷新多次能看到拦截效果
流控规则:
阈值类型:
(1)、QPS:每秒钟可以访问的次数,每秒内的访问次数超过这个限制由blockHandlerClass 和 blockHandler 设置的方法和类处理
(2)、线程数:能同时允许访问的线程数量,超过这个数量 由blockHandlerClass 和 blockHandler 设置的方法和类处理
流控模式:
(1)、直接:这个比较好理解,也是默认的
(2)、关联:如下,当order_hello1被限流,执行 order_hello 也会被限流
(3)、链路:比如有三个服务A、B、C,A和B都调用C,此时资源名配置C在链路的入口资源中配置 /A,此时只会对A调用C这个链路限流
流控方式:
(1)、快速失败:默认的,当达到阈值时 由blockHandlerClass 和 blockHandler 设置的方法和类处理
(2)、Warm Up:刚开始阈值是 单机阈值/3(3是默认值),也就是(10/3),逐渐增加为10;
系统刚启动时阈值比较小,如果系统启动后一直没有请求则阈值就不会增大,否则随着时间的推移阈值逐渐达到设定的阈值;
(3)、排队等待:多个请求同时到来,按照一秒一个请求的速度发到服务端
降级规则:
降级的阈值类型有两个类型:RT 和 异常比例
(1)、RT(响应时间):在过去的五次请求的平均响应时间大于100毫秒,就会触发降级,5秒后恢复正常,
(2)、异常比例: 当资源的每秒请求量 >= 5;并且每秒异常总数占通过量的比值超过阈值、则会触发降级,异常比例的值是 0.0 到 1.0 之间
异常处理:超出流控和降级的阈值都是blockHandlerClass 和 blockHandler 设置的方法和类处理的,也就是ExceptionUtil 的handleException方法,可以根据异常来区分
限流的异常是: com.alibaba.csp.sentinel.slots.block.flow.FlowException
降级的异常是:com.alibaba.csp.sentinel.slots.block.degrade.DegradeException
实时监控:
可以看到请求成功(p_qps)和失败(b_qps)数:
demo和 sentinel-dashboard.jar 存放在网盘:
链接:https://pan.baidu.com/s/1eRSZ1rCg5ctA8RB4wl7z7w?pwd=8yb2
提取码:8yb2