1.下载alibaba-sentinel的jar包
https://github.com/alibaba/Sentinel/releases
2.打开sentinel
java -jar sentinel-dashboard-1.8.4.jar --server.port=8082
进入浏览器输入localhost:8082进入sentinel的可视化页面
默认的账号密码都是 sentinel
3.起一个springboot项目引入sentinel的maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
4.修改application.yml文件
server:
port: 8080
servlet:
context-path: /digua
spring:
application:
name: digua
cloud:
sentinel:
eager: true #取消sentinel懒加载
transport:
dashboard: 127.0.0.1:8082 #启动的sentinel的地址和端口
5.设置限流
5.1 项目起来后调用一下接口,在去sentinel dashboard里边查看,就可以看到刚才调用的接口信息
5.2 点击流控 设置QPS阈值
正常情况下的请求结果
超过阈值后的请求结果
6.令牌桶限流
6.1 引入redis的maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.6.6</version>
</dependency>
6.2 增加config配置
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(RedisSerializer.string());
return redisTemplate;
}
}
6.3 设置定时任务以固定时间增加令牌桶数量,decr接口是处理业务消费令牌的
@Slf4j
@EnableScheduling
@RestController
public class RedisController {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@GetMapping("/decr")
public void decr(){
Object list = redisTemplate.opsForList().leftPop("list");
if(list == null){
log.info("系统繁忙,请稍后重试!");
return;
}
log.info("可以进入处理业务 {}",list);
}
@Scheduled(cron = "1/5 * * * * ?")
public void incr(){
Long list = redisTemplate.opsForList().size("list");
log.info("令牌桶数量为 :{}",list);
if (list == null || list < 20) {
for (int i = 0; i < 10; i++) {
redisTemplate.opsForList().leftPush("list", UUID.randomUUID().toString());
}
}
}
}