SpringCloud第十八章AlibabaSentinel实现熔断与限流(@SentinelResource)

8、@SentinelResource

8.1、按资源名称限流+后续处理

  • 启动Nacos成功 http://localhost:8848/nacos/#/login

  • 启动Sentinel成功 java -jar sentinel-dashboard-1.7.0.jar

  • Module

    • cloudalibaba-sentinel-service8401

    • POM

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <parent>
              <artifactId>mscloud03</artifactId>
              <groupId>com.atguigu.springcloud</groupId>
              <version>1.0-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
      
          <artifactId>cloudalibaba-sentinel-service8401</artifactId>
            <dependencies>
            <!--SpringCloud ailibaba nacos -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
                <groupId>com.atguigu.springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
            <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
            </dependency>
            <!--SpringCloud ailibaba sentinel -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
            <!--openfeign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <!-- SpringBoot整合Web组件+actuator -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--日常通用jar包配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>4.6.3</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
      
        </dependencies>
      </project>
      
    • YML

      server:
       port: 8401
      
      spring:
        application:
          name: cloudalibaba-sentinel-service
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #Nacos服务注册中心地址
          sentinel:
            transport:
              dashboard: localhost:8080 #配置Sentinel dashboard地址
              port: 8719
      
      management:
        endpoints:
          web:
            exposure:
              include: '*'
      
      
    • 业务类RateLimitController

      package com.atguigu.springcloud.alibaba.controller;
      
      import com.alibaba.csp.sentinel.annotation.SentinelResource;
      import com.alibaba.csp.sentinel.slots.block.BlockException;
      import com.atguigu.springcloud.entities.CommonResult;
      import com.atguigu.springcloud.entities.Payment;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
      
        @RestController
        public class RateLimitController
        {
            @GetMapping("/byResource")
            @SentinelResource(value = "byResource",blockHandler = "handleException")
            public CommonResult byResource()
            {
                return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
            }
            public CommonResult handleException(BlockException exception)
            {
                return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
            }
        }
      
      • 主启动
     package com.atguigu.springcloud.alibaba;
     
       import org.springframework.boot.SpringApplication;
       import org.springframework.boot.autoconfigure.SpringBootApplication;
       import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
       import org.springframework.cloud.openfeign.EnableFeignClients;
     
     
       @EnableDiscoveryClient
       @SpringBootApplication
       public class MainApp8401
       {
           public static void main(String[] args) {
               SpringApplication.run(MainApp8401.class, args);
           }
       }
     
    
  • 配置流控规则

    • 配置步骤

      在这里插入图片描述

    • 图形配置和代码关系

      在这里插入图片描述

    • 表示1秒钟内查询次数大于1,就跑到我们自定义的处流,限流

  • 测试

    • 1秒钟点击1下,OK

    • 超过上述,疯狂点击,返回了自己定义的限流处理信息,限流发生

      在这里插入图片描述

  • 额外问题

    • 此时关闭问服务8401看看
    • Sentinel控制台,流控规则消失了?????
      • 临时/持久?

8.2、按照Url地址限流+后续处理

  • 通过访问的URL来限流,会返回Sentinel自带默认的限流处理信息

  • 业务类RateLimitController

    package com.atguigu.springcloud.alibaba.controller;
    
    import com.alibaba.csp.sentinel.annotation.SentinelResource;
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    import com.atguigu.springcloud.entities.CommonResult;
    import com.atguigu.springcloud.entities.Payment;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class RateLimitController
    {
        @GetMapping("/byResource")
        @SentinelResource(value = "byResource",blockHandler = "handleException")
        public CommonResult byResource()
        {
            return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
        }
        public CommonResult handleException(BlockException exception)
        {
            return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
        }
    
        @GetMapping("/rateLimit/byUrl")
        @SentinelResource(value = "byUrl")
        public CommonResult byUrl()
        {
            return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));
        }
    }
     
    
  • 访问一次 http://localhost:8401/rateLimit/byUrl

  • Sentinel控制台配置

    在这里插入图片描述

  • 测试

    • 疯狂点击http://localhost:8401/rateLimit/byUrl

    • 结果

      会返回Sentinel自带的限流处理结果

      在这里插入图片描述

8.3、上面兜底方案面临的问题

  • 系统默认的,没有体现我们自己的业务要求。
  • 依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观。
  • 每个业务方法都添加一个兜底的,那代码膨胀加剧。
  • 全局统一的处理方法没有体现。

8.4、客户自定义限流处理逻辑

  • 创建CustomerBlockHandler类用于自定义限流处理逻辑

  • 自定义限流处理类

    CustomerBlockHandler

    package com.atguigu.springcloud.alibaba.myhandler;
    
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    import com.atguigu.springcloud.alibaba.entities.CommonResult;
    import org.springframework.stereotype.Component;
    
    
    public class CustomerBlockHandler
    {
        public static CommonResult handleException(BlockException exception){
            return new CommonResult(2020,"自定义的限流处理信息......CustomerBlockHandler");
        }
    }
     
    
  • RateLimitController

    package com.atguigu.springcloud.alibaba.controller;
    
    import com.alibaba.csp.sentinel.annotation.SentinelResource;
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    import com.atguigu.springcloud.alibaba.myhandler.CustomerBlockHandler;
    import com.atguigu.springcloud.entities.CommonResult;
    import com.atguigu.springcloud.entities.Payment;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    public class RateLimitController
    {
        @GetMapping("/byResource")
        @SentinelResource(value = "byResource",blockHandler = "handleException")
        public CommonResult byResource()
        {
            return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
        }
        public CommonResult handleException(BlockException exception)
        {
            return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
        }
    
        @GetMapping("/rateLimit/byUrl")
        @SentinelResource(value = "byUrl")
        public CommonResult byUrl()
        {
            return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));
        }
    
        /**
         * 自定义通用的限流处理逻辑,
         blockHandlerClass = CustomerBlockHandler.class
         blockHandler = handleException2
         上述配置:找CustomerBlockHandler类里的handleException2方法进行兜底处理
         */
        /**
         * 自定义通用的限流处理逻辑
         */
        @GetMapping("/rateLimit/customerBlockHandler")
        @SentinelResource(value = "customerBlockHandler",
                blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException2")
        public CommonResult customerBlockHandler()
        {
            return new CommonResult(200,"按客户自定义限流处理逻辑");
        }
    
    }
     
    
  • 启动微服务后先调用一次

    http://localhost:8401/rateLimit/customerBlockHandler

  • Sentinel控制台配置

    在这里插入图片描述

  • 测试后我们自定义的出来了

  • 进一步说明

    在这里插入图片描述

8.5、更多注解属性说明

在这里插入图片描述

  • 多说一句

    在这里插入图片描述

  • Sentinel主要有三个核心Api

    • SphU定义资源
    • Tracer定义统计
    • ContextUtil定义了上下文
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值