前言:自己在学习过程的记录,借鉴别人文章,记录自己实现的步骤。
借鉴文章:https://blog.csdn.net/u014494148/article/details/105484410
Sentinel介绍
Sentinel诞生于阿里巴巴,其主要目标是流量控制和服务熔断。Sentinel是通过限制并发线程的数量(即信号隔离)来减少不稳定资源的影响,而不是使用线程池,省去了线程切换的性能开销。
当资源的响应时间变长时,线程将开始被占用。当线程数累积到一定数量时,新的传入请求将被拒绝。反之亦然,当资源恢复并变得稳定时,占用的线程也将被释放,新请求将被接受。
除了限制并发性外,Sentinel可以根据响应时间降级不稳定资源也是保证可靠性的有效方法。当资源的响应时间太大时,将在指定的时间窗口中拒绝所有对该资源的访问。-- 熔断机制
一、实现过程
1.下载sentinel-dashboard-1.6.0.jar 包
网盘分享链接:https://pan.baidu.com/s/1On073nCDJBpS2z4PvesR1Q 提取码:l5f1
2.输入下面命令,启动Sentinel
java -jar -Dserver.port=1111 sentinel-dashboard-1.6.0.jar
启动成功.png
3.访问http://localhost:1111 进入控制台,使用 sentinel/sentinel登录,进入控制台

4.user-server项目集成Sentinel
引入依赖
<!--引入Sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
bootstrap.yml加入配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:1111

5.对资源进行限流 代码里面有注释解释@SentinelResource的使用。

@RefreshScope //刷新配置
@RestController
public class UserController {
@Value("${server.port}")
private String port;
@Autowired
private IUserService userService;
/**
* 限流降级 这里通过@SentinelResource的value属性为资源取名为 “user” ,后续我们可以根据该资源名来进行限流。
* blockHandler指代限流降级方法,即当“user”资源触发限流了会调用blockHandler指向的降级方法返回拖地数据
* 注意;降级方法要和被限流的方法参数,返回值要一致,然后加上 BlockException异常对象。
* blockHandlerClass :指定限流的类 里面的限流方法需要static修饰
* @param id
* @return
*/
@SentinelResource(value="user",blockHandler="exceptionHandler",blockHandlerClass = ExceptionUtil.class)
@GetMapping("/user/{id}")
public User getById(@PathVariable Long id){
User id1 = userService.getOne(new QueryWrapper<User>().eq("id", id));
return id1;
}
/*//限流降级后返回
public User exceptionHandler(@PathVariable Long id,BlockException ex){
ex.printStackTrace();
return new User();
}*/
}
/**
* 限流类
* @author huangsong
* @date 2021/7/16 10:53
*/
public class ExceptionUtil {
//限流降级后返回
public static User exceptionHandler(@PathVariable Long id, BlockException ex){
ex.printStackTrace();
User user = new User();
user.setName("限流了");
return user;
}
}
6.先访问一次资源后,在Sentinel控制台有数据展示出来了,点击>>>>族点链路



生成了流控规则,资源名对应客户端 @SentinelResource(value="user".. 注解的资源,通过QPS限流(每秒请求数量),阈值是 1 ,意思是“user”这个资源每秒只能有1个请求进来,多余的请求会触发限流,返回降级数据。
测试结果

总结:还有很多种的流控模式,这里只是默认最简单的一种,如果大家有兴趣可以看我借鉴的文章,里面讲的很详细,我这里只做个自己学习的记录。
