高并发下限流(学习笔记)

  为了解决高并发下,服务的可用,缓存,降级,限流。

  那么我们来看看限流。最简单的限流方式,就是这个接口只处理一定的个数的请求,比如只处理10个请求,那么直接就可以算出,计数限流方式。

  创建spring  boot 应用。

  

<dependencies>
       
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>

  计算器实现的方式

@RestController
public class OrderController {
    static  long limit=10;
    private long count = 0;
    @GetMapping("/makeorder")
    public Result makeOrder(){
        long c = ++count;
        if(c > limit){

            Result result=new Result(false,"抢购结束");
            return result;
        }
        return new Result(true,"成功");
    }

}

我们可以用jmeter 来请求下,

 只处理10个请求,那么多余10个的请求,就应该返回false

 我们可以看到前几个是成功,最后一个是失败。

 这样来说 相当于一共就是10个请求,不管是那个ip 来请求,一共就接受来10个,这样的问题也会出现的。在分布式部署的情况下,计数是单独的,我们要共享这个计数,我们选择redis ,因为redis 是单线程的。

支持缓存过期,支持数值自增减
支持lua脚本,单线程处理缓存业务

 那么我门来看下代码怎么实现,增加需要的依赖包

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

代码开发如下

@Autowired
    private RedisTemplate redisTemplate;
    static long limit = 10;
    @GetMapping("/makeorder2")
    public Result makeOrder(){
        long c = redisTemplate.opsForValue().increment("lishi");
            if(c > limit){
                return new Result(false,"抢购失败");   }
            return    new Result(true,"抢购成功"+c);
      }

需要配置下redis 相关的内容

 spring: 
       redis:
          host: localhost
          port: 6379
          timeout: 1000
          jedis:
             pool:
               max-active: 10
               max-wait: 2000
               max-idle: 10
               min-idle: 5

我们来测试下,为来方便我们的测试呢,我门在启动来两个服务,

 我们可以用浏览器去请求下

 

 我们在看下redis里面是存储的数据

 那么我们这个时候再去请求下,看是否限可以成功

 

这样一个简易的限流都已经完成来,限流10个,就完成了。

原文地址:https://www.cnblogs.com/leiziv5/p/12714919.html