为了解决高并发下,服务的可用,缓存,降级,限流。
那么我们来看看限流。最简单的限流方式,就是这个接口只处理一定的个数的请求,比如只处理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个,就完成了。