spring-cloud之sentinel入门

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 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值