Sentinel 入门
参考《Spring Cloud Alibaba 微服务原理与实战》
服务限流的作用
限流的主要目的时通过限制并发访问数或者显示一个时间窗口内允许处理的请求数量来保护系统,一旦到达限制数量则对当前请求进行相应的拒绝策略,比如:跳转到错误页面、计入排队系统、降级等。
从本质上来说,限流的主要作用就是损失一部分用户的可用性,保证系统的存活。
常用的限流的方式
- Nginx层添加限流模块限制平均访问速度
- 通过数据库连接池、线程池大小,限制总的并发数
- 通过 redis 和 lua 脚本 实现限制接口的时间窗口内请求数量
计数器算法
在周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略。当进入下一个周期时进行访问次数清零
但是计数器算法会带来临界问题,如图 在 0:58 - 1:02 之间 跨越两个时间窗口 ,这段时间内的请求树最大值 允许小于等于200个,超出了设定的阈值
滑动窗口算法
为解决临界问题,引入了滑动窗口算法,滑动窗口时一种流量控制技术,在Tcp网络通信协议中,就采用了滑动窗口来解决往罗拥塞的情况。
滑动窗口的原理就是把固定窗口分割成多个时间窗口就,分别在每一个小时间窗口内记录访问次数。根据时间滑动将窗口向前滑动并删除国企的小时间窗口,最终只需要统计滑动窗口范围内的所有小时间窗口总的技术即可。
Sentinel就是采用滑动窗口来实现限流的
令牌桶限流算法
对于每一个请求,都需要从令牌桶中获取一个令牌,如果没有获取令牌,则需要触发限流策略。
系统会以一个恒定速度往固定容量的两派同中放令牌,如果此时有客户端亲贵过来,则需要先从令牌桶中拿到令牌以获得访问资格
漏桶限流算法
漏桶算法内部同样维护了一个容器,这个容器会议恒定速度注水,不管上面的水流速度多块,漏桶水利的流出速度使用保持不变,不管生产者的请求量有多发,消息的处理能力取决于消费者。
服务的熔断与降级
在微服务架构中 ,服务依赖的链路很长,在高并发场景下,这些依赖服务的稳定性对系统的影响非常打,当下游服务因为网络延迟或者请求超时等,就会导致当前请求阻塞。一但某个链路上被依赖的服务不可用,很可能出现请求堆积从而导致出现雪崩效应。
服务熔断是指当某个服务提供方无法正常提供服务,比如请求超时、服务异常等,为了防止整个系统出现雪崩效应,暂时将出现故障的接口隔离出来,断绝与外部接口的联系,当初发熔断之后,后续一段时间内该服务掉用者的请求都会直接失败,直到目标服务回复正常
服务降级一般是指在服务器压力剧增的时候,根据实际业务使用情况以及流量,对一些服务和页面有策略的不处理或者用一种简单的方式进行处理,从而释放服务器资源的资源以保证核心业务的正常高效运行。
服务降级常见方案
- 平均响应时间:对应时刻平均相应时间超过阈值,在接下来一个固定时间窗口内,对这个方法的访问都会自动熔断
- 异常比例: 当某个方法每秒调用所获的异常总数的比例超过设定的阈值时,该资源会自动进入降级状态,也就是在接下来的一个固定时间窗口中,对这个方法的调用都会自动返回
- 异常数量:和异常比例类似,当某个方法在指定时间窗口内获得的异常数量超过阈值时,会触发熔断。
服务降级和服务熔断区别
-
服务熔断是服务降级的一种特殊情况,他是防止服务雪崩而采取的措施。系统发生异常或者延迟或者流量太大,都会触发该服务的服务熔断措施,链路熔断,返回兜底方法。这是对局部的一种保险措施。
-
服务降级是对系统整体资源的合理分配。区分核心服务和非核心服务。对某个服务的访问延迟时间、异常等情况做出预估并给出兜底方法。这是一种全局性的考量,对系统整体负荷进行管理。
限流:限制并发的请求访问量,超过阈值则拒绝;
降级:服务分优先级,牺牲非核心服务(不可用),保证核心服务稳定;从整体负荷考虑;
熔断:依赖的下游服务故障触发熔断,避免引发本系统崩溃;系统自动执行和恢复
Sentinel (分布式限流框架)
Sentinel 是一个面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、服务降级、系统负载保护扽多个角度来帮助我们保障微服务的稳定性
Sentinel 的特性
-
丰富的应用场景: 几乎涵盖所有应用场景,例如秒杀、消息削峰天谷、集群流量控制等
-
实时监控 : Sentinel 提供了实时监控功能,开发者可以在控制台中看到接入应用的单机机器秒级数据
-
广泛的开源生态 :Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
-
SPI扩展点支持: Sentinel 提供了SPI扩展点支持,可以通过扩展点来定制化限流规则,动态数据源适配等需求
Sentinel 组成
- 核心库(java 客户端):能在多有java环境运行
- 控制台 (Dashboard): 基于spring boot 开发,打包直接运行
Sentinel 部署
- 下载Release页面下已经构件好的Jar 下载地址
- java -jar 直接运行
- 访问 http://127.0.0.1:8858/#/dashboard
Sentinel 基本使用
使用Sentinel 核心库实现限流 主要分为以下几个步骤
- 定义资源
- 定义限流规则
- 检验规则是否生效
-
在项目中引入 Sentinel 核心库
<!-- SpringCloud Alibaba Sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
定义资源
创建一个接口@SentinelResource(value = "test",blockHandler = "handlerExcption1") @GetMapping() public Map<String,String> testSentinel(String name) throws InterruptedException { TimeUnit.SECONDS.sleep(2); HashMap<String, String> objectObjectHashMap = new HashMap<>(); objectObjectHashMap.put("msg",name); return objectObjectHashMap; } public static Map<String,String> handlerExcption1(String name,BlockException exception){ HashMap<String, String> objectObjectHashMap = new HashMap<>(); objectObjectHashMap.put("msg","禁止访问"); return objectObjectHashMap; }
-
增加如下配置
spring: cloud: sentinel: # 取消控制台懒加载 eager: true transport: # 控制台地址 dashboard: 127.0.0.1:8858 # 开启所有端点允许HTTP查看 management: endpoints: web: exposure: include: "*"
-
在sentinel增加如下配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/9eedcbba75a0402cb7e42ed463d7e432.png -
启动项目 使用压测工具测试
正常返回
限流返回
今天肝不动了,明天再肝